xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Импорт товаров и их дисплеев за один запуск Feeds

Опубликовано в

Небольшое улучшение самому распространённому cпоcобу импорта товаров в Commerce — с помощью Feeds и Commere Feeds, позволяющее импортировать товары и их дисплеи за один запуск импортера:

1. Устанавливаем модули Feeds и Commerce Feeds.

2. Создаём импортер с именем products.

3. В качестве фетчера выбираем File upload, в качестве процессора Commerce Product processor.

4. В маппинге полей добавляем как минимум — Product SKU (уникальный), Product title и Price: Amount:

5. Меняем остальные настройки по желанию.

6. Создаём импортер с именем product_displays.

7. В качестве фетчера выбираем File upload, в качестве процессора Node processor.

8. В маппинге полей добавляем как минимум — GUID (в качестве source можно использовать sku), Title и Product: SKU:

9. Меняем остальные настройки по желанию.

10. Пробуем импортировать товары, если всё хорошо, то двигаемся дальше.

11. Пробуем импортировать дисплеи, если всё хорошо, то двигаемся дальше.

12. Создаём модуль с кодом:

/**
 * Implements hook_feeds_after_import().
 */
function MODULENAME_feeds_after_import(FeedsSource $source) {
  if ($source->id == 'products') {
    $fetcher_config = $source->getConfigFor($source->importer->fetcher);
    $second_source = feeds_source('product_displays');
    $second_source->setConfigFor($second_source->importer->fetcher, $fetcher_config);
    $second_source->save();
    $second_source->startImport();
  }
}

Сбрасываем кэш.

Теперь после импорта товаров будет автоматически запускаться импорт дисплеев из того же файла.

Экспорт импортера products
Экспорт импортера product_displays
Пример файла csv

Видео с процессом импорта:

Способ подойдёт только при организации товаров по схеме 1 product = 1 product display.

Подробнее про программную работу с Feeds

Написанное актуально для Commerce 1
Похожие записи

Комментарии RSS

Полезный материал. Вообще, слабо понимаю, зачем по умолчанию сделано разделение дисплея и товара. Как мне кажется, в основном люди используют 1 товар=1 дисплей.
Можно вопрос: в своей практике чем пользуешся (самописом или feeds):
1) При синхронизации сайта с прайсами поставщиков.
2) При начальном заполнении магазина товарами.
3) При переносе действующего магазина с другой платформы (с сохранением id товара и юрл).
Вобще, интересен подход при синхронизации с поставщиками: получил кучу xls от поставщиков (в разном формате), выдергнул некоторую информацию из сайта поставщиков, кое-что получил по почте . Как дальше все обрабатываешь? Парсишь и складываешь в один файл, а дальше натравливаешь feeds? Или еще как то?

в основном люди используют 1 товар=1 дисплей

тут 50/50. много магазинов где нужно выбрать вариант товара перед добавлением его в корзину. хотя согласен, что конкретная реализация в commerce чертовски неудобная

в своей практике чем пользуешся (самописом или feeds)

редко попадаются задачи на импорт, поэтому единого решения у меня нет. надёжно - migrate, быстро - feeds, парсинг с интернета - parser

в основном люди используют 1 товар=1 дисплей

С другой стороны если магазин торгует одеждой, частое явление когда нужно какой либо размер, или цвет скрывать или отключать от покупки в связи с его отсутствием на складе

С другой стороны если магазин торгует одеждой, частое явление когда нужно какой либо размер, или цвет скрывать или отключать от покупки в связи с его отсутствием на складе

Одежда - это классический случай использования атрибутов и классический пример от КомерцГайд, когда используется много товаров=1 дисплей.

Как бальзам на душу!!! Спасибо!

А может кто нибудь знает как уговорить Feeds пропускать строку импорта при определенном условии???

@Andriyun

function hook_feeds_presave(FeedsSource $source, $entity, $item) {
  if ($source->id == 'имя фида') {
    if (условие) {
      $entity->feeds_item->skip = TRUE;
    }
  }
}

Так и сделал, а так что бы это можно было через админку конфигурить?
Очень удивился когда не нашел как это сделать через Feed Tamper

