Awesome Open Source
Awesome Open Source

Компонент выгрузки каталога товаров в Яндекс.Маркет (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 [email protected] instead of using the issue tracker.

Credits

License

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


Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
php (16,075
generator (335
integration (92
shop (90
yandex (38
yml (17

Find Open Source By Browsing 7,000 Topics Across 59 Categories