Пример. Обновление записей по ключевому полю с помощью пропатченого модуля Node Import.

Главные вкладки

Аватар пользователя VasyOK VasyOK 17 декабря 2009 в 8:29

Поводом к написанию этой заметки послужил видео урок Михаила Кислицина о том, как загонять товары на сайт с Drupal+Ubercart с помощью пропатченого модуля Node Import http://www.drupal.ru/node/17859. ИМХО самя крутая особенность модуля была возможность не только добавления товаров на сайт, но и обновления уже существующих.

Одновременно с этим не устраивало следующее:
1) Ubercart нужен далеко не всем
2) Описывался модуль для Drupal 5.

А что делать если нужно добавлять товары без Ubercart? Или не товары, а книги в библиотеке, студентов в институте?

Решение нашлось на drupal.org.
Приведу пример того, как это решение работает. К примеру, есть сайт на котором информация о сантехнических товарах. Товаров много (хотя в примере всего 4 шт), цены на товары меняются часто. Поэтому имеется табличный файл с товарами и ценами из которого берутся данные для сайта.

Итак начнем.

0. Патчинг модуля Image Import.
1) Качаем Модуль Node Import версий 6.x-1.0-rc4 6.x-1.x-dev (у меня получилось с dev)
2) Читаем беседу этих умных людей http://drupal.org/node/422282
В этой беседе несколько вариантов патча модуля.

Там же в посте 13 есть ссылка на файл http://drupal.org/files/issues/node_import_update-422282_0.patch. Там написано, какие файлы нужно изменить в модуле, т.е.
supported/node.inc
node_import.inc

Знаком + отмечено какие строки добавить, знаком - какие удалить.
Пропатченый модуль прилагаю к посту.

1. Подготовка к импорту. С помощью CCK создадим новый тип материалов Товар. К этому типу прибавим:
1) текстовые поля Код и Цена, у.е.
2) поле Фото – создано модулями Imagecache + Imagefield. Перед импортом закачайте изображения на сервер.

Для типа Товар создадим в таксономии словарь Каталог с терминами:
- Смесители
- Сифоны

2. Создание CSV файла. В OpenOffice Calc подготовлена такая таблица:

Обратите внимание, ключевое поле не должно идти первым столбцом.
Сохраните файл в формате CSV. При сохранении укажите
Разделитель поля: ,
Разделитель текста: “
Кодировка: Юникод (UTF-8) (нажмите букву Ю и 3 раза стрелку вниз - там кодировок много)

3. Импорт товаров. На сайте выберите Управление – Содержание – Import Content – New Import. Вы попадаете на стартовую страницу импорта. Нажмите Далее.

В 1-м шаге мастера выберите, что будете импортировать товары, т.е. отметьте товар content type

Во 2-ом шаге загрузите CSV файл.
В 3-м шаге ничего трогать не надо, оставьте настройки как здесь:

4-й шаг. Здесь указывается, какие столбцы из CSV файла импортируются в какие атрибуты товара. Заполните значения как показано на рисунке.

На 5-ом шаге установите ключевое поле для товаров, т.е Update key: Код.

На 6-ом шаге ничего указывать не надо, на 7-ом шаге вы можете увидеть товары, которые добавляются на сайт. На 8-м шаге можно нажать Start Import. Все, товары на сайте! Такие как этот:

Данный пример наглядно иллюстрирует, что модуль Node Import прекрасно добавляет (и обновляет) на сайт фото, поля CCK и значения таксономии. Пример простой, чтобы было понятно. В реальности все сложнее.

Выражаю благодарность tauno http://drupal.org/user/105595 за то что это придумал это, пользователям volocuga и glu2006 за то что подсказали.

ВложениеРазмер
Иконка пакета module_node_import_dev.zip122.77 КБ

Комментарии

Аватар пользователя masterkust masterkust 9 января 2010 в 15:22

