В данном уроке разберем документацию по сниппету msProducts (предназначен для для вывода товаров), который входит в состав MODX дополнения minishop2. Также разберем различные параметры выборок.
Документация по msProducts
Параметры сниппета
| Параметр | По умолчанию | Описание |
|---|---|---|
| tpl | tpl.msProducts.row | Чанк оформления для каждого результата |
| limit | 10 | Лимит выборки результатов |
| offset | Пропуск результатов с начала выборки | |
| depth | 10 | Глубина поиска товаров от каждого родителя. |
| sortby | id | Сортировка выборки. Для сортировки по полям товара нужно добавить префикс «Data.», например: «&sortby=`Data.price`» |
| sortbyOptions | Указывает по каким опциям и как сортировать среди перечисленного в &sortby. Передаются строкой, например, «optionkey:integer,optionkey2:datetime» | |
| sortdir | ASC | Направление сортировки |
| toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран. | |
| toSeparatePlaceholders | Если вы укажете слово в этом параметре, то ВСЕ результаты будут выставлены в разные плейсхолдеры, начинающиеся с этого слова и заканчивающиеся порядковым номером строки, от нуля. Например, указав в параметре «myPl», вы получите плейсхолдеры [[+myPl0]], [[+myPl1]] и т.д. | |
| parents | Список категорий, через запятую, для поиска результатов. По умолчанию выборка ограничена текущим родителем. Если поставить 0 — выборка не ограничивается. | |
| resources | Список товаров, через запятую, для вывода в результатах. Если id товара начинается с минуса, этот товар исключается из выборки. | |
| includeContent | Выбирать поле «content» у товаров. | |
| includeTVs | Список ТВ параметров для выборки, через запятую. Например: «action,time» дадут плейсхолдеры [[+action]] и [[+time]]. | |
| includeThumbs | Список размеров превьюшек для выборки, через запятую. Например: «120×90,360×240» дадут плейслолдеры [[+120×90]] и [[+360×240]]. Картинки должны быть заранее сгенерированы в галерее товара. | |
| optionFilters | Фильтры по опциям товаров. Передаются JSON строкой, например, {«optionkey:>»:10} | |
| where | Строка, закодированная в JSON, с дополнительными условиями выборки. | |
| link | Id связи товаров, который присваивается автоматически при создании новой связи в настройках. | |
| master | Id главного товара. Если указаны и «master» и «slave» — выборка пройдёт по master. | |
| slave | Id подчиненного товара. Если указан «master» — эта опция игнорируется. | |
| tvPrefix | Префикс для ТВ плейсхолдеров, например «tv.». По умолчанию параметр пуст. | |
| outputSeparator | \n | Необязательная строка для разделения результатов работы. |
| returnIds | Возвращать строку с id товаров, вместо оформленных чанков. | |
| showUnpublished | Показывать неопубликованные товары. | |
| showDeleted | Показывать удалённые товары. | |
| showHidden | 1 | Показывать товары, скрытые в меню. |
| showZeroPrice | 1 | Показывать товары с нулевой ценой. |
| wrapIfEmpty | 1 | Включает вывод чанка-обертки (tplWrapper) даже если результатов нет. |
| showLog | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекcте «mgr». |
Можно использовать и другие [mask_link href=»https://docs.modx.pro/komponentyi/pdotools/obshhie-parametryi» target=»_blank»]общие параметры pdoTools[/mask_link]
Особенности
Сниппет msProducts, как и все сниппеты miniShop2, использует pdoTools для работы. Поэтому все основные его параметры совпадают с pdoResources, но есть и особенности.
Поддержка мультикатегорий
Товар MS2 физически находится только в одной категории, однако, «виртуально» может находиться еще в нескольких разделах. msProducts это учитывает.
Получение картинок
Сниппет умеет выбирать картинки из галереи товара при помощи параметр &includeThumbs. Просто укажите список превьюшек через запятую:
[[!msProducts?
&parents=`0`
&includeThumbs=`120x90,360x270`
]]
и вы получите плейсхолдеры [[+120x90]] и [[+360x270]] в чанке.
Фильтрация по связям
Вы можете указывать параметр &link и требуемый &master или &slave, выбирая, таким образом, связанные товары:
[[!msProducts?
&parents=`0`
&link=`1`
&master=`15`
]]
Этот вызов получит все товары, которые связаны связью 1 с главным товаром 15.
Работа с опциями
msProducts автоматически подключает и выводи все опции товара в плейсхолдеры вида [[+ключ_опции]].
Специальный параметр &optionFilters подключает необходимые таблицы и дополняет параметр &where, позволяя фильтровать товары по их опциям.
[[!msProducts?
&parents=`0`
&optionFilters=`{"core_count:>":4}`
]]
Этот вызов выведет все товары, у которых есть опция core_count и она больше 4.
Для сортировки используется параметр &sortbyOptions. В нем через запятую указываются требуемые характеристики и их типы.
&sortbyOptions=`core_count:number`
&sortby=`{"pagetitle":"ASC", "core_count":"DESC"}`
Порядок сортировки указывается по аналогии параметру &sort.
Псевдонимы
Сниппет msProducts сразу присоединяет несколько связанных таблиц товара, позволяя вам получать данные из них без лишних запросов.
Основной класс — это , а остальные представлены ниже:
- msProduct — Основной класс выборки, наследник
modResource. - Data — Класс
msProductData. Здесь цена, артикул и прочие свойства товара - Vendor — Класс производителя товара
msVendor. Здесь его название, страна, логотип и т.д.
Плейсхолдеры
Вы можете увидеть все доступные плейсхолдеры товаров просто не указывая чанк оформления:
<pre>
[[!msProducts?
&parents=`0`
&tpl=``
]]
</pre>
Примеры из официальной документации
Вывод всех товаров из категории 15:
[[!msProducts?
&parents=`15`
]]
Вывод с постраничной разбивкой:
[[!pdoPage?
&element=`msProducts`
&parents=`15`
]]
[[!+page.nav]]
Вывод всех товаров дороже 1000 рублей:
[[!pdoPage?
&element=`msProducts`
&parents=`0`
&where=`{"Data.price:>":1000}`
]]
[[!+page.nav]]
Вывод товаров фирмы Sony:
[[!pdoPage?
&element=`msProducts`
&parents=`0`
&where=`{"Vendor.name":"Sony"}`
]]
[[!+page.nav]]
Сортировка по артикулу:
[[!pdoPage?
&element=`msProducts`
&parents=`0`
&sortby=`Data.article`
&sortdir=`asc`
]]
[[!+page.nav]]
Примеры из разработки
Вывод товаров на главной странице по определенным критериям where
В рамках бесплатного курса по MODX + Fenom, я решил на главной вывести 12 карточек, которые в TV поле примечание (primechanie) содержат текст: «Первый займ без процентов». Для этого открыл шаблон главной страницы и в нужном месте вызвал msProducts со следующими параметрами:
{'!msProducts' | snippet : [
'tpl' => '@FILE chunks/shop/msProductsRow.tpl',
'includeTVs' => 'primechanie,name_company,partnerlink,litsenziya',
'tvPrefix' => '',
'sortdir' => 'ASC',
'limit' => '12',
'where' => ' { "primechanie:LIKE":"%Первый займ без процентов%" } '
]}
Где чанк msProductsRow.tpl содержит следующий код:
<div class="ms2_product col my-5 my-md-3">
<div class="card">
{if $primechanie?}
<div class="alert alert-primary mb-0">{$primechanie}</div>
{/if}
<div class="card-body">
<div class="row g-0">
<div class="col-md-3 col-6">
{if $thumb?}
<img class="img-fluid" src="{$thumb}" alt="{$pagetitle}">
{else}
<img class="img-fluid" src="template/img/nologo.png" alt="{$pagetitle}"/>
{/if}
</div>
<div class="col-md-9 col-6 text-center">
<p class="mb-1 fw-bold">{$name_company}</p>
<a class="btn btn-outline-secondary btn-sm" href="{$id | url}">Подробнее</a>
</div>
</div>
<hr>
<ul class="nav flex-column">
{'msProductOptions' | snippet : [ 'product' => $id, 'tpl' => '@FILE chunks/shop/msProductOptionsCat.tpl' ]}
</ul>
<p class="mt-2 mb-0"><a href="{$partnerlink}" class="btn btn-success w-100">Оформить</a></p>
<p class="mb-0 small text-center">Лицензия ЦБ РФ {$litsenziya}</p>
</div>
</div>
</div>
Примеры фильтров для вывода msProducts
Вывести товары с особой ценой
...
&where=`{"Data.old_price:!=":"0"}`
...
Вывести товары с отметкой Новый
...
&where=`{"Data.new":"1"}`
...
Вывести товары с отметкой Популярный
...
&where=`{"Data.popular":"1"}`
...
Вывести товары с отметкой Особый
...
&where=`{"Data.favorite":"1"}`
...

Нету ни одной статьи в сети про реализацию опций возможности пользовательского выбора и выдачи сортировки по выбору с фронта. В вашей статье затронуто на 50% понимание использования возможности опций. Может есть у вас статья про фильтрацию… Благодарю!
На текущий момент, нет. Пишу сейчас уроки закрытые, там будет подробно все расписано, а здесь не скоро скорее всего выложу)