Как вывести поле content на странице с помощью msProducts в MODX
При работе с магазином на MODX Revolution и компонентом miniShop2 часто возникает задача отобразить содержимое поля content товара в результатах выборки сниппета msProducts. Стандартный вызов сниппета возвращает только базовые поля (pagetitle, introtext и т.д.), а для вывода полного описания требуется дополнительная настройка. В этой инструкции мы подробно разберём все способы и подводные камни.
Почему content не выводится по умолчанию?
Сниппет msProducts оптимизирован для быстрой работы и по умолчанию не подгружает тяжёлое поле content из таблицы modx_site_content. Это сделано для экономии памяти и ускорения выборки, особенно при большом количестве товаров. Чтобы включить вывод, нужно явно указать это в параметрах вызова.
Способы вывода content через msProducts
1. Использование параметра &includeTVs
Если поле content не является TV-параметром (а это стандартное поле ресурса), то &includeTVs=1 на него не повлияет. Этот параметр отвечает только за дополнительные переменные шаблона (TV). Для стандартного контента нужен другой подход.
2. Параметр &includeContent
В MODX 2.x и miniShop2 2.4+ добавлен специальный параметр &includeContent=1. Он заставляет сниппет подгружать поле content для каждого товара в выборке. Вызов будет выглядеть так:
[[!msProducts?
&parents=`17,50`
&limit=`0`
&depth=`10`
&includeThumbs=`360x400`
&includeTVs=`1`
&includeContent=`1`
&tpl=`tpl.msProducts`
&where=`{"Data.popular":"1"}`
]]После этого в чанке tpl.msProducts станет доступен плейсхолдер [[+content]].
3. Использование &innerJoin и &select
Если ваш MODX или miniShop2 не поддерживает &includeContent, можно добавить поле через кастомный &innerJoin и &select. Пример:
&innerJoin=`{"Content":{"class":"modResource","on":"msProducts.id = Content.id"}}`
&select=`{"msProducts":"*","Content":"content"}`Этот метод более гибкий, но требует понимания структуры таблиц MODX.
Типичные ошибки и их решение
- Пустой content даже с includeContent=1 - проверьте, что у товара заполнено поле «Содержимое» в админке, а не только «Краткое описание» (introtext).
- Сниппет не работает после обновления - очистите кэш MODX (Система → Очистить кэш) и проверьте версию miniShop2.
- Content выводится с HTML-тегами - используйте модификатор
:strip_tagsили:ntв чанке:[[+content:strip_tags]].
Альтернатива: вызов pdoResources
Если вам не нужны специфические товарные данные (цена, остатки), можно использовать более простой сниппет pdoResources из пакета pdoTools. Он умеет выводить content без дополнительных параметров:
[[!pdoResources?
&parents=`17,50`
&limit=`0`
&depth=`10`
&includeTVs=`1`
&tpl=`tpl.Products`
&where=`{"Data.popular":"1"}`
]]В этом случае в чанке будет доступен [[+content]] сразу.
Заключение
Для вывода поля content через msProducts в MODX используйте параметр &includeContent=1. Если он не работает - примените кастомный &innerJoin или переключитесь на pdoResources. Всегда проверяйте версию компонентов и очищайте кэш после изменений. Это позволит гибко управлять отображением описания товаров на страницах каталога.