Импорт товаров в Интернет-магазин Ubercart Drupal 7

Аватар пользователя userok


Импорт товаров в Интернет-магазин Ubercart Drupal 7

Доброго времени суток, читатели сайта it-cat.biz. В этой статье мы рассмотрим импорт товаров в интернет-магазин на базе Drupal 7 и Ubercart. Здесь не будет полностью готового решения для обмена данными с такими системами как 1С-Предприятие, а только показан способ загрузки товаров в интернет-магазин из текстового файла с разделителями(формат CSV — Comma-Separated Values). Для решения нашей задачи идеально подходит модуль feeds, именно его мы будем использовать для импорта товаров. Если Вы не смогли сходу понять как работать с этим модулем или только ищете способы импорта товаров, тогда эта статья для Вас. Мы постараемся описать процесс максимально подробно и приложим соответствующие снимки экрана, для улучшения восприятия информации.

Итак, чтобы сразу сделать ясным что мы собираемся импортировать и будет ли для Вас полезным этот текст давайте сверим наши исходные данные. У нас имеется Интернет-магазин на базе CMS Drupal 7 и модуля Ubercart, установленный на локальный компьютер с ОС Linux, для понимания процесса импорта это не имеет значения, просто там где указан путь http://127.0.0.1, его нужно будет заменить на путь к Вашему сайту, например http://example.com.
Предположим, что у нас так-же есть готовый CSV файл, выгруженный из программы складского учёта, например, 1С-Предприятие. Для нашего примера мы самостоятельно создадим такой файл. Содержимое файла:

sku|tovar|price|language|user|description|catalog|picture
001|Порошок №1|"200"|ru|userok|Хороший стиральный порошок|Стиральные порошки|http://127.0.0.1/sites/default/files/import/00-common-powder1.jpg
002|Порошок №2|"2001"|ru|userok|Очень хороший стиральный порошок|Стиральные порошки|http://127.0.0.1/sites/default/files/import/00-common-powder2.jpg
003|Мыло душистое|"2002"|ru|userok|Душистое мыло для дома|Мыло отечественное|http://127.0.0.1/sites/default/files/import/00-sweet-soap.jpg
004|Мыло банное|"2003"|ru|userok|Банное мыло для повседневного использования|Мыло отечественное|http://127.0.0.1/sites/default/files/import/00-bath-soap.jpg
005|Мыло пенное|"2004"|ru|userok|Хорошее пенное мыло|Мыло отечественное|http://127.0.0.1/sites/default/files/import/00-foam-soap.jpg
006|Мыло пенное французское|"20"|ru|userok|тоже неплохое мыло|Мыло французское|http://127.0.0.1/sites/default/files/import/00-french-soap.jpg

Где:
SKU — уникальный артикул товара (обязательное поле для Ubercart)
tovar — наименование товара
price — цена товара
language — язык (актуально для мультиязычного сайта)
user — имя пользователя Drupal7 от имени которого будет загружен товар
description — Описание товара
catalog — имя термина таксономии, являющегося родителем данного товара
picture — путь к файлу картинки товара который планируется к загрузке

Первая строка файла — поля, соответствующие порядку выгруженных данных, названия полей понадобятся при настройке загрузки в дальнейшем, наименования полей придумываем самостоятельно.
Сделаем пояснение по поводу двух последних полей, в поле catalog должно быть наименование термина таксономии без указания иерархии, в нашем примере мыло мы будем загружать в меню Мыло, стиральные порошки — в меню Стиральные порошки соответственно. Для того чтобы на сайте отображалась картинка загруженных товаров необходимо в файле выгрузки указать путь к загружаемым картинкам, т. к. мы не можем запихнуть изображение в файл текстового формата.

