Как вывести изображения из 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.