Стандартная задача - импорт из 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 часть вторая