xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Описание

Модуль 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
Похожие записи

Комментарии RSS

Хорошая статья. Всё ли у Вас корректно было с датами при импорте? У меня не работает, если формат поля даты - пользовательский формат, а не список выбора. Список выбора подразумевает выбор из диапазона дат (годов), а у меня могу быть и 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 шаге.
Вот ошибка:

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 символов. Подскажите что делать?

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

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

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

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

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

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании