03 ноября 2019, 10:31 Я использовал вывод опций через pdoResources, и это сработало [[!pdoResources? &tpl=`tpl.productOptions` &parents=`[[*parent]]` &class=`msProduct` &leftJoin=`{ "Options": { "class": "msProductOption", "on": "msProduct.id = Options.product_id" }, "captionOption": { "class": "msOption", "on": "Options.key = captionOption.key" } }` &select=`{ "Options": "key,value", "captionOption":"caption,measure_unit" }` &where=`["msProduct.id = [[*id]]"]` ]]а в чанке вывода используем переменные {$key} {$value} {$caption} {$measure_unit} Вопросы / msProductOptions глюк 3 0
27 октября 2019, 00:56 не правильно определялась модификация, разобрался Новые дополнения и их версии / [msOptionsPrice2] - Модификации продукта. 375 0
26 октября 2019, 22:18 Привет! У меня вопрос по отображению превью модификации товара в корзине, почему-то при выводе товаров через msCart $product.options.modification тут пусто, и модификация не отображается, с чем это может быть связанно? Новые дополнения и их версии / [msOptionsPrice2] - Модификации продукта. 375 0
29 апреля 2019, 17:27 Дополнил скрипт, теперь при создании опции с типом number скрипт распознает ее и вместо вывода чекбоксами будет выводить ее бегунками от — до:) можно расширить функционал как душе угодно я добавил в getms2options.class.php switch по типу опции где помимо number можно указать и другие типы и следовательно шаблоны к ним:) Шаг 3 заменил на это: <?php class customTvssComboGetMs2OptionsProcessor extends modObjectProcessor { public $classKey = 'msOption'; /** @var miniShop2 $ms2 */ protected $ms2; /** @var tvSuperSelect $tvss */ protected $tvss; /** * @return bool */ public function initialize() { $this->ms2 = $this->modx->getService('minishop2', 'miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/'); $this->tvss = $this->modx->getService('tvsuperselect', 'tvSuperSelect', $this->modx->getOption('tvsuperselect_core_path', null, MODX_CORE_PATH . 'components/tvsuperselect/') . 'model/tvsuperselect/'); return parent::initialize(); } /** * @return string */ public function process() { $query = trim($this->getProperty('query')); $limit = (int)$this->getProperty('limit', 0); $resource_id = (int)$this->getProperty('resource_id', 0); if (!$tv_id = (int)$this->getProperty('tv_id', 0)) { // } $q = $this->modx->newQuery($this->classKey); $q->select(array( "{$this->classKey}.key as `key`", "{$this->classKey}.caption as `caption`", "{$this->classKey}.type as `type`", )); if (!empty($query)) { $q->where(array( "{$this->classKey}.key:LIKE" => "%{$query}%", "OR:{$this->classKey}.caption:LIKE" => "%{$query}%" )); } $q->limit($limit); $q->sortby($this->classKey . '.key', 'ASC'); $rows = array(); if ($q->prepare() && $q->stmt->execute()) { if ($tmp = $q->stmt->fetchAll(PDO::FETCH_ASSOC)) { foreach ($tmp as $v) { switch ($v['type']) { case 'numberfield': $v['type'] = 'number'; break; default: $v['type'] = ''; break; } if ($v['type'] != '') { $rows[] = array( 'display' => '(' . $v['key'] . ') <b>' . $v['caption'] . '</b>', 'value' => $v['key'] . ':' . $v['type'], ); } else { $rows[] = array( 'display' => '(' . $v['key'] . ') <b>' . $v['caption'] . '</b>', 'value' => $v['key'], ); } } } } foreach ($rows as &$row) { if (empty($row['display'])) { $row['display'] = $row['value']; } } unset($row); return $this->outputArray($rows); } } return 'customTvssComboGetMs2OptionsProcessor'; Шаг 4 заменил на это: {var $filters = []} {* Мы можем указать свойства фильтра, которые отобразятся до опций, выбранных нами *} {var $filters[] = 'ms|vendor:vendors'} {var $filters[] = 'msop|price:number'} {* Магия *} {var $mfilter_options = $_modx->resource['mfilter_options']} {if !is_array($mfilter_options)} {var $mfilter_options = ($mfilter_options | fromJSON)} {/if} {if $mfilter_options is empty} {foreach $_modx->getParentIds($_modx->resource['id']) as $parent_id} {if $parent_id == 0} {continue} {/if} {var $mfilter_options = ($parent_id | resource : 'mfilter_options')} {if !is_array($mfilter_options) AND $mfilter_options?} {var $mfilter_options = ($mfilter_options | fromJSON)} {/if} {if $mfilter_options?} {break} {/if} {unset $mfilter_options} {/foreach} {/if} {if $mfilter_options?} {foreach $mfilter_options as $v} {var $filters[] = ('msoption|' ~ $v)} {/foreach} {/if} {* Все параметры mFilter2 указываем тут *} {var $options = [ 'element'=>'msProducts', 'parents'=> $_modx->resource.id, 'setTotal'=>'1', 'totalVar'=>'total', 'loadModels'=>'easycomm', 'includeTVs'=>'smallDescription', 'tplOuter'=>'tpl.catalogWrap', 'tpl'=>'catalog.Row', 'limit'=>'20', 'ajaxMode'=>'button', 'includeThumbs'=>'small', 'filterOptions'=>'{ "more_tpl":"<button class=\"standart-button align-center how-more-button btn_more btn w-button\">Показать ещё 20 товаров<\/button>" }', 'leftJoin'=>'{ "ecThread": { "class": "ecThread", "on": "msProduct.id = ecThread.resource" } }', 'aliases'=>' ms|price==price, resource|parent==parent, ms|vendor==vendor ', 'sortAliases'=>'{ "ecThread":"ecThread" }', 'sort'=>'ms|menuindex:asc', 'suggestionsRadio'=>'vendor:vendors', 'class'=>'msProduct', 'filters' => ($filters | join : ','), 'tplFilter.outer.msop|price'=>'tpl.mFilter2.filter.slider', 'tplFilter.row.msop|price'=>'tpl.mFilter2.filter.number', 'tplFilter.outer.vendor'=>'tpl.mfilter2.filter.select', 'tplFilter.row.vendor'=>'tpl.mfilter2.filter.option' ]} {var $tplFilters = []} {foreach $filters as $row} {if ':number' | in : $row} {* тут мы проверяем какого типа у нас опция *} {var $row = $row | replace : ":number" : ""} {* удалив название типа из строки формируем шаблоны для вывода *} {set $tplFilters['tplFilter.outer.' ~ $row] = 'tpl.mFilter2.filter.slider'} {set $tplFilters['tplFilter.row.' ~ $row] = 'tpl.mFilter2.filter.number'} {/if} {/foreach} {* Соединяем два массива - один с опциями mfilter2 другой c нашими шаблонами ОБЯЗАТЕЛЬНО должен быть включен параметр "использование PHP в FENOM, если кто знает как выполнить слияние двух массивов средствами Fenom иначе - поделитесь *} {set $options = array_merge($tplFilters, $options)} {* Вывод mFilter2 *} {'!mFilter2' | snippet : $options} Пошаговые инструкции / [tvSuperSelect] Кейс. Удобное указание опций для фильтрации в mFilter2 13 0
29 апреля 2019, 16:38 это можно сделать из админки и простому пользователю Пошаговые инструкции / [tvSuperSelect] Кейс. Удобное указание опций для фильтрации в mFilter2 13 0
29 апреля 2019, 16:37 получается не совсем универсально, ведь если появились опции новые пользователь не зайдет и не добавит сам шаблон Пошаговые инструкции / [tvSuperSelect] Кейс. Удобное указание опций для фильтрации в mFilter2 13 0
29 апреля 2019, 16:02 Сделал по интструкции но modx автоматически определяет фильтры как чекбоксы а надо бы слайдер и селекты такое уже не реализовать? Пошаговые инструкции / [tvSuperSelect] Кейс. Удобное указание опций для фильтрации в mFilter2 13 0
06 ноября 2018, 17:18 Чтобы simpleSearch искал по артикулу, необходимо его добавлять в таблицу modx_site_content, например задействать поле «Аннотация» для ключевых слов, туда вбивать артикул и другие параметры minishop2 необходимые для поиска Вопросы / miniShop2 и SimpleSearch 10 0
06 ноября 2018, 17:17 Чтобы simpleSearch искал по артикулу, необходимо его добавлять в таблицу modx_site_content, например задействать поле «Аннотация» для ключевых слов, туда вбивать артикул и другие параметры minishop2 необходимые для поиска Вопросы / Как реализовать поиск по артикулу, не покупая mSearch2? 3 0
08 октября 2018, 12:53 Владимир, можно подробнее как это работает? Я правильно понимаю что тут идет подмена полей мастера полями раба чтобы mfilter2 фильтровал по рабам а мастеров выводил всегда с различными полями? Вопросы / Фильтр связей по мастеру и характеристикам "раба" 3 0
07 октября 2018, 18:50 Проблема решена, все оказалось проще, нужно вместо innerJoin использовать leftJoin Вопросы / Присоединить подчиненный товар к основному 2 0
07 октября 2018, 18:06 У меня получилось объединить, НО теперь выводятся только Мастер товары, а нужно чтобы выводились все включая товары вообще без связи кроме подчиненных товаров [[!mfilter2? &element=`msProducts` &parents=`2` &loadModels=`easycomm` &tplOuter=`tpl.catalogWrap` &tpl=`catalog.Row` &limit=`20` &groupRows=`1` &aliases=` ms|price==price, resource|parent==parent, ms|vendor==vendor, msoption|space==space, msoption|width==width, msoption|power==power ` &ajaxMode=`button` &includeThumbs=`small` &filterOptions=`{ "more_tpl":"<button class=\"standart-button show-more-button btn_more btn w-button\">Показать ещё 20 товаров<\/button>" }` &showLog=`1` &leftJoin=`{ "ecThread": { "class": "ecThread", "on": "msProduct.id = ecThread.resource" }, "Link": { "class": "msProductLink", "on": "msProduct.id = Link.slave and Link.link = 5" } }` &innerJoin=`{ "msProductSlave": { "class":"msProductLink", "alias":"msProductSlave", "on":"msProduct.id = msProductSlave.master" } }` &sortAliases=`{ "ecThread":"ecThread" }` &sort=`ms|favorite:desc` &filters=` ms|vendor:vendors, ms|price:number, parent:categories, msoption|cable, msoption|space:number, msoption|width:number, msoption|power:number ` &suggestionsRadio=`vendor:vendors` &class=`msProduct` &select=`{ "Link": "slave", "msProduct": "*", "msProductSlave":"msProductSlave.slave as product_id" }` &where=`{ "Link.slave:IS": null }` &tplFilter.row.price=`tpl.mFilter2.filter.number` &tplFilter.outer.price=`tpl.mFilter2.filter.minMax` &tplFilter.row.width=`tpl.mFilter2.filter.number` &tplFilter.outer.width=`tpl.mFilter2.filter.minMax` &tplFilter.row.power=`tpl.mFilter2.filter.number` &tplFilter.outer.power=`tpl.mFilter2.filter.minMax` &tplFilter.row.space=`tpl.mFilter2.filter.number` &tplFilter.outer.space=`tpl.mFilter2.filter.minMax` &tplFilter.outer.vendor=`tpl.mfilter2.filter.select` &tplFilter.row.vendor=`tpl.mfilter2.filter.option` ]] Вопросы / Присоединить подчиненный товар к основному 2 0
25 сентября 2018, 22:20 да, суть в том чтобы это были разные товары, тоже хотел изначально опираясь на это расширение сделать но нет Вопросы / Как реализовать группировку товаров по значению опции или связи 8 0
25 сентября 2018, 18:37 надо попробовать, но как быть с товарами без групп Вопросы / Как реализовать группировку товаров по значению опции или связи 8 0
25 сентября 2018, 17:50 тут вся петрушка в том что выводятся все товары, последовательно, а должен только первый товар а остальные внутри него Вопросы / Как реализовать группировку товаров по значению опции или связи 8 0
20 сентября 2018, 18:20 Хорошо, в таком случае кто может сделать этот функционал за деньги и в какую сумму напишите в telegram Vyacheslav.y Вопросы / Принцип работы pdoPage 3 0
20 сентября 2018, 13:25 запустите перед всем этим сниппет через феном, результат впишите в переменную, полученные данные выведите в нужных местах используя ту самую переменную либо запустить сниппет и получить id ресурсов, сделать его рандомным любым желаемым способом, и ниже в двух сниппетах pdoResources использовать &resources=`переменная с id` тем самым вы «свяжете» два сниппета Я бы воспользовался первым вариантом Вопросы / Вывод карусели отзывов через pdoResources 2 +1
20 сентября 2018, 07:46 Как я понял этот параметр группирует в sql запросе ресурсы по определенному полю, и мне это не подходит, потому что: Группа может быть из 40 товаров а pdopage ограничение на 20 чтоит соответсвенно выведется только один сгруппированный товар, и то не полностью, поэтому я и вызываю внутри msproducts его ещё раз чтобы выбрать все ресурсы из группы сколько бы их небыло Вопросы / Принцип работы pdoPage 3 0
19 сентября 2018, 23:51 я как раз и делаю подобный функционал но столкнулся с проблемой пагинации коллекций Вопросы / Можно ли организовать коллекции в minishop2? 6 0
Возможно ли реализовать возможность предоплаты за доставку на сайте? Отлично, значит можно не создавать заказ пока оплата не пройдёт успешно, а поскольку класс-обработчик оплаты будет кастомный сможет сами решать какую стоимость пробрасывать. Ещё на...
Редизайн сообщества На мобилке шапка не помещается на 1 строке, плюс иконки растягиваются до овала из-за иконки, вместо того, чтобы оставаться круглыми
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Выпустил новую версию [1.0.3-beta1] — 2026-07-13 Fixed — Inject сохраняет ``, `` и `` на полном HTML-документе (больше не оборачивает страни...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены уведомления о заявках SendIt через hook-...
а в чанке вывода используем переменные {$key} {$value} {$caption} {$measure_unit}
Шаг 3 заменил на это:
Шаг 4 заменил на это:
Я правильно понимаю что тут идет подмена полей мастера полями раба чтобы mfilter2 фильтровал по рабам а мастеров выводил всегда с различными полями?
либо запустить сниппет и получить id ресурсов, сделать его рандомным любым желаемым способом, и ниже в двух сниппетах pdoResources использовать &resources=`переменная с id`
тем самым вы «свяжете» два сниппета
Я бы воспользовался первым вариантом
Группа может быть из 40 товаров а pdopage ограничение на 20 чтоит соответсвенно выведется только один сгруппированный товар, и то не полностью, поэтому я и вызываю внутри msproducts его ещё раз чтобы выбрать все ресурсы из группы сколько бы их небыло