Как вывести поле 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. Всегда проверяйте версию компонентов и очищайте кэш после изменений. Это позволит гибко управлять отображением описания товаров на страницах каталога.

    Часто задаваемые вопросы