Pull to refresh

импорт товаров с картинками в Ubercart

Reading time3 min
Views4.5K
Ubercart — это программный модуль с открытым исходным кодом, полностью интегрирующий Интернет-магазин с CMS Drupal. Ubercart считается одним из лучших в мире решений для электронной коммерции.

Как правило много вопросов вызывает массовый импорт товаров с картинками.
В моем случае был excel файл со списком товаров и их атрибутами (наименование, описание, цены, авторы, ссылки на картинки и т.п.).
Excel файл в чистом виде довольно таки трудно скормить для импорта, поэтому я сохранил его в виде *.csv файла.
Я щас опишу что дальше с ним делать:)

Я использовал модуль node_import и написал свой модуль-надстройку.

В модуле-надстройке добавляем хук hook_node_import_fields() он отвечает за дополнительные поля.
Copy Source | Copy HTML
  1. function my_module_node_import_fields($type) {
  2.   if (_uc_product_node_import_is_product($type)) {
  3.     $fields = array(
  4.       'my_field_0' => 'MY FIELD 0',
  5.       'my_field_1' => 'MY FIELD 1',
  6. ...
  7.       'my_field_n' => 'MY FIELD N',
  8.       'my_image_filepath' => 'MY Image filepath',
  9.     );
  10.   return $fields;
  11. }

my_field_n — это машинное имя дополнительного поля.
MY FIELD N — это то как поле будет отображаться пользователю при импорте.
my_image_filepath — должен содержать прямой путь до файла с картинкой.

далее добавляем хук hook_node_import_prepare(). Здесь можно проверять на валидность поля и подготовить их к импорту.
Copy Source | Copy HTML
  1. function my_module_node_import_prepare(&$node, $preview = FALSE) {
  2.   $errors = array();
  3.  
  4.   if (!isset($node->my_field_0) || empty($node->my_field_0)) {
  5.     $errors[] = t('ERROR! on MY FIELD 0');
  6.   } else $node->field_0 = $node->my_field_0;
  7.   if (!isset($node->my_field_1) || empty($node->my_field_1)) {
  8.     $errors[] = t('ERROR! on MY FIELD 1');
  9.   } else $node->field_1 = $node->my_field_1;
  10. ...
  11.   if (!isset($node->my_field_n) || empty($node->my_field_n)) {
  12.     $errors[] = t('ERROR! on MY FIELD N');
  13.  } else $node->field_n = $node->my_field_n;
  14.  
  15.   return $errors;
  16. }

здесь мы проверяем наши поля(my_field_n), если что-то не так, то выдаем ошибку, иначе записываем в настоящие поля (field_n).
Кстати, если поле CCK'шное, то обращаться к нему нужно так $node->field_n[0]['value']

для импорта картинок я написал отдельную функцию:
Copy Source | Copy HTML
  1. function _my_module_create_image_field($filepath, $nid) {
  2.   $file_temp = file_get_contents($filepath);
  3.   $file_temp = file_save_data($file_temp, file_directory_path() . '/images/' . basename($filename), FILE_EXISTS_RENAME);
  4.  
  5.   $image_field['0']['fid'] = 'upload';
  6.   $image_field['0']['title'] = basename($file_temp);
  7.   $image_field['0']['nid'] = $nid;
  8.   $image_field['0']['filename'] = basename($file_temp);
  9.   $image_field['0']['filepath'] = $file_temp;
  10.   $image_field['0']['filemime'] = mime_content_type($file_temp);
  11.   $image_field['0']['filesize'] = filesize($file_temp);
  12.  
  13.   return $image_field;
  14. }

в хуке hook_node_import_prepare() использовать так:
Copy Source | Copy HTML
  1. if (!$preview){
  2.   if (isset($node->my_image_filepath)){
  3.     if (file_exists($node->naeyc_image_filepath)){
  4.       $node->field_image_cache = _my_module_create_image_field($node->my_image_filepath, $node->nid);
  5.     } else $errors[] = $node->my_image_filepath . t(' file is not exists.');
  6.   }
  7. }

$preview отвечает за предпросмотр. то биш этот код в предпросмотре выполняться не будет, а только после того как пользователь начнет импорт.

вот и все.
жду вашей критики:)
Tags:
Hubs:
Total votes 3: ↑3 and ↓0+3
Comments6

Articles