После того как нажимаешь "Start Import"
Выскакивает ошибка
user warning: Unknown column 'file_offset' in 'field list' query: INSERT INTO node_import_tasks (name, uid, created, changed, fid, has_headers, file_options, headers, type, map, defaults, options, file_offset, row_done, row_error, status) VALUES ('444.csv', 1, 1263039207, 1263039207, 468, 1, 'a:11:{s:11:\"file_format\";s:3:\"csv\";s:16:\"record separator\";s:9:\"<newline>\";s:22:\"other record separator\";s:0:\"\";s:15:\"field separator\";s:1:\",\";s:21:\"other field separator\";s:0:\"\";s:14:\"text delimiter\";s:1:\"\"\";s:20:\"other text delimiter\";s:0:\"\";s:16:\"escape character\";s:1:\"\"\";s:22:\"other escape character\";s:0:\"\";s:5:\"title\";s:22:\"Comma Separated Values\";s:4:\"mime\";s:27:\"text/comma-separated-values\";}', 'a:5:{i:0;s:16:\"Название\";i:1;s:14:\"Артикул\";i:2;s:8:\"Цена\";i:3;s:8:\"Кака\";i:4;s:8:\"Фото\";}', 'node:page', 'a:10:{s:5:\"title\";s:1:\"0\";s:6:\"format\";s:0:\"\";s:4:\"body\";s:1:\"3\";s:7:\"created\";s:0:\"\";s:3:\"uid\";s:0:\"\";s:6:\"sticky\";s:0:\"\";s:7:\"promote\";s:0:\"\";s:6:\"status\";s:0:\"\";s:4:\"path\";s:0:\"\";s:7:\"comment\";s:0:\"\";}', 'a:9:{s:7:\"comment\";s:1:\"0\";s:6:\"format\";s:1:\"1\";s:3:\"uid\";s:5:\"admin\";s:7:\"created\";s:0:\"\";s:3:\"log\";s:26:\"Imported with node_import.\";s:6:\"status\";s:1:\"1\";s:7:\"promote\";s:1:\"0\";s:6:\"sticky\";s:1:\"0\";s:4:\"type\";s:4:\"page\";}', 'a:1:{s:3:\"key\";s:0:\"\";}', 0, 0, 0, 0) in /home/kust/domains/ethnostyle.net/public_html/includes/common.inc on line 3467.

С чем это может быть связано?

Установлен Уберкарт-2. Пробовал импортировать как Товары, так и Страницы — в конце выскакивает эта ошибка Sad

Это для Node Import версии 6.x-1.x-dev.

Также робовал устанавливать модуль Node Import версий 6.x-1.0-rc4 (как пропатченный, так и непропатченный). На третем шаге появляется белый экран.

Аватар пользователя VasyOK VasyOK 1 ноября 2010 в 1:59

В данном примере описано как заливать и обновлять товары без Уберкарт. Если вам нужен Уберкарт, то приведенный здесь пропатченный модуль наверное не подходит.
С уберкартом я такое еще не вытворял, но судя по базарам есть несколько вариантов патчинга Node Import под Уберкарт.
А патчить там есть чего.

1) Вот сдесь патч обновляющий товары по SKU
http://drupal.org/node/422282
Поищите там в каком то посте приведен.

2) http://www.drupal.ru/node/17859 читайте последние посты этой беседы, что там подправить надо.

3) http://www.drupal.ru/node/37365 Вот сдесь мы обсуждали это с неким Санчесом. У него вроде все получилось (в конце).

Аватар пользователя volocuga volocuga 10 января 2010 в 2:02

Так,а ноды с переводом пробовал? Русский и украинский к примеру на сайте есть.

Ещё:тема получения начального CVS (который будет использован из множества уже существующих нод для последующего обновления) не раскрыта

Аватар пользователя masterkust masterkust 10 января 2010 в 17:09

masterkust wrote:
После того как нажимаешь "Start Import"
Выскакивает ошибка
user warning: Unknown column 'file_offset' in 'field list' query: INSERT INTO node_import_tasks (name, uid, created, changed, fid, has_headers, file_options, headers, type, map, defaults, options, file_offset, row_done, row_error, status) VALUES ('444.csv', 1, 1263039207, 1263039207, 468, 1, 'a:11:{s:11:\"file_format\";s:3:\"csv\";s:16:\"record separator\";s:9:\"<newline>\";s:22:\"other record separator\";s:0:\"\";s:15:\"field separator\";s:1:\",\";s:21:\"other field separator\";s:0:\"\";s:14:\"text delimiter\";s:1:\"\"\";s:20:\"other text delimiter\";s:0:\"\";s:16:\"escape character\";s:1:\"\"\";s:22:\"other escape character\";s:0:\"\";s:5:\"title\";s:22:\"Comma Separated Values\";s:4:\"mime\";s:27:\"text/comma-separated-values\";}', 'a:5:{i:0;s:16:\"Название\";i:1;s:14:\"Артикул\";i:2;s:8:\"Цена\";i:3;s:8:\"Кака\";i:4;s:8:\"Фото\";}', 'node:page', 'a:10:{s:5:\"title\";s:1:\"0\";s:6:\"format\";s:0:\"\";s:4:\"body\";s:1:\"3\";s:7:\"created\";s:0:\"\";s:3:\"uid\";s:0:\"\";s:6:\"sticky\";s:0:\"\";s:7:\"promote\";s:0:\"\";s:6:\"status\";s:0:\"\";s:4:\"path\";s:0:\"\";s:7:\"comment\";s:0:\"\";}', 'a:9:{s:7:\"comment\";s:1:\"0\";s:6:\"format\";s:1:\"1\";s:3:\"uid\";s:5:\"admin\";s:7:\"created\";s:0:\"\";s:3:\"log\";s:26:\"Imported with node_import.\";s:6:\"status\";s:1:\"1\";s:7:\"promote\";s:1:\"0\";s:6:\"sticky\";s:1:\"0\";s:4:\"type\";s:4:\"page\";}', 'a:1:{s:3:\"key\";s:0:\"\";}', 0, 0, 0, 0) in /home/kust/domains/ethnostyle.net/public_html/includes/common.inc on line 3467.

