Как вывести изображения из MSGallery в YML-фид для Яндекс.Маркета

    Создание YML-фида для Яндекс.Маркета на базе ModX - задача, с которой сталкиваются многие владельцы интернет-магазинов. Часто возникает проблема: товары выводятся, но изображения из компонента MSGallery не подгружаются. В этой статье разберём типичные ошибки и предложим рабочие решения для формирования корректного YML-выгрузки.

    Почему не работают стандартные методы вывода картинок?

    При попытке использовать msGallery напрямую в чанке YML-фида или перебор файлов через foreach возникает пустой результат. Основная причина - контекст выполнения. YML-фид генерируется как обычный ресурс ModX, а сниппет msGallery требует наличия полноценного окружения miniShop2, которое не всегда доступно при парсинге чанка через pdoResources. Кроме того, переменная $files не передаётся автоматически в чанк, если не указана в настройках вызова.

    Правильный способ: используем pdoResources с плейсхолдерами

    Надёжное решение - получать URL первого изображения прямо в вызове pdoResources через плейсхолдеры TV-поля. Для этого нужно создать TV-поле типа "msGallery" (например, images) и прикрепить его к нужным товарам. Затем в чанк YML-шаблона передаётся значение этого поля. Пример вызова:

    [[!pdoResources?
      &tpl=`yml_tpl`
      &parents=`15`
      &includeTVs=`images`
      &tvPrefix=``
    ]]

    В чанке yml_tpl используйте плейсхолдер [[+images]], который содержит JSON-массив с данными изображений. Для извлечения первого URL можно применить простой парсинг через pdoParse или написать небольшой сниппет.

    Пример рабочего сниппета для первого изображения

    Создайте сниппет getFirstImage с кодом:

    <?php
    $images = $input ? json_decode($input, true) : [];
    if (!empty($images[0]['url'])) {
        return $images[0]['url'];
    }
    return '';

    В чанке YML-шаблона вызывайте его так:

    <picture>[[+images:getFirstImage]]</picture>

    Это гарантирует, что в тег <picture> попадёт URL первой картинки из галереи. Если изображений нет, останется пустая строка - Яндекс.Маркет проигнорирует пустой элемент.

    Альтернатива: вывод через Fenom в чанке

    Если вы используете Fenom-шаблонизатор, можно обработать JSON прямо в чанке. Убедитесь, что в вызове pdoResources указан параметр &fenom=1. Пример чанка:

    <picture>
    {if $_modx->fromJSON([[+images]])[0]['url']?}
      {$_modx->fromJSON([[+images]])[0]['url']}
    {/if}
    </picture>

    Этот подход более гибкий, но требует включённого Fenom и может быть медленнее при большом количестве товаров.

    Проверка фида после исправления

    После внесения изменений обязательно проверьте YML-фид через Яндекс.Вебмастер или валидатор YML. Убедитесь, что тег <picture> содержит корректный URL (начинается с http/https) и ведёт на существующее изображение. Также проверьте, что в фиде нет лишних пробелов или переносов строк внутри тегов - это может нарушить структуру XML.

    Если после всех исправлений картинки по-прежнему не выводятся, проверьте права доступа к файлам изображений и настройки modx: возможно, включена защита от hotlink или неверно указан путь в настройках miniShop2.

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