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

15.07.2014

Небольшое улучшение самому распространённому 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
Похожие записи

Комментарии

Сергей
16.07.2014, 09:51

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

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

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

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

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

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

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

Сергей
25.07.2014, 10:41

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

Одежда - это классический случай использования атрибутов и классический пример от КомерцГайд, когда используется много товаров=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());
Гость
26.10.2014, 20:57

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

Сергей
27.10.2014, 09:28

А кто знает как разрешить импортировать товары с одинаковым 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'

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

Константин
29.05.2015, 15:08

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();
}
}

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

Виктор
17.06.2015, 15:09

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

Павел
01.07.2015, 13:19

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

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

Гость
19.07.2015, 13:07

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

Гость
09.09.2015, 02:49

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

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

Гость
10.09.2015, 10:18

Эта ошибка описана на странице 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.
Как быть? поделитесь опытом

Гость
05.01.2016, 09:41

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

Гость
08.02.2016, 04:08

Подскажите пожалуйста как заставить работать 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?

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

День добрый. Столкнулся с такой проблемой: при импорте не загружаются картинки с русскими буквами в названиях. Не подскажите, что делать? Названия картинок в БД самые дикие, например:
183203б_.jpg
183203в.jpg
183893а(1).jpg
183900б.jpg
183971б__(1).jpg
183971в__.jpg
188230б_(1).jpg

Поменял файл импорта на utf-8 и попробовал перед импортом распаковать архив с картинками и перекодировать в utf-8 названия картинок - см. полный код:

$zip = new ZipArchive;
$path = 'sites/default/private/feeds/';
$filename = 'sites/default/private/feeds/import.zip';
$zip->open($filename);
$zip->extractTo($path);
$zip->close();
//Смена кодировки имени файла
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if ($fileinfo->isFile()) { 
$entry = $fileinfo->getFilename(); 
iconv('windows-1251', 'utf-8', $entry ); 
}

но где-то, закрался косяк и распаковка вообще перестала происходить (без 2 части кода, распаковка идет, но картинки с кирил. названиями не импортируются)
Что я сделал не так?

Добрый день, поставил модули, прописал модуль, очистил кэш. Запускаю импорт товаров, выполняется успешно, но второй импорт не запускает, в чем может быть проблема? В логах ошибок нет. ID импортеров совпадает.

Гость
07.02.2019, 10:09

Народ, сделал все, как описано. Создается и товар и дисплей, но они не связаны. Т.е. дисплей не привязан к товару. Как исправить?

Добавить комментарий