Обратите внимание, что в поле picture указываем откуда будем загружать файл картинки.
После импорта эти файлы попадут в каталог http://127.0.0.1/sites/default/files/.
Каталог http://127.0.0.1/sites/default/files/import/ должен быть создан заблаговременно и туда-же необходимо скопировать все картинки, которые вы собираетесь импортировать. Файлы картинок следует именовать таким способом, чтобы по имени файла было понятно к какому товару относится данная картинка. Если импорт осуществляется единоразово то после импорта содержимое http://127.0.0.1/sites/default/files/import/ можно удалить. Еще раз: в файле импорта мы указываем путь откуда загружать картинки, после импорта они без нашего спроса попадут в http://127.0.0.1/sites/default/files/ и именно на картинки, загруженные в этот каталог будут указывать все ссылки в карточке товара. В случае если Вы укажете в файле импорта путь http://127.0.0.1/sites/default/files/ и скопируете туда картинки для загрузки то импортёр создаст дубликаты картинок в этом-же каталоге, что очень часто приводит к проблемам с отображением картинок у Вас на сайте!
Вместо http://127.0.0.1/sites/default/files/import/ можно использовать любой другой доступный путь, за исключением http://127.0.0.1/sites/default/files/.

Давайте начнем. Нам понадобятся следующие модули:

Job_scheduler - требуется для работы feeds
feeds — этот модуль будет выполнять основную работу по импорту товаров
uc_feeds — этот модуль делает доступными поля товара Ubercart для модуля feeds.
Скачиваем и устанавливаем вышеназванные модули. Отдельно об установке модуей можно почитать в соответствующей статье на нашем сайте.

После установки включаем включаем модули Feeds Admin UI, Feeds Import, Ubercart Feeds.
Если всё сделано приавильно то в меню Администрирование->Структура появится пункт Feeds importers:

Рисунок 1.

Feeds importers


Нажимаем ссылку Feeds importers и видим следующую картинку:
Рисунок 2:

Feeds importers Добавить импортер

Здесь нам доступен импорт нод и импорт пользователей. Эти два импортёра присутствуют по-умолчанию. Мы не будем их трогать и создадим свой собственный импортёр с нуля. Нажимаем ссылку Add importer:
Рисунок 3.


Drupal7 Ubercart Импорт товаров

Вводим название импортера и описание по желанию. Нажимаем создать:
Рисунок 4.


Drupal7 Ubercart Импорт товаров

Открылась страница с настройками импортёра, разделённая на четыре логические части:
1) Базовые настройки.
2) Сборщик (fetcher) собирает данные для импорта из файла или вэб-ресурса.
3) Обработчик (parcer) определяет формат полученных данных.
4) Процессор (processor) осуществляет основную обработку подготовленных для импорта данных.

Давайте начнем настройку по порядку и в процессе станет понятно что для чего нужно.
1) Базовые настройки.
Нажимаем ссылку настройки:
Рисунок 5.


Drupal7 Ubercart Импорт товаров

В раскрывающемся списке Связать с типом материала выбираем Создать самостоятельную форму, набрав впоследствии в адресной строке браузера указанный URL мы попадём в форму выполнения импорта. Выключаем периодический импорт, т. к. мы будем выполнять его вручную, нажимаем Сохранить.

2) Сборщик.
Нажимаем ссылку Изменить и в открывшемся окне выбираем File Upload(Загрузка из файла) и жмём Сохранить:
Рисунок 6.


Drupal7 Ubercart Импорт товаров

Нажимаем ссылку Настройки и убеждаемся, что всё как на рисунке ниже:
Рисунок 7.


Drupal7 Ubercart Импорт товаров

3) Обработчик.
Нажимаем Изменить и на появившейся странице выбираем CSV parcer, жмём Сохранить:
Рисунок 8.


Drupal7 Ubercart Импорт товаров

Нажимаем ссылку Настройки и выбираем наиболее подходящий для Ваших данных разделитель значений, в нашем примере это символ «|» и жмём Сохранить:
Рисунок 9:


Drupal7 Ubercart Импорт товаров

