Drupal → Импорт материалов с помощью модуля Node Import
Описание
Модуль Node Import позволяет импортировать материалы из CSV (Comma Seperated Values) и TSV (Tab Seperated Values) файлов.
Помимо нод можно импортировать:
— Синонимы
— Словари и термины
— Пользователей
Поддерживает CCK поля:
— Number
— Text
— Date
— Email
— Node reference
— User reference
— ImageField
— FileField
Установка
- Скачиваем модули Node import, Date и Advanced help
- Распаковываем в sites/all/modules
- Включаем модуль Node import на странице admin/build/modules
Использование
В качестве примера импортирую несколько материалов типа Товар (product) с двумя CCK полями: Цена (обычное поле типа Целое число) и Картинки (модуль ImageField). Так же к типу материала привязаны два словаря — Раздел и Теги.
Для создания CSV файла лучше воспользоваться OpenOffice-ом, он в отличии от MS Excel умеет сохранять эти файлы в юникоде. Если всё же используется Excel, то перед импортом нужно будет конвертировать csv файл в кодировку UTF-8 without BOM (сделать это можно с помощью популярного редактора Notepad++).
Шаг 0.
В OpenOffice создаём документ Электронная таблица. Первой строкой прописываем названия полей, которые будут участвовать в импорте. Набор и порядок полей может быть любой, единственно условие это наличие обязательных полей — Заголовок и Раздел (только для данного примера). Следующими строками — сами данные.
Если у поля несколько значений, то они разделяются с помощью запятой. Например в поле Картинки может быть несколько картинок, соответственно выглядеть это должно как image1.jpg,image2.jpg. Или в поле Теги может быть несколько тегов, соответственно — тег1,тег2.
Имена файлов в полях типа ImageField и FileField, должны быть относительно директории sites/default/files. Т.е. если картинки находятся в папке sites/default/files/images, то в csv они должны выглядеть как images/image1.jpg,images/image2.jpg. Важно: картинки должны обязательно существовать, т.е. перед импортом их необходимо залить на сервер.
Пример CSV файла:
При сохранении файла указываем формат Текст CSV, кодировка Юникод (UTF-8) (только такая и никакая другая), разделитель поля , (запятая), разделитель текста — " (двойная кавычка):
Шаг 1.
Идём на страницу admin/content/node_import и создаём новый импорт:
Читаем справку, жмём Далее:
Выбираем тип содержимого (в нашем случае Товар) и жмём далее:
Шаг 2.
Загружаем CSV файл и жмём далее:
Шаг 3.
Выбираем формат CSV файла:
Для OpenOffice это первый формат в списке — Значения разделены запятой, для MS Excel второй — Значения разделены точкой с запятой.
Выбирая формат данных и нажимая кнопку Обновить, нужно добиться чтобы под формой выбора форматов, отобразилась корректная таблица:
Шаг 4.
Для каждого поля материала, указываем соответствующее поле из CSV файла:
Шаг 5.
Устанавливаем опции импорта, а именно разделители в полях с несколькими значениями (в нашем примере это везде запятая ,):
Шаг 6.
Устанавливаем значения по умолчанию. Эти значения будут подставлены в отсутствующие поля:
Шаг 7.
Предварительно просматриваем результат импорта. В идеале должны увидеть жёлтенькие ноды со всеми необходимыми полями:
Если на этом этапе возникли ошибки, то их нужно исправить, например отредактировав залитый на сервер csv файл, и нажать кнопку Обновить.
Например, первый раз у меня вылезла ошибка (скриншот):
warning: Illegal offset type in isset or empty in J:\path\to\drupal\sites\all\modules\node_import\node_import.inc on line 576.
Поле Разделы обязательно для заполнения.
Пришлось в настройках словаря Разделы отметить опцию Теги и снять галку с Требуемый (скриншот).
Если всё хорошо, жмём далее.
Шаг 8.
Последний шаг перед импортом. Ознакамливаемся с опциями импорта и жмём Начать импорт:
Шаг 9.
Импорт:
С виду сложно, но стоит один раз попробовать и разобраться с процессом, дальше будет легче.








