Условие вывода товаров в msProducts: если есть товары
При разработке интернет-магазина на MODX Revolution с компонентом miniShop2 часто возникает задача: выводить блок с товарами только при наличии результатов. Иначе страница будет показывать пустой контейнер, что ухудшает пользовательский опыт и SEO. Рассмотрим, как правильно написать условие для сниппета msProducts.
Базовая конструкция с чанком-обёрткой
Самый надёжный способ - использовать параметр &tplWrapper. Он позволяет задать чанк-обёртку, который отобразится только если есть хотя бы один товар. Внутри обёртки можно разместить разметку и плейсхолдер [[+output]] для списка.
[[!msProducts?
&parents=`[[*parent]]`
&depth=`0`
&tpl=`tpl.msProducts`
&tplWrapper=`tpl.wrapper`
&resources=`-[[*id]]`
&includeTVs=`1`
&includeContent=`1`
&sortby=`menuindex`
&sortdir=`ASC`
]]В чанке tpl.wrapper пропишите:
Наши товары
[[+output]]
Проверка через плейсхолдер результатов
Если нужно выполнить более сложную логику (например, показать альтернативный контент при отсутствии товаров), используйте сниппет pdoResources или проверку через [[*id]] с условием. Однако miniShop2 предоставляет встроенный плейсхолдер [[+total]], который содержит количество найденных товаров. В чанке-обёртке можно сделать проверку:
[[+total:gt=`0`:then=`
Товары ([[+total]] шт.)
[[+output]]
`:else=`Товары не найдены.
`]]Использование условного вывода с Fenom
В MODX 3 и при включённом парсере Fenom можно писать более гибкие условия прямо в шаблоне:
{if $_modx->getPlaceholder('total') > 0}
{$_modx->getPlaceholder('output')}
{else}
Нет товаров в данной категории.
{/if}Плейсхолдер total автоматически устанавливается сниппетом msProducts, если указан &tplWrapper.
Типичные ошибки и их решение
- Пустой блок отображается всегда - проверьте, что вы не забыли параметр
&tplWrapper. Без него сниппет выводит только пустую строку, но обёртка не создаётся. - Условие не срабатывает - убедитесь, что у товаров верно указан ресурс-родитель (
&parents) и они опубликованы. Используйте плейсхолдер[[+total]]для отладки. - Конфликт с кэшированием - для динамических страниц используйте некэшируемый вызов (
[[!msProducts]]).
Заключение
Чтобы вывести блок с товарами только при их наличии, используйте параметр &tplWrapper с чанком-обёрткой или проверку через плейсхолдер [[+total]]. Это улучшит юзабилити и SEO сайта. Применяйте Fenom для более гибких условий в MODX 3.