Сниппет для дружбы CatalogFill и Minishop2 | Как перегнать ТV-параметры в поля Minishop2 MODx Revo
Задача: Перенести нужные TV-значения ресурсов(товаров) в поля для Minishop2
То есть сначала импортируем товары при помощи CatalogFill, а потом обрабатываем ресурсы, которые являются товарами.
Этап №1
Подготовка файла конфигурации импорта для CatalogFill, он обычно лежит в папке config внутри папки с компонентом, его можно редактировать из админки.
Для того чтобы при импорте ресурсы принимали тип товара, в конфигурации импорта нужно class_key задать значение msProduct.
$cf_config['imp_content_default'] = array(
'content' => array(
'template' => 4,
'class_key' => 'msProduct',
),
);
Этап №2
После того, как импортировали или обновили каталог, запускаем ниже приведённый сниппет.
В нашем случае нужные поля это: цена, картинка, артикул, вес.
Сниппет выбирает идентификаторы товаров в массив, далее, используя этот массив, мы в цикле обновляем поля товара на значения из TV-параметров.
Код ниже можно просто запускать из Console подставив свои значения.
<?php
$output = $modx->runSnippet('pdoResources',array(
'parents' => 1, //ID каталога
'where'=> '{"class_key":"msProduct"}',
'limit'=>0,
'returnIds'=>1
));
$arr = explode(',', $output);
foreach($arr as $id){
$product = $modx->getObject('msProduct', $id);
$image = $product->getTVValue('image_0');
$price = $product->getTVValue('price_0');
$article = $product->getTVValue('article_0');
$weight = $product->getTVValue('weight_0');
$product->set('image', $image);
$product->set('thumb', $image);
$product->set('price', $price);
$product->set('article', $article);
$product->set('weight', $weight);
$product->save();
}
$cm = $modx->getCacheManager();
$cm->refresh();
Данный скрипт обрабатывает, примерно, 100 товаров в секунду.