С чем это может быть связано?

Установлен Уберкарт-2. Пробовал импортировать как Товары, так и Страницы — в конце выскакивает эта ошибка Sad

Это для Node Import версии 6.x-1.x-dev.

Проблему решил тем что запустил /update.php

Аватар пользователя VasyOK VasyOK 10 января 2010 в 20:36

Двуязычный сайт + Node Import я делал. Но без перевода. Просто создал типы матриалов Товар рус, Товар укр.

Недостатки:
1) при перключении языка показывается не аналогичный товар на другом языке, а заглавная страница сайта на другом языке.

2) При добавлении товаров русских на сайт нужно находится в русском языке. С украинским аналогично.
На практике модератор может забыть это простое правило.

volocuga, что такое начальный CSV? Раскройте пожалуйста.

masterkust, мои поздравления!

Аватар пользователя Dan Dan 10 января 2010 в 20:59

[module=feeds] никто не пробовал использовать?
feeds - это feedapi generation next. Позволяет импортировать объекты друпала и просто сторонние данные. Я им не пользовался, поэтому интересуюсь.

Аватар пользователя masterkust masterkust 10 января 2010 в 21:34

Еще такая штука...
Если отсутствует термин, который указан в таблице, то выдается ошибка.
Было бы здорово, если бы этот термин создавался. Или это технически сложно?

Аватар пользователя VasyOK VasyOK 10 января 2010 в 22:14

masterkust, вы задумываетесь как раз над тем о чем задумывался я.

Варианты решения:
1) Выбрать импортировать термины для такого-то словаря, на первой странице импорта.

2) Перед импортов матриалов со многими терминами ставить для словаря "Теги", а потом убирать эту опцию.

3) Чисто гипотетически. Поставтить модуль Content Taxonomy и написать другой модуль, который при заполнении текстового поля автоматически копирует его содержание в другое (от модуля Content Taxonomy) поле. Ну или дописывать сам Node Import, чтобы он поддерживал Content Taxonomy. Как не знаю.

Аватар пользователя volocuga volocuga 10 января 2010 в 23:41

"VasyOK" wrote:
volocuga, что такое начальный CSV? Раскройте пожалуйста.

Раскрываю: есть допустим УЖЕ база инет шопа в 5000 нод.Решаешь использовать для апдейта node_import.Логично было сначала сгрузить это дело к себе в один или несколько файлов cvs и в дальнейшем оперировать с ней локально,выгружая результат на сайт.

Так вот,мне интересно кто чем пользуется в этом случае.Интересует практический опыт,теорию я знаю: есть и phpmyadmin,views_bonus_pack,feeds...

Аватар пользователя MGMaster MGMaster 7 марта 2010 в 20:54

Столкнулся с такой штукой, что если нет поля "Фото", то при импортировании товара, та что естьфотка удаляется. То есть если данных нет, то старые стираются.

Как можно сделать чтобы старые данные не затирались если новых не поступило?

Аватар пользователя VasyOK VasyOK 7 марта 2010 в 23:37

"MGMaster" wrote:
Как можно сделать чтобы старые данные не затирались если новых не поступило?

Меня эта проблема не волнует, т.к. старые данные хранятся в табличном файле. Если новые данные поступают, то они тоже сначала вносятся в табличный файл.

Иначе весь смысл того что я понаписывал пропадает.

MGMaster, если вам лень писать к каждому материалу название фотки, то не выбирайте поле Фото при импорте (4-й шаг).

Аватар пользователя MGMaster MGMaster 8 марта 2010 в 11:09

Дело в том, что имена фотографии в таблице мне не нужны. Но кое где я загружаю фотографии прямо на сайте. В табличном файле, колонка "Фото" у меня отсутствует. При этом на 4-м шаге напротив поля "Изображение" стоит параметр "Ни один". После импорта, загруженные изображения пропадают.

В принципе, если понять в каком месте в модуле значение присваивается полю, то можно дописать хук, но сам я это место не нашел.

