Олег Щавелев

Олег Щавелев

Был в сети 24 июня 2024, 15:51
Заказы принимаю
mngatoff
mngatoff
6
+7
достаточно триггернуть событие change на input:count, и запрос отправится стандартными средствами минишопа.

я вот так делаю (немного вырвано из контекста, но принцип ясен):
<script>
$(document)
    .on('click touchend', countButton, function (e) { // где countButton - кнопки плюс и минус
        e.preventDefault();
        var $container = $(this).closest('.ms2_form'),
        $count = $container.find('[name="count"]'),
        num = $count.val();
        if (isNaN(num) === false) { // страховочка от, например, пустого поля
            num = parseInt(num, 10);
            switch ($(this).data('ms2-count')) { // соответственно, у кнопок должен быть атрибут data-ms2-count="plus или minus"
                case 'plus':
                    num = num + 1;
                    $count.val(num);
                    break;
                case 'minus':
                    if (num <= 1) return;
                    num = num - 1;
                    $count.val(num);
                    break;
            }
        } else {
            return false;
        }
        $count.trigger('change'); // инициализируем отправку на сервер.
    })
    .on('change keypress keyup', '.ms2_form [name="count"]', function() {
        if ($(this).val().match(/\D/)) {
            this.value = $(this).val().replace(/\D/g,''); // следим на лету, чтобы в поле были только цифры
        }
        if (parseInt($(this).val(), 10) < 1) {
            this.value = 1; // следим на лету, чтобы в поле было не меньше единицы
        }
    });
</script>
Антон Тарасов
Антон Тарасов
1
+1
Можно удалить по шаблону… или просто все товары без разбора. Например, вот — по шаблону:
$template = 1; 
$resources = $modx->getCollection('modResource', array('template'=>$template));
foreach($resources as $resource) {  
    $resource->remove();
}
Это если подчистую удалять.
Андрей
Андрей
2
+1
Передавайте значение этого плейсхолдера в вызов mFilter2.

У mfilter есть параметр prepareSnippet, в нем указывается сниппет который будет обрабатывать результаты выборки.

код сниппета
$item = array_merge(
  (array) $row,
  array(
    'customData' => $modx->getOption('customData', $scriptProperties, '')
  )
);

return json_encode($item);

Теперь в вызове mfilter добавьте данные из плейсхолдера
'prepareSnippet' => 'название_сниппета',
'customData' => [
    'example' => $_modx->getPlaceholder('example')
]

Теперь в чанке c товаром будет доступен плейсхолдер {$customData.example}
Владимир
Владимир
1
0
Решил проблему, может кому пригодится. Все это работает под extends modObjectGetListProcessor, в методе prepareQueryBeforeCount

$c->leftJoin('ordersClientSender', 'Client');
$c->leftJoin('ordersSender', 'Sender', '`Client`.`sender` = `Sender`.`id`');
$c->select($this->modx->getSelectColumns($this->classKey, $this->classKey));;
$c->select(array(
    'senders' => 'GROUP_CONCAT(Sender.name)'
));
$c->groupby($this->classKey.'.name');
Александр
Александр
1
0
Для решения помог плагин:
<?php
switch ($modx->event->name) {
    case 'msOnChangeInCart':
        $tmp = $cart->get();
        $tmp[$key]['count'] = 1;
        $cart->set($tmp);
        break;
}
Вопрос, есть ли отличия в реализации: с помощью расширения обработчика корзины и плагина?
Вячеслав Варов
Вячеслав Варов
3
0
Вот рабочий пример
<div id="pdopage" class="catalog-line-core">
			{$_modx->runSnippet('!mSearch2', [
    				'returnIds' => 1, 
 				'limit' => 0,
    				'toPlaceholder' => 'result'
			])}
			{if $_modx->getPlaceholder('result')==''}
				По данному запросу ничего не найдено, попробуйте исправить запрос.
			{else}
				[[!pdoPage?
  					  &element=`msProducts`
  					  &parents=`0`
       					  &resources=`[[+result]]`
					  &limit=`9`
				]]
          </div>
			[[!+page.nav]]
{/if}