А в чем разница между запусков фидс предложеным вами способом и
вариантом который предлагаю здесь https://www.drupal.org/node/749412

while (FEEDS_BATCH_COMPLETE != feeds_source('my_importer_id', $node->nid)->import());

А кто знает как разрешить импортировать товары с одинаковым sku т.е артикулом товара

А кто знает как разрешить импортировать товары с одинаковым sku т.е артикулом товара

С одинаковым sku не получится добавить, а вот добавить с нужным sku можно.
Я немного быдлокода написал, чтобы заимпортировать товары со старой базы с нужными sku (в объекте $product надо передавать и id товара и признак import=true):
в commerce_product.controller.inc (public function save)

 
// Determine if we will be inserting a new product.
    $product->is_new = empty($product->product_id);
    if (isset($product->import)){//это заплатка для импорта
        $product->is_new = true;
    }

Из модуля вызываем commerce_product_save($product)

Сейчас будет немного глупый, возможно, вопрос...

А обновлять-то товары как? Он вот что пишет при каждой попытке:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10.0610003GRGL' for key 'sku'

utf8 кодировка?

А как очистить текстовое поле товара, если в импортируемом файле это поле пустое?

12. Создаём модуль с кодом:

/**
* Implements hook_feeds_after_import().
*/
function MODULENAME_feeds_after_import(FeedsSource $source) {
if ($source->id == 'products') {
$fetcher_config = $source->getConfigFor($source->importer->fetcher);
$second_source = feeds_source('product_displays');
$second_source->setConfigFor($second_source->importer->fetcher, $fetcher_config);
$second_source->startImport();
}
}

Если есть возможность опишите более детально этот процесс создания модуля.

А внятные решения для импорта 1 дисплей - несколько товаров есть?

Добрый день, вопрос может не по теме где еще его задать андеду я не знаю.
Почему бы Вам не сделать обзор модуля ImportKit? Очень интерестно было бы узнать Ваше мнение а в идеале было бы увдиеть небольшой гайд на эту тему ;)

После импорта выдает вот такую ошибку: http://gyazo.com/1f8f1c8360b355ba092ba8902b4c4d2b
Продукт создается а вот продукт дисплей - нет.

Аналогичная фигня после обновления друпала или фидса....

Подскажите как сделать так чтобы автоматически создавался sku или вообще его убрать, включен модуль Commerce AutoSKU, а загрузка едет по уникальному заголовку, но выдает ошибку что не может создать sku. Как сделать?

Установил Feeds и Commere Feeds.
На странице /admin/commerce/products/types/product/fields добавил новые поля для товара.
На странице /admin/structure/feeds/product_reference_importer/mapping в выпадающем меню Цель (target) нет новых полей, а только стондартные поля типа цена, артикул, тело...

Подскажите, пожалуйста, в чем может быть причина?

Эта ошибка описана на странице https://www.drupal.org/node/2542076

В моем случае, ошибка была исправлена установкой Commere Feeds 7.x-1.x-dev, вместо Commere Feeds 7.x-1.3.

Ребята нужна помощь, есть порядка 100тыс нод. Кое как загнал 30 тыс через feeds, теперь не могу продолжить дальше, на 1-3% импортирования кидает ошибку 504 gateway time out.
Это типо ресурсов не хватает? гружу по 5 тыс node.
Как быть? поделитесь опытом

Если год назад закачал модулем Feeds прайсы (из .csv), а теперь пришли новые цены (из-за курса доллара),
как теперь обновить цены?

Подскажите пожалуйста как заставить работать Feeds через Cron, т.е. импортировать из файла в определённое время автоматически, а не через интерфейс. Поисковики результатов не дали, а в коде копаться мозги сломаешь. За ранее спасибо.

Спасибо за метод!
До определенного времени исправно работало, но товаров стало больше и начала появляться ошибка:

A product with SKU 0303-10 could not be found. Please check that the product exists or import it first.

Так как импорт работает по крону (Так часто насколько возможно), то product_displays начинает стартовать еще до завершения products.

Как лучше сделать? Запускать по очереди в elysia_cron?

Настроил импорт товаров без дисплеев. Но после импорта удаляется цена. Подскажите, как решить проблему?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании