Кровельный

Кровельный

С нами с 30 мая 2023; Место в рейтинге пользователей: #7219
R2m0x94 (Vasily)
22 июня 2024, 01:13
1
+1
/** @var $utm utmExample */
.htaccess
<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteCond %{QUERY_STRING} (^|&)^utm_source=yandex($|&)
    RewriteRule ^(.*)$ /$1?utm_source=chromium&utm_medium=cpc&utm_campaign=metrica [R=301,L]
</IfModule>
plugin:
<?php
if ($modx->event->name == 'OnHandleRequest') {
    if ($modx->context->get('key') == 'mgr') {return;}
    if (strpos($_SERVER['REQUEST_URI'], 'utm_source=chromium') !== false) {
        $_SESSION['utm_saved'] = '?utm_source=chromium&utm_medium=cpc&utm_campaign=metrica';
        return;
    } else {
        if (empty($_SESSION['utm_saved'])) {
            return;
        }
        if (!empty($_GET['utm_source'])) {
            return;
        }
        $modx->sendRedirect($modx->getOption('site_url').ltrim($_SERVER['REQUEST_URI'], '/').$_SESSION['utm_saved']);
    }
}
return;
R2m0x94 (Vasily)
20 июня 2024, 23:29
2
+1
Пока нет, но будут новости — сообщу! Спасибо за рабочий пример)
{'!mFilter2' | snippet  : [
    'leftJoin' => '{
        "cfFieldPrices" : {
            "class" : "cfField",
            "alias" : "cfFieldPrices",
            "on" : "cfFieldPrices.city_id = ' ~ $_modx->getPlaceholder('current_city.id') ~ ' AND cfFieldPrices.placeholder = CONCAT(\'[pre]\', msProduct.id, \'_price[/pre]\')"
        }
    }',
    'select' => '{ "msProduct" : "*", "cfFieldPrices" : "cfFieldPrices.value AS cfprice" }'
]}
Павел Романов
28 мая 2024, 12:22
2
+2
Сделайте сниппет getTags:
<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->get('id'));
$table = $modx->getOption('table_prefix').'ms2_products';
if($query = $modx->query("SELECT * FROM {$table} WHERE id = {$id}")){
	$prod = $query->fetch(PDO::FETCH_ASSOC);
	$tags = json_decode($prod['tags'], 1);
	foreach($tags as $tag){
	    $out .= $modx->getChunk($tpl, array('tag' =>  $tag));
	}
}
return $out;

Вызывайте:
[[getTags? &tpl=`tag_tpl`]]

Если не на странице товара, указывайте &id:
[[getTags? &id=`[[+id]]` &tpl=`tag_tpl`]]

Чанк tag_tpl:
<a href="/search/?[[+tag]]" class="some-class">[[+tag]]</a>
Кровельный
15 ноября 2023, 10:22
1
0
Возможно условие, как-то обвернуть?
&where=`[{"Data.id:NOT IN":["32"]}, {"Data.favorite":"1","OR:Data.new:=":"1"}]`
[[!msProducts?
	&parents=`2`
	&depth=`5`
	&limit=`10`
	&sortby=`{"publishedon":"DESC"}`
	&where=`{"Data.id:NOT IN":["32"],"Data.favorite":"1","OR:Data.new:=":"1"}`
	&tpl=`idx_new`
	&showLog=`1`
]]
Кровельный
25 июля 2023, 14:51
1
0
Как из свойств товара-ресурса записать в одну опцию товара?
Например если 2-3 значения, а 1 ключ, конечно можно использовать вариант в свойствах если там уже есть данные json, как многомерный массив, но мы сделаем тестовую опцию множественный выбор.
  1. Назовём опцию made_from
  2. Заведём в опцию значения (В настройках minishop2), чтобы получились значения:
    • Металла
    • Дерева

    • Вторсырья
    • Текстиля
    • Пластика

    * — не программно, вручную (если программно, то дописывайте код)
  3. Далее выполним:
    <?php
    $key = 'made_from'; // имя опции товара
    $resource = $modx->getObject('modResource', 44);
    $product = $modx->getObject('msProduct', $resource->id);
    //$arr = $resource->get('properties')['technicals']['Детали изготовлены из'];
    $arr = ['Пластика','Вторсырья'];
    $options = $product->loadData()->get('options');
    foreach ($arr as $k => $v) {
        $options[$key][$k] = $arr[$k];
    }
    $product->set('options', $options);
    $product->save();
  4. Готово. Теперь mFilter2 сможет фильтровать по опции. Если необходимо записать или обновить товары, то необходимо завернуть всё в getCollection
