Импорт товаров из EXEL в Drupal commerce. Часть 1.

Average: 3.6 (17 votes)

Стандартная задача - импорт из exel в drupal commerce.

Важно:

В моем примере один товар соответсвует одной ноде. Поэтому все дальнейшие приемы и код используются срого с этим условием.

Есть для этого несколько модулей которые помогают импортнуть данные сначала в Product Variation, а потом уже в Product Display. Мы их изучили и решили останоиться на связке FeedsCommerce Feeds, Feeds Rules, Feeds Tamper, Feeds Excel 

Кратенько о каждом модуле:

Feeds - позволяет импортировать данные в акие сущности как User, Node, Taxonomy term. Дополниельные модули расширяют список поддерживаемых для импорта сущностей.

Commerce Feeds - расширяет список сущностей feeds - доавляет возможность импорта товаров (product variation), профилей покупателей и т.д. смотрите на скрине ниже

Feeds Rules - расширяет функционал модуля Rulers. Добавляет несколько условий связанных с feeds. Одно из которых - окончание импорта, которое нам в дальнейшем пригодлиться. Смотрите скрин ниже

Feeds Tamper - модуль позволяет делать обработку данных перед тем как заполнить импортируемы поля. В нашем случае, я его использовал для обрезания пробелов и заполнения мулти полей.

Feeds Excel - добавляеn возможность импорта из exel.

Основная идея:

1. Создаем два импорта. Один для товаров (product variation), другой для отображений (Product display).

2. Связь этих результата импорта по уникальному значению, которое находится в импортируем EXEL файле

3.Запуск импорта Product display по окончании импорта Product variation

4. Заполняем поле картинок товаров множетвенным значениями.

  Создаем первый импорт Product variation

Создаем второй импорт Product 

В последнем скрине в качестве уникального значения мы сипольуем SKU - артикул товара. Но в стандартной поставке Feeds это поле не получиться использовать как уникальное - нет там такой возможности. Поэтому на придеться немного написать кода. По полю SKU м будем искать ноды товары и обновлять их.

Нам нужен будет свой модуль и в нем реализуем один едиснвенный хук и одну функцию.


 

/**
 * Implements hook_feeds_processor_targets_alter().
 */
function vanshop_basic_feeds_processor_targets_alter(array &$targets, $entity_type, $bundle) {
  if($entity_type == 'node' && $bundle == 'product_display' && isset($targets['field_product:sku'])){
    $targets['field_product:sku']['optional_unique'] = TRUE;
    $targets['field_product:sku']['unique_callbacks'][] = 'vanshop_basic_mapper_unique';
//    dpm(compact('targets', 'entity_type', 'bundle'));
  }
}

/**
 * Callback function for unigue field SKU in node product display
 * @param \FeedsSource $source
 * @param $entity_type
 * @param $bundle
 * @param $target
 * @param array $values
 * @return mixed
 */
function vanshop_basic_mapper_unique(FeedsSource $source, $entity_type, $bundle, $target, array $values) {
  list($field_name, $column) = explode(':', $target . ':value');
//  dpm(compact('entity_type', 'bundle', 'target', 'values', 'field_name', 'column'));
  // Example for if the target is a field.
  $product = commerce_product_load_by_sku($values[0]);
  $query = new EntityFieldQuery();
  $result =$query->entityCondition('entity_type', 'node', '=')
    ->propertyCondition('type', 'product_display')
    ->fieldCondition('field_product', 'product_id', $product->product_id, '=')
    ->range(0, 1)
    ->execute();

  if (!empty($result[$entity_type])) {
    return key($result[$entity_type]);
  }

}

Важно. Машинное имя для ноды товаров product_display. Имя модуля vanshop_basic

Небольшие пояснения по коду: Мы объявлеяем field_product:sku возможность быть уникальным значением, и реализуем функцию по которой возвращаем nid ноды соответсвующей товару по field_product:sku. Как то так. Опять же, повторюсь. Эта магия применима только когда каждый товар имеет свою ноду.

Теперь будет происходит следуюещее:

1. Мы ипортируем сначала Product variation

2. Потом импортируем Product

3. Связь между ними будет по полю SKU.

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

Конец первой части. Будут вопросы пишите.

Импорт данных из Exel в drupal часть вторая

 

Поделитесь статьей