Стандартная задача - импорт из exel в drupal commerce.
Важно:
В моем примере один товар соответсвует одной ноде. Поэтому все дальнейшие приемы и код используются срого с этим условием.
Есть для этого несколько модулей которые помогают импортнуть данные сначала в Product Variation, а потом уже в Product Display. Мы их изучили и решили останоиться на связке Feeds, Commerce 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 часть вторая
















