Skip to content

Компонент выгрузки каталога товаров в Яндекс.Маркет

License

Notifications You must be signed in to change notification settings

pastuhov/yii2-yml-catalog

Repository files navigation

Компонент выгрузки каталога товаров в Яндекс.Маркет (YML)

Build Status Scrutinizer Code Quality Code Coverage Total Downloads

Установка

Via Composer

$ composer require pastuhov/yii2-yml-catalog

Features

Использование

  1. Реализуем интерфейсы (примеры реализации всех классов смотри в директории tests)

  2. Создаем консольный контроллер:

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'
                ],
            ],
        ];
    }
}
  1. Запускаем из консоли:
$ yii yml/generate

Дополнительно

Дополнительно с именем класса, реализации интерфейса, можно передавать следующие параметры:

  1. Объект класса ActiveQuery, или его наследника.
'categoryClass' => [
    'class' => 'pastuhov\ymlcatalog\Test\models\Category',
    'query' => \pastuhov\ymlcatalog\Test\models\Category\Category::find(),
]

В данном случае, выборка данных будет производиться с помощью передаваемого ActiveQuery или его наследника; Позволяет использовать уже созданный объект, для выборки данных.

  1. Объект класса 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-сущности

Яндекс Маркет ругается на символы " & > < '. Их нужно преобразовывать в 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

Проверить качество сгенерируемого файла можно следующими способами:

  1. Официальным валидатором https://old.webmaster.yandex.ru/xsdtest.xml
  2. При помощи xmllint (пример: xmllint --valid --noout yml-test.xml)
  3. IDE PhpStorm также может помочь

Security

If you discover any security related issues, please email kirill@pastukhov.su instead of using the issue tracker.

Credits

License

GNU General Public License, version 2. Please see License File for more information.