Drupal → Импорт материалов с помощью модуля Node Import

19.07.2010

Описание

Модуль Node Import позволяет импортировать материалы из CSV (Comma Seperated Values) и TSV (Tab Seperated Values) файлов.

Помимо нод можно импортировать:

— Синонимы
— Словари и термины
— Пользователей

Поддерживает CCK поля:

— Number
— Text
— Date
— Email
— Node reference
— User reference
— ImageField
— FileField

Установка

  1. Скачиваем модули Node import, Date и Advanced help
  2. Распаковываем в sites/all/modules
  3. Включаем модуль 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 файл

При сохранении файла указываем формат Текст CSV, кодировка Юникод (UTF-8) (только такая и никакая другая), разделитель поля , (запятая), разделитель текста — " (двойная кавычка):

Диалог сохранения файла
Диалог настроек сохраняемого файла

Шаг 1.

Идём на страницу admin/content/node_import и создаём новый импорт:

Главная страница модуля Node Import

Читаем справку, жмём Далее:

Краткая справка

Выбираем тип содержимого (в нашем случае Товар) и жмём далее:

Шаг 2.

Загружаем CSV файл и жмём далее:

Форма загрузки файла
Файл успешно загружен

Шаг 3.

Выбираем формат CSV файла:

Выбор формата 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.

Импорт:

Импорт материалов

С виду сложно, но стоит один раз попробовать и разобраться с процессом, дальше будет легче.

Видео пример процесса импорта материалов.

Написанное актуально для
Node Import 6.x-1.0-rc4
Похожие записи

Комментарии

Павел
19.07.2010, 12:18

Хорошая статья. Всё ли у Вас корректно было с датами при импорте? У меня не работает, если формат поля даты - пользовательский формат, а не список выбора. Список выбора подразумевает выбор из диапазона дат (годов), а у меня могу быть и 1999, и 1973.

Павел
19.07.2010, 12:54

Вероятно. А для чего Вы ставили Date? :-)

Павел
19.07.2010, 15:53

Не будете пробовать загружать материалы с датами? Просто я уже на протяжении месяца бьюсь и не могу найти решение...

с пользовательским форматом у меня тоже не получилось, на d.org подсказали что можно временно выставить тип как список и прописать диапазон дат -100:+100. так заработало. тестировал на последней dev версии модуля

Павел
19.07.2010, 17:32

Благодарю. В принципе, этого будет достаточно. ;-) Ещё посмотрю, как можно "хакнуть" на предмет "больше 100". :-)

да там можно любые цифры вписать

Павел
19.07.2010, 17:47

Тем более здорово! Спасибо, я боялся эти цифры менять. :-)
Главное, наверное, теперь в формах этот реквизит не заполнять. ;-) Спасибо Вам большое, андэд.

Павел
28.07.2010, 23:21

Пришлось в настройках словаря Разделы отметить опцию Теги и снять галку с Требуемый

Разве это верный выход, если у словаря не должно быть тегов и выбор должен быть единичным?
Столкнулся с такой проблемой. Поставил "стабильную" версию (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/
Заранее спасибо за советы.

адрес картинки какой указываете?

Сергей
31.03.2011, 00:09

А как Друпал определит какое значение соответствует какому полю, например, товара в магазине?

Я хочу загружать товары через csv.

Есть тип товара Мобильный телефон. Есть поля Изображение, Форм-фактор, Время работы в режиме ожидания, Время работы в режиме разговора.

Как мне озаглавить эти столбики в CSV?

Гость
10.04.2011, 02:12

В конце при импорте выдаёт такую ошибку: "Input error: is not allowed for Catalog (not a term or synonym in Catalog)"

Гость
12.04.2011, 19:04

Спасибо статья отличная, кто нить знает как импортировать атрибуты в ubercart с помощью этого модуля

У меня возникла проблема, почему то значения цены не импортируется из прайса, не подскажите в чем может быть проблема ?

Гость
23.06.2011, 14:27

Привет всем ! кто знает в чем проблема, возникает на 3 шаге.
Вот ошибка:

Fatal error: Call to undefined function node_import_type_is_node() in /home/u711/uvelirgold.siteactiv.ru/www/sites/all/modules/node_import/supported/locale.inc on line 13

вот этот файл:
http://pastebin.com/f0GUCA4z

А как исключить некоторые поля, чтобы они оставались неизменными. А то делаю импорт из прайсов, затираются изображения и описания ?=(

У меня в body при импорте режется текст до 255 символов. Подскажите что делать?

Гость
18.11.2011, 00:24

А как исключить некоторые поля, чтобы они оставались неизменными. А то делаю импорт из прайсов, затираются изображения и описания ?=(

Очень актуально

Отличный обзор и отличный модуль, Но...
К моему типу материала прикручен Шедулер, и в заданную дату материал должен быть снят с публикации. При импорте ноды нет поля для заполнения даты снятия. Как решить эту проблему?

Да, у меня есть поле, где я указываю дату окончания акции, и оно совпвдает с датой снятия с публикации. Дату окончания акции я легко задаю, поскольку это простое ССК поле. Может есть возможность уже в шаблоне самой ноды прописать полю планировщику значение поля ССК с датой? Надеюсь понятно изложил идею. Заранее спасибо за ответ

Понаглею немного )) А можно более подробно услышать от специалистов информацию, а то не силен в таких делах. Спасибо

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

<?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);
?>