4) Процессор.
Нажимаем ссылку Изменить, выбираем Node processor и нажимаем Сохранить:
Рисунок 10.


Drupal7 Ubercart Импорт товаров

Нажимаем ссылку Настройки. В группе Update existing Материалы выбираем Update existing Материалы. В раскрывающемся списке Набор выбираем товар. Выбираем формат текста для поля Описание, нажимаем Сохранить:
Рисунок 11.


Drupal7 Ubercart Импорт товаров

Нажимаем ссылку Соответствие:
Рисунок 12:


Drupal7 Ubercart Импорт товаров

На этой странице мы описываем соответствие полей загружаемого файла полям товара Ubercart. Описания полей материала можно просмотреть нажав ссылку Описание. В поле Источник вписываем имя первого поля (в нашем примере sku), а поле Цель выбираем соответствующее поле нашего товара. После указания соответствия первого поля жмём Сохранить и, далее, последовательно указываем соответствия остальных полей, напротив поля Каталог поставим галку Autocreate чтобы автоматически создавались отсутствующие термины таксономии(будут созданы в корне, выставлять родительские отношения придётся вручную):
Рисунок 13.


Drupal7 Ubercart Импорт товаров

Всё настройки импорта завершены, теперь можно переходить непосредственно к импорту товаров. Для этого переходим на страницу Feeds importers и нажимаем ссылку import или сразу переходим по адресу /import в адресной строке:
На открывшейся странице видим созданный нами импортер Import into Ubercart, нажимаем эту ссылку:
Рисунок 14.


Drupal7 Ubercart Импорт товаров

Нажимаем ссылку Import into Ubercart. выбираем разделитель как в нашем файле для импорта, пропускаем галочку Без заголовков т. к. мы для удобства озаглавили поля в файле импорта, выбираем csv файл на диске и нажимаем Импорт:
Рисунок 15.


Drupal7 Ubercart Импорт товаров

Импорт успешно завершён!
Рисунок 16.


Drupal7 Ubercart Импорт товаров

Убеждаемся что товары загрузились корректно, включая картинки и иерархию, также видим, что в корне появился новый пункт меню "Мыло французское":
Рисунок 17.


Drupal7 Ubercart Импорт товаров

Смотрите так же: Импорт товаров в Интернет-магазин Ubercart Drupal 7 (Часть 2. Импорт нескольких картинок и атрибутов)

Скачать статью с DepositFiles

Эта статья опубликована под Creative Commons Attribution ShareAlike лицензией.