Комментарии
Хорошая статья. Всё ли у Вас корректно было с датами при импорте? У меня не работает, если формат поля даты - пользовательский формат, а не список выбора. Список выбора подразумевает выбор из диапазона дат (годов), а у меня могу быть и 1999, и 1973.
дата это cck поле?
Вероятно. А для чего Вы ставили Date? :-)
его требует Node import
Не будете пробовать загружать материалы с датами? Просто я уже на протяжении месяца бьюсь и не могу найти решение...
с пользовательским форматом у меня тоже не получилось, на d.org подсказали что можно временно выставить тип как список и прописать диапазон дат -100:+100. так заработало. тестировал на последней dev версии модуля
Благодарю. В принципе, этого будет достаточно. ;-) Ещё посмотрю, как можно "хакнуть" на предмет "больше 100". :-)
да там можно любые цифры вписать
Тем более здорово! Спасибо, я боялся эти цифры менять. :-)
Главное, наверное, теперь в формах этот реквизит не заполнять. ;-) Спасибо Вам большое, андэд.
Разве это верный выход, если у словаря не должно быть тегов и выбор должен быть единичным?
Столкнулся с такой проблемой. Поставил "стабильную" версию (rc4), и началось.
ну никто же не мешает после импорта вернуть всё на место
Спасибо автору! Давненько не видел таких полноценных и качественных статей. Очень полезно.
Приветствую всех.
Кто поможет разобраться с этим модулем. Проблема появляется на 7ом шаге "Вы должны закачать картинку". И ниже выводит код:
values = Array ( [created] => [node_import_build_mode] => 1 [title] => Тестовый титл [cck:field_body:value] => [cck:field_imagenew:fid] => Array ( [0] => 66 ) [cck:field_title:value] => [cck:field_imagenew:data] => [format] => 2 [type] => image [body] => Тестовый большой при большой текстовище [cck:field_imagenew:list] => Array ( [0] => 1 ) [uid] => 1 [log] => Импортировано с помощью node_import [revision] => 0 [status] => 1 [sticky] => 0 [promote] => 0 [moderate] => 0 [comment] => 0 [path] => [name] => admin [taxonomy] => Array ( [tags] => Array ( [5] => ) ) [field_body] => Array ( ) [field_imagenew] => Array ( [0] => Array ( [fid] => 66 [list] => 1 [data] => ) ) [field_title] => Array ( ) [op] => Просмотреть )Картинку заливаю в sites/default/files/images/
Заранее спасибо за советы.
адрес картинки какой указываете?
в поле прописываю images/image.jpg
к сожалению не знаю
Не пойму одного. Откуда брать названия столбиков http://xandeadx.ru/sites/default/files/images/part-3/20101907052421.png
Делаю 1 сайт на Друпале. Помогите
названия могут быть любыми
А как Друпал определит какое значение соответствует какому полю, например, товара в магазине?
Я хочу загружать товары через csv.
Есть тип товара Мобильный телефон. Есть поля Изображение, Форм-фактор, Время работы в режиме ожидания, Время работы в режиме разговора.
Как мне озаглавить эти столбики в CSV?
прочитайте про 4-ый шаг
спасибо
В конце при импорте выдаёт такую ошибку: "Input error: is not allowed for Catalog (not a term or synonym in Catalog)"
Спасибо статья отличная, кто нить знает как импортировать атрибуты в ubercart с помощью этого модуля
У меня возникла проблема, почему то значения цены не импортируется из прайса, не подскажите в чем может быть проблема ?
Привет всем ! кто знает в чем проблема, возникает на 3 шаге.
Вот ошибка:
вот этот файл:
http://pastebin.com/f0GUCA4z
А как исключить некоторые поля, чтобы они оставались неизменными. А то делаю импорт из прайсов, затираются изображения и описания ?=(
У меня в body при импорте режется текст до 255 символов. Подскажите что делать?
А как исключить некоторые поля, чтобы они оставались неизменными. А то делаю импорт из прайсов, затираются изображения и описания ?=(
Очень актуально
Отличный обзор и отличный модуль, Но...
К моему типу материала прикручен Шедулер, и в заданную дату материал должен быть снят с публикации. При импорте ноды нет поля для заполнения даты снятия. Как решить эту проблему?
Да, у меня есть поле, где я указываю дату окончания акции, и оно совпвдает с датой снятия с публикации. Дату окончания акции я легко задаю, поскольку это простое ССК поле. Может есть возможность уже в шаблоне самой ноды прописать полю планировщику значение поля ССК с датой? Надеюсь понятно изложил идею. Заранее спасибо за ответ
в node import это сделать наверно не получится, пользуйтесь сниппетами
Понаглею немного )) А можно более подробно услышать от специалистов информацию, а то не силен в таких делах. Спасибо
Вот нашел один код, который мне, вроде подходит, с кодом разобрался что к чему.
<?php $default_duration = '+180 days'; // # Default number of days to stay active if no unpublish date given $tempS = $node->field_adstartdate[0]['value']; // Start Date $tempE = $node->field_adendate[0]['value']; // End Date // Debug stuff echo "Saving New Content\n\n\n\n\n\n\n"; echo "Start Date: " . $tempS . "\n"; echo "End Date: " . $tempE . "\n"; echo "Default Duration: " . $default_duration . "\n"; // if ( is_null($tempS) ) { $node->publish_on = strtotime('now'); } else { $node->publish_on = strtotime($tempS); } if ( is_null($tempE) ) { $node->unpublish_on = strtotime($default_duration); // # Keep published for default duration from right now } else { $node->unpublish_on = strtotime($tempE); } return array("node" => $node); ?>Вот здесь эта тема обсуждалась. Но я не понял куда нужно вставить этот код. Вставил в шаблон своего типа материалов, вроде все выводит как нужно, но вот только сам планировщик не срабатывает - не снимает материал с публикации. Что не так?
А можно как-то добавить при импорте поле "товар на складе"?
Оставить комментарий