Аватар пользователя egorovanton egorovanton 26 мая 2010 в 15:06

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:

Я его ставил, но по ходу не разобрался, потому что так и не понял как им перезаписывать node.

Аватар пользователя moromer moromer 16 августа 2010 в 2:32

"masterkust" wrote:
Проблему решил тем что запустил /update.php

Проблему ты не решил, а просто обновил модуль Node_Import с официального сайта. Т.о. пропатченный модуль из заголовка статьи заменился на официальный.
У меня точно такая же ситуация была. Как решить ее без Update.php - до сих пор не знаю.

Аватар пользователя kpv_dnepr@drupal.org kpv_dnepr@drupal.org 30 ноября 2010 в 19:05

Hello world

Никак не могу настроить импорт, осталось две ошибки

* Input error: "sd657_28_10.jpg" is not allowed for image (not a file in files).
* warning: mb_strlen() expects parameter 1 to be string, array given in /www/сайт/includes/unicode.inc on line 410.

Первая, почему то пишет что нет картинки, хотя они там где нужно?!
Вторая, вообще не понимаю что за ошибка?!

Может кто встречал, подскажет.

Аватар пользователя VasyOK VasyOK 30 ноября 2010 в 19:19

Input error: "sd657_28_10.jpg" is not allowed for image (not a file in files)

Вы уверенны что они там где нужно? Посмотрите настройки CCK поля, там путь для файлов. Потом посмотрите куда на сервере вы файлы скопировали.

Аватар пользователя antey antey 1 февраля 2011 в 17:00

Возникла ошибка на 7 шаге при попытке показать результат:

warning: array_keys() [function.array-keys]: The first argument should be an array in /путь до файла/sites/all/modules/uc_price_visibility/uc_price_visibility.module on line 62.
warning: Invalid argument supplied for foreach() in /путь до файла/sites/all/modules/uc_price_visibility/uc_price_visibility.module on line 62.
warning: Invalid argument supplied for foreach() in /путь до файла/sites/all/modules/filefield_paths/modules/filefield.inc on line 50.

где ошибка?

Выключив пару модулей. ошибка пропала. Однако описание на 7 шаге не показывает, и категории не те, левые.

Аватар пользователя RuGeN RuGeN 9 марта 2011 в 20:13

kpv_dnepr@drupal.org , у меня такой же вопрос ... скопировал изображения во все возможные папки (для проверки) ... причем, сначала все загружалось, затем перестали загружаться некоторые товары из файла ... а затем и все

Аватар пользователя antey antey 10 марта 2011 в 5:33

"RuGeN" wrote:
скопировал изображения во все возможные папки (для проверки) ... причем, сначала все загружалось, затем перестали загружаться некоторые товары из файла ... а затем и все
Идет проверка на наличие картинки и запись ее в базу, если картинка есть - ошибка.

Аватар пользователя RuGeN RuGeN 10 марта 2011 в 11:52

хммм ... дык получается ее там не должно быть, в директории?
на сколько помню наоборот она там уже должна находиться до завершения импорта ...

Аватар пользователя antey antey 10 марта 2011 в 13:07

"RuGeN" wrote:
хммм ... дык получается ее там не должно быть, в директории?
на сколько помню наоборот она там уже должна находиться до завершения импорта ...
Запись о файле уже есть в базе, получаем ошибку при добавлении аналогичной записи.

Аватар пользователя RuGeN RuGeN 10 марта 2011 в 20:50

СПАСИБО, ДРУГ ... никогда не догадался бы что в эту сторону копать нужно, мал еще в этих вопросах Smile
Я даже аву поставил в эту честь ... давно хотел, а тут такой повод ... РЕСПЕКТ)))
... только как в данном случае убрать из базы старые записи, чета не хочется весь .csv править ...

Аватар пользователя VasyOK VasyOK 10 марта 2011 в 21:57

Боюсь для этого придется патчить модуль гораздо глубже. Если кто знает варианты прошу. Кстати один формучанин написал модуль импорта из Excel и там эта опция есть. Вот только модуль хорошо работает только в комплекте с форумчанином.

Аватар пользователя Cube Cube 7 июня 2011 в 1:28

У меня доходит до 7-ого шага и выкидывает ошибку:
warning: Parameter 2 to drupal_retrieve_form() expected to be a reference, value given in Z:\home\localhost\www\drupal\sites\all\modules\node_import\node_import.inc on line 1947.

Не понимаю в чем дело. После слова "Record 1: " должно выводить первый пост который импортируется, а в первом, и во всех случаях, пишется ошибка которая представлена сверху.

В чем может быть причина?