R2m0x94 (Vasily)
17 апреля 2022, 10:26
1
0
В сниппете mFilter2 раскомментируйте или добавьте строку на ~408, чтобы посмотреть в журнале ошибок — на какой странице проблема.
<?php
if (in_array($v['type'], array('number', 'decimal')) && isset($suggestions[$filter_key])) {
    $tmp = $suggestions[$filter_key];
    array_walk($tmp, function($v, $k) use (&$tmp) {
        if (empty($v)) {
            unset($tmp[$k]);
        }
    });
    $tmp = array_keys($tmp);
    if ($v['type'] == 'number') {
        $current_value = ($idx == 0)
            ? floor(min($tmp))
            : ceil(max($tmp));
            //$modx->log(modX::LOG_LEVEL_ERROR, 'PHP warning: min & max: [mSearch2] array("number", "decimal"): on "'.urldecode($_SERVER['REQUEST_URI']).'"');
    } else {
        $current_value = ($idx == 0)
            ? min($tmp)
            : max($tmp);
    }
}
Далее, проверьте в самом вызове сниппета параметр &suggestions — какой фильтр используется, потом перейдите в чанк с input type=[number] и добавьте к input атрибуты min=«0» и max=«1000», max можно не указывать. Надеюсь помог.
Андрей
27 января 2021, 22:49
1
0
а там где вываливается весь каталог, group содержит и цифры и буквы: Z2416
Да, действительно, у меня опция была числовая, потому не проверял с буквами. Сделай такой вывод, работает правильно:
{'!msProducts' | snippet : [
	'resources' => -$_modx->resource.id,
	'parents' => 35,
	'limit' => 10,
	'tpl' => 'tpl-shop-item-small',
	'innerJoin' => '{ "Options":{ "class":"msProductOption"}}',
	'groupby' => 'msProduct.id',
	'where' => ['Options.key' => 'group', 'AND:Options.value:=' => $_modx->resource.group.0]
]}
Mikhail Tyrsyna
25 сентября 2018, 17:10
1
+1
utils.js
Extras.combo.Field = function (config) {
    config = config || {};
    Ext.applyIf(config, {
        url: Extras.config.connector_url, 
        baseParams: {
            action: config.action,
        }, 
        name: 'repository', 
        fields: ['name'], 
        mode: 'remote', 
        displayField: 'name', 
        fieldLabel: _('Extras'),
        valueField: 'name', 
        editable: true, 
        anchor: '99%',
        allowBlank: false,
        autoLoad: false
    });
    Extras.combo.Field.superclass.constructor.call(this, config);
};
Ext.extend(Extras.combo.Field, MODx.combo.ComboBox);
Ext.reg('extras-combo-field', Extras.combo.Field);

Потом просто используешь свой xtype где тебе нужно
{
    xtype: 'extras-combo-field',
    action: 'mgr/load/getlist',
}

Процессор примерно такой
<?php
require_once MODX_CORE_PATH.'components/extras/processors/mgr/extras/getlist.class.php';

class ExtrasLoadFieldProcessor extends ExtrasFieldGetListProcessor {
    public $permission = '';

    public function prepareRow(xPDOObject $object)
    {
        $array = parent::prepareRow($object);
        $array['id'] = $array['name'];
        return $array;
    }

}

return 'ExtrasLoadFieldProcessor';
Михаил
18 июля 2018, 11:03
1
0
Все решилось гораздо проще. Пропустил решение, которое не раз обсуждалось, с помощью sendForward.

1. Плагин на OnPageNotFound:
<?php
if ($modx->event->name != 'OnPageNotFound') {return false;}
$alias = $modx->context->getOption('request_param_alias', 'q');
if (!isset($_REQUEST[$alias])) {return false;}
$request = $_REQUEST[$alias];
if (!$id_res = $modx->findResource($request, 'web')) return false;
$modx->sendForward($id_res);
exit();
2. Включить настройку allow_forward_across_contexts.
Василий Наумкин
26 января 2015, 22:03
6
0
$pdo = $modx->getService('pdoFetch');
$result = $pdo->getArray(
	// Класс
	'msProduct',
	// Условие where
	array(
		'deleted' => false,
		'published' => true,
	),
	// Параметры выборки
	array(
		'parents' => 5, // Категория с товарами
		'innerJoin' => array(
			'Data' => array('class' => 'msProductData')
		),
		'select' => array('Data' => 'price'),
		'sortby' => 'Data.price',
		'sortdir' => 'asc',
	)
);
if (!empty($result)) {
	echo $result['price'];
}
// При желании можно лог посмотреть
echo '<pre>';
print_r($modx->getPlaceholder('pdoTools.log'));