Михаил (не проверено)
<p>&nbsp;Все сделал как описано при попытке загрузить файл, выдает ощибку:&nbsp;<span style="color: rgb(136, 68, 0); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 23.33333396911621px; background-color: rgb(255, 252, 229);">SQLSTATE[HY000]: General error: 1366 Incorrect string value:</span></p><p>Что делать?</p><p>&nbsp;</p>
userok
Аватар пользователя userok
Эту ошибку Вам выдаёт СУБД, т.е. происходит попытка записи в поле таблицы БД значения, не соответствующее формату данного поля. В случае импорта через feeds чаще всего такое происходит, при загрузке файла в кодировке, отличной от кодировки БД, например для БД это utf8 а в загружаемом файле выставлена кодировка win1251, в большинстве случаев в csv-файле необходимо выставить кодировку, соответствующую кодировке БД(чаще всего-utf8) и ошибка появляться не будет. Другой возможной причиной может быть, невнимательность при сопоставлении полей Drupal и загружаемого файла, например попытка загрузить url-адрес в поле цена. Но это вопрос внимательности. На всякий случай - перепроверьте. Первым делом привести в соответствие кодировку, если с этим всё в порядке, тогда уже смотреть для какого конкретно поля выскакивает ошибка и искать причину. Полный текст ошибки должен выглядеть так: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xCF\xEE\xF0\xEE\xF8\xEE...' for column 'name' at row 1 На примере выше видно, что в поле name пытаются записаться кракозябры. Ну и перепроверить настройки магазина Администрирование->Магазин->Магазин->(Изменение основных настроек магазина.), правильно ли указан десятичный разделитель, например.
Игорь (не проверено)
<p>&nbsp;Здравствуйте, а почему цена дублируется??&nbsp;</p>
userok
Аватар пользователя userok
Не совсем понятен Ваш вопрос. Уточните пожалуйста где именно у Вас дублируется цена? P.S. На всякий случай: если Вы имеете в виду, что цена товара дважды отображается при просмотре страницы товара или списка товаров, как на рисунке ниже: <a href="http://pic5you.ru/25850/3571537/" target="_blank"><img src="http://s2.pic5you.ru/allimage/y2013/06-25/25850/3571537-thumb.png"></a> то это не значит, что цена продублировалась при импорте. В базе данных она одна. В нашем примере показан импорт с минимальными настройками Ubercart (почти по умолчанию). Если Вы хотите убрать одну из этих цен на странице товара, тогда необходимо в меню "Администрирование->Структура->Типы материалов->Товар(Управление отображением)" сделать "лишние" поля скрытыми. Если хотите убрать ненужную цену в списке товаров, то надо редактировать соответствующее представление(сходу не скажу где конкретно, надо поискать).
Вадим (не проверено)
<p>Добрый день. Подскажите, в каком случае может быть так, что все вреоде бы установил правильно, и не выдается никаких ошибок, как бы обновление настроено, но ничего не происходит. Нажимаю на кнопку Import, переадресация на ссылку /Batch. и все ноль реакции, ни ошибок ни предупреждений, что это значит?&nbsp;</p>
userok
Аватар пользователя userok
К сожалению, Вашу проблему "повторить" не удалось. Если Вы настраивали импорт в действующем магазине, то я бы порекомендовал сделать это на тестовой машине со свежеустановленным друпал+уберкарт и по результату искать причину. В общем мало данных для разумного ответа...
Павел (не проверено)
<p>Добрый день. У меня такой вопрос - пытаюсь скрыть все виды цен от пользователей,но безрезультатно. Поиск ответа в инете не дал результат равный 0 . Если есть возможность просветить меня в данном направлении - буду очень признателен. Доброго здоровья.</p>
GrandVitara
Аватар пользователя GrandVitara
Hi Если я правильно понял, то вопрос не совсем по профилю статьи, данный вопрос правильней было разместить в статье <a href='http://it-cat.biz/ru/internet-saytostroenie-drupal-7/drupal7ubercart3internet-magazinchast-3'>"Создание интернет-магазина на CMS Drupal7 + модуль Ubercart3"</a>. А по сути вопроса: Структура-Типы материала-Товар Вкладка "Управление отображением". На этой вкладке сделайте желаемые поля скрытыми в интересующих активных конфигурациях отображения (По умолчанию, анонс и другие) после окончания редактирования конфигурации каждую конфигурацию необходимо сохранять отдельно и только потом переходить к следующей. Если я не правильно понял суть вопроса, то опишите более подробно ситуацию. Удачи.
Александр (не проверено)
<p>Здравствуйте!<br>Меня интересует такой вопрос, а как можно организовать автоматический импорт из файла, лежащего на сервере. Соответственно данный файл обновляется допустим раз в сутки. Где можно задать путь к этому файлу?</p>
GrandVitara
Аватар пользователя GrandVitara
Здравствуйте! Насколько помню возможно, но надо поискать где это прописывается....
userok
Аватар пользователя userok
Во первых в настройках сборщика (рис. 7 к статье) поставить галку <strong>Supply path to file or directory directly</strong> и сохранить настройки. После этого в окне импорта (рис. 15 к статье) вместо кнопки выбора файла появится текстовое поле для ввода пути вида public://feeds/internet-shop-import.csv. public://feeds соответствует пути ваш_сайт/sites/default/files/feeds, если вместо public://feeds ввести public://tmp, то каталог tmp создастся автоматически. В нашем примере импорт будет осуществляться из файла: ваш_сайт/sites/default/files/feeds/internet-shop-import.csv Остаётся только решить задачу загрузки файла импорта в этот каталог.
Михаил_К (не проверено)
<p>Доброго времени суток!</p><p>Спасибо за материал, все очень наглядно расписано. Но у меня одна проблема - не отображаются картинки.</p><p>В загружаемом файле прописываю путь к файлу. Файл заранее загружен на сервер. Если прописать этот адрес в адресной строке браузера, картинка открывается. На самом сайте товар без картинки</p>
userok
Аватар пользователя userok
Действительно, существует такая проблема. Начнем с того, что в статье имеется неточность (которую после дополнитиельной проверки мы обязательно исправим <b>Исправлено 02.12.2013</b>). Давайте возьмём для примера первую строку файла для загрузки в Уберкарт, который предложен в данной статье: 001|Порошок №1|"200"|ru|userok|Хороший стиральный порошок|Стиральные порошки|http://127.0.0.1/sites/default/files/00-common-powder1.jpg Во-первых, здесь надо обратить внимание, что для картинок указан путь http://127.0.0.1/sites/default/files/. Сюда по умолчанию загружаются картинки товара при создании товара вручную(когда вы указываете путь к файлу картинки на своём локальном компьютере через web-интерфейс). Во-вторых, как показала практика, строка в файле загрузки вида: http://127.0.0.1/sites/default/files/00-common-powder1.jpg означает не то, что эта ссылка пропишется в качестве ссылки на картинку в "карточке" товара, а то, что импортер возьмёт картинку, лежащую по указанному адресу и загрузит её в каталог http://127.0.0.1/sites/default/files/, т.е. вы получите дубликат, загруженной картинки вида http://127.0.0.1/sites/default/files/00-common-powder1_0, на который и будет ссылка в "карточке" товара. Возможно создание подобных дубликатов и приводит к описанной вами ситуации. Помните, что ссылка на файл картинки в файле загрузки должна лежать по адресу, отличному от /sites/default/files/. Например, строку 001|Порошок №1|"200"|ru|userok|Хороший стиральный порошок|Стиральные порошки|http://127.0.0.1/sites/default/files/00-common-powder1.jpg я бы заменил на 001|Порошок №1|"200"|ru|userok|Хороший стиральный порошок|Стиральные порошки|http://127.0.0.1/sites/default/files/import/00-common-powder1.jpg т.е. в каталог /sites/default/files/import/ заливал бы картинки, которые бы потом импортировались с помощью feeds в /sites/default/files/.
Михаил_К (не проверено)
<p>&nbsp;Спасибо! Помогло!</p>
Hackrus (не проверено)
<p>Ребята, а как-нибудь можно импортировать еще и привязанные к товарам теги и категории?</p>
Aussie
Здравствуйте, Hakrus. Теоретически можно. Ставите модуль <a target="_blank" class="ext" href="https://drupal.org/project/metatags_quick">Meta tags quick</a> , настраиваете его, в файле импорта создаёте поле по вышеуказанным правилам, в настройках добавляете нужное поле, или в коде править. Это всё теория, на практике надо пробовать.
Hackrus (не проверено)
<p>Ребята, а можно ли как-нибуть еще импортировать привязанные теги к товарам и категории?</p>
Aussie
Ответил выше.
Евстифеев Алекс... (не проверено)
<p>Добрый день,&nbsp;все сделал но при импорте выдает вот такое сообщение User 0 not authorized to create content type product не подскажете как решить?</p>
Вроде бы все сделала, как описано, но при загрузке файла выдает ошибку for column 'sell_price' at row. Коды и форматы проверила несколько раз. Подскажите пожалуйста, в чем может еще быть проблема?

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