Вот здесь эта тема обсуждалась. Но я не понял куда нужно вставить этот код. Вставил в шаблон своего типа материалов, вроде все выводит как нужно, но вот только сам планировщик не срабатывает - не снимает материал с публикации. Что не так?

Гость
02.02.2012, 16:57

А можно как-то добавить при импорте поле "товар на складе"?

Гость
18.02.2012, 20:36

А как русифицировать Модуль Node Import

Гость
01.03.2012, 02:40

Подскажите пожалуйста если нужно чтобы при импорте создавались подкатегории, как правильно надо оформить в сsv колонку? Пробовал в одной колонке описать- категория<<подкатегория, но пока не получилось.

Гость
03.03.2012, 14:55

попробуйте по-другому категория>>подкатегория

Гость
03.03.2012, 14:56

Подскажите, что нужно исправить, чтобы, когда не выбираешь поле, оно не затиралось?
Выше был этот вопрос, но остался без ответа.

Использую модули node import и node import update для импорта материала в ubercart. Столкнулся с такой проблемой:

Одно из cck-полей отсутствует в импорте и должно заполнятся модератором. Но при импорте нод это поле затирается, т.к. из прайса оно не берется. Модуль node import получаеться затирает поля если вы их не выбрали при импорте материала, а это очень не удобно допустим при наполнениии интернет магазина товарами где просто нужно менять цену товара налицие на складе и так далее. Другими словами нужно чтоб импорт не затрагивал одно из полей при импорте материала. Может кто сталкивался с данной проблемой?

приветствую,

если связанные записи полей (node reference) отсутствуют в друпале, тогда новая запись не импортируется; выскакивает ошибка.

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

А как указать id автора имортируемой ноды?

Татьяна
21.04.2012, 11:25

Очень толковый материал! Давно не сталкивалась с такой подробной инструкцией!

Татьяна
21.04.2012, 12:27

Только присоединяюсь к вопросу, как можно с помощью этого модуля обновлять существующие ноды?

Роман
21.04.2012, 13:06

С этим сложно, нужна доработка модуля, пишите, возможно, смогу помочь forums.82@mail.ru

Т.е. сейчас модуль позволяет импортировать только от одного автора? причем не понятно от какого.

На третьем шагу выдает белый экран и ошибку

Fatal error: Call to undefined function filefield_data_info() in /modules/node_import/supported/filefield/filefield.inc on line 39

Подскажите куда смотреть?

xandeadx, Это я видел, но там ответов нет( только вопрос.

Fatal error: Call to undefined function filefield_data_info() in /modules/node_import/supported/filefield/filefield.inc on line 39

Помогло обновление модуля filefield

Как указывать дату и время в CSV-файле при импорте. Например, импортировать поле дата с данными: 14.01.2012 08:00

Гость
11.03.2013, 18:36

Preview import (step 7 of 8)

У меня проблема !
Термины не импортируются

пробовал так Тест||Тест2 и Тест>>Тест2 выдает:

Input error: is not allowed for Каталог товаров (not a term or synonym in Каталог товаров).
Input error: is not allowed for Каталог товаров (not a term or synonym in Каталог товаров).
Input error: is not allowed for Каталог товаров (not a term or synonym in Каталог товаров).

Как решить?

Валерий
11.03.2013, 18:47

В настройках словаря стоит "множественный выбор" если поставить "теги" все работает но нет иерархии!

Григорий
11.06.2013, 12:59

Что-то никак не пойму одну фишку.
У меня в csv есть поле date и поле period
При импорте я делаю настройки для этих полей
Для date - пользовательский d.m.Y так как даты там вида 05.06.2013,
разделитель указываю запятую ','. Даты там встречаются не по одной, бывает несколько..
В поле period у меня лежат даты от и до вида 11.05.2013-06.07.2013,
и также их может быть несколько, указываю разделитель - запятую, так как если их несколько то они идут через запятую.
В CCK это одно поле field_date типа Datetime. В настройках свойство "До даты"
установлено "необязательно".
Когда делаю настройки данного поля, то как указать, что присутствует вторая метка даты? При предпросмотре те даты, которые просто идут через запятую, одна за другой, отображаются корректно, но там, где даты установлены как "от и до" вида "12.05.2013-20.06.2013, 22.05.2013-15.06.2013" дата не отображается и не выдается ошибка. Настройки форматы даты для этого типа делаю как "d.m.Y-d.m.Y".
Помогите пожалуйста. Куда копать? В сторону парсера? Или такой возможности еще не заложено в модуль?

Виноградов Юрий
24.12.2013, 07:38

Можно ли использовать задачу повторно? Если да, то как?

Азамат
28.01.2014, 13:00

Как импортировать большие куски текста с html разметкой (div, br, p и тд). Скажем новости. Никак не получается. Все настроил. Но сиэсви файл получается не корректным. там и запятых и точек с запятой куча, те разделителей.. Импрот идет, но ноды не добавляются.

Пробовал создать простой сиэсви файл в блокноте. 1 предложение название статьи, 1 предложение текст статьи. Все импортируется без проблем.

Виноградов Юрий
07.02.2014, 11:04

Азамат: используйте в качестве разделителей табуляцию. Конечно, предварительно из текста табуляции нужно вычистить.

Азамат
13.02.2014, 13:57

Спасибо за отзыв. Все получилось!

Я делал файл в exel, а при сохранении exel выдает разделители только запятые (но на самом деле сохраняет с точкой запятой)

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

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