Via Composer
$ composer require pastuhov/yii2-yml-catalog
- легкий
- базируется на официальной документации https://yandex.ru/support/partnermarket/yml/about-yml.xml
-
Реализуем интерфейсы (примеры реализации всех классов смотри в директории
tests
) -
Создаем консольный контроллер:
namespace console\controllers;
use pastuhov\ymlcatalog\actions\GenerateAction;
use yii\console\Controller;
/**
* Class GenerateController
*/
class YmlController extends Controller
{
/**
* @inheritdoc
*/
public function actions()
{
return [
'generate' => [
'class' => GenerateAction::className(),
'enableGzip' => true, # запаковать gzip-ом yml после генерации
'fileName' => 'yml-test.xml', # желаемое название файла
'publicPath' => '@runtime/public', # публичная директория (обычно корень веб сервера)
'runtimePath' => '@runtime', # временная директория
'keepBoth' => true, # опубликовать yml и .gz
'shopClass' => 'pastuhov\ymlcatalog\Test\models\Shop',
'currencyClass' => 'pastuhov\ymlcatalog\Test\models\Currency',
'categoryClass' => 'pastuhov\ymlcatalog\Test\models\Category',
'localDeliveryCostClass' => 'pastuhov\ymlcatalog\Test\models\LocalDeliveryCost',
'offerClasses' => [
'pastuhov\ymlcatalog\Test\models\SimpleOffer'
],
],
];
}
}
- Запускаем из консоли:
$ yii yml/generate
Дополнительно с именем класса, реализации интерфейса, можно передавать следующие параметры:
- Объект класса ActiveQuery, или его наследника.
'categoryClass' => [
'class' => 'pastuhov\ymlcatalog\Test\models\Category',
'query' => \pastuhov\ymlcatalog\Test\models\Category\Category::find(),
]
В данном случае, выборка данных будет производиться с помощью передаваемого ActiveQuery или его наследника; Позволяет использовать уже созданный объект, для выборки данных.
- Объект класса ActiveDataProvider, или его наследника.
'categoryClass' => [
'class' => 'class' => 'pastuhov\ymlcatalog\Test\models\Category',
'dataProvider' => new ActiveDataProvider([
'query' => Category::find(),
'pagination' => [
'pageSize' => 1000,
]
]),
]
В данном случае, выборка данных будет производиться с помощью передаваемого ActiveDataProvider или его наследника;
Позволяет делать выборку данных с использованием постраничной пагинации.
Так-же может быть передан true, в качестве параметра, для автоматического создания объекта класса ActiveDataProvider со значением количества строк в странице равной 1000.
'categoryClass' => [
'class' => 'class' => 'pastuhov\ymlcatalog\Test\models\Category',
'dataProvider' => new ActiveDataProvider([
'query' => Category::find(),
'pagination' => true,
]
]
На больших объемах данных, выборка, с использованием ActiveQuery->batch(), расходует оперативную память, гораздо большую, чем значение установленное в конфигурацилнных файлах. (Скорее всего особенности работы библиотеки PDO).
Внимание: Использование ActiveDataProvider увеличивает время генерации выгрузки.
Яндекс Маркет ругается на символы " & > < '. Их нужно преобразовывать в html-сущности, чтобы проверка прайса проходила успешно. Чтобы это сделать, в модели необходимо реализовать интерфейс pastuhov\ymlcatalog\EscapedAttributes и определить метод getEscapedAttributes, который возвращает список необходимых для чистки атрибутов. В примере ниже мы указываем, что атрибут name необходимо фильтровать:
use pastuhov\ymlcatalog\EscapedAttributes;
use pastuhov\ymlcatalog\SimpleOfferInterface;
class SimpleOffer extends ActiveRecord implements SimpleOfferInterface, EscapedAttributes
{
...
public function getEscapedAttributes() {
return [
'name'
];
}
...
}
$ composer test
или
$ phpunit
Проверить качество сгенерируемого файла можно следующими способами:
- Официальным валидатором https://old.webmaster.yandex.ru/xsdtest.xml
- При помощи
xmllint
(пример: xmllint --valid --noout yml-test.xml) - IDE PhpStorm также может помочь
If you discover any security related issues, please email kirill@pastukhov.su instead of using the issue tracker.
GNU General Public License, version 2. Please see License File for more information.