• урок
  • pantey

Импорт из CSV в сущность Drupal. Модуль Feeds

09.08.2013

В жизни каждого разработчика, рано или поздно приходят такие моменты когда необходимо перенести какие-то данные, из какого-либо формата (xml, csv и т.д) на сайт, который как правило уже находится в продакшене и времени на разработку уже нет, тогда приходится писать свои различные парсеры, в зависимости от формата исходных данных. Но в Drupal, есть уже и готовые решения, которые смогут нам помочь без написания своих костылей, а именно сегодня затронем модуль Feeds. На своём личном опыте, парсил через него 2000 позиций номенклатуры, которые содержали дополнительные поля, изображения, описание и заголовок – время на обработку файл в формате CSV было потрачено примерно около 2х минут, причём обработку можно запускать в фоновом режиме, что не может не радовать. Итак, давайте на примере будет разбираться с данным модулем. Первым делом, что нам необходимо сделать - это скачать и включить сам модуль, думаю с этим у вас вопросов не должно возникнуть, не забываем так же про установку зависимостей для него. Давайте реализуем следующую задачу, есть исходные данные в файле формата CSV, который имеет следующие поля:

  • Заголовок
  • Описание
  • Категория

И есть тип материала «Товары», который так же содержит поля «Заголовок» и «Описание», а так же имеет словарь таксономии для определения категории товара, в моём случае тип материала выглядит вот так:

Структура словаря таксономии выглядит следующим образом:

И теперь нам необходимо из имеющегося файла формата CSV, выгрузить в тип материала «Товары» все данные, а именно Заголовок, Описание и привязку к категории, сам файл CSV для примера, вы можете скачать вот отсюда.

Итак, после активации модуля Feeds, в разделе «Структура» у вас появится дополнительный пункт «Feeds importers»

В котором нам будут доступны, 2 готовых импорта, это импорт «Нод» и импорт «Пользователей».

Я не буду затрагивать эти два импорта, а создам свой, что бы вы поняли как использовать данный модуль. Для этого жмём «Add importer»

Далее необходимо вписать название нашего будущего импорта и если хотите описание

Жмём «Далее». Теперь перед нами откроется страница с настройками нашего «импорта».

Приступим к настройке. Жмём «Настройки» и убираем периодичность импорта и оставляем галочку напротив «Import in submission» (запуск импорта по нажатию кнопки)

Далее «Сохранить». Теперь переходим в раздел «Сборщик», где нам необходимо выбрать откуда мы будем забирать данные, это может быть как удалённый сервер, так и локальный файл, в нашем случае это локальный файл, поэтому выбираем «File upload»

Жмём «сохранить». Далее переходим в настройки раздела «File upload», здесь мы можем вписать какие файлы могут быть загружены для импорта, видим, что в данном списке уже есть наш формат CSV, поэтому здесь всё оставляем по умолчанию

Переходим в раздел «Обработчик», где нам необходимо выбрать парсер для обработки нашего файла, в данном случае это «CSV parser»

Жмём «Сохранить». Переходим в раздел настройки «CSV parser», где мы можем выбрать знак разделителя полей, в данном случае в качестве разделителя у нас выступает «,», поэтому здесь оставляем настройки как есть

Переходим в раздел «Processor», где нам необходимо выбрать в какую сущность Drupal, мы будем импортировать данные, в данном случае у нас это ноды, поэтому выбираем «Node processor»

Жмём «Сохранить». Переходим в настройки «Node processor», где нам необходимо выбрать в какой тип материала мы будем производить импорт, в моём случае это «Товары», а так же выберем обновление уже имеющихся нод, и в качестве автора выберем «admin»

Жмём «Сохранить». Теперь переходим в «Mapping» раздела «Node processor», где нам необходимо выставить поля для соответствия, т.е. мы должны явно указать куда какие поля из файла CSV , мы должны залить в тип материала «Товары». У нас есть два исходных поля это «Источник», т.е название поля в файле CSV и «Цель», где мы должны выбрать поле типа материала.

Приступим, выбираем первое поле, которым у нас является «Заголовок», - оно у нас будет источником, а в качестве цели у нас соответственно будет так же «Заголовок».

Жмём «Сохранить». Для поля «Описание» по аналгии выбираем «Body»

Жмём «Сохранить». Теперь нам осталось лишь выбрать категорию, для этого источником у нас будет «Категория», а в качестве цели так же будет «Категория» (это название словаря, которое относится к данному типу материала)

И так же жмём «Сохранить». С настройками импорта мы закончили, теперь осталось лишь проверить, как это всё дело у нас заработает. Для этого переходим по адресу

  1. название_сайта/import

И выбираем только-что созданный нами импорт, в моём случае «Импорт товаров»

Далее выбираем наш файл CSV и жмём «Импорт»

После чего мы увидим сообщение, что создано 4 материала

Для отката импорта необходимо перейти в пункт «Delete items», где потом нажать «Удалить»

Но пока в этом у нас нет необходимости, давайте посмотрим, как теперь выглядят наши 4 новых материала на сайте:

Как мы видим, всё выгрузилось именно так, как нам и было нужно. Надеюсь, принципы работы данного модуля стали более менее понятны. Feeds это мощный модуль, который может справиться с 80% всех необходимых задач, ну а если задача сверх сложная, то есть универсальный фреймворк «Migration», который позволяет переносить всё что угодно и откуда угодно, о нём мы поговорим в дальнейших уроках, а пока на этом всё.

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (52)

Profile picture for user 1541
Николай
22.10.2013

Здрасти! возможно ли спарсить название товара, картинку цену и описание вот с этого сайта? http://posudniymir.ru

Profile picture for user pantey
pantey
22.10.2013

Конечно!

Profile picture for user 1541
Николай
22.10.2013

а как?? ткните носом ))

Profile picture for user 1541
Николай
22.10.2013

готового csv или другого файла нет, парсить удаленно или как? подскажи браток уже нет сил, мозг рвется

Profile picture for user 1541
Kokos
18.02.2014

вот этот файлик обработай в редакторе с помощью Поиск&Замена
http://posudniymir.ru/pricelist/?view=printable

Profile picture for user 1541
primkray
31.03.2014

Хороший у Вас стиль, все доступно и понятно. Очень интересно было бы почитать как парсить xml в друпал с дополнительными полями, к примеру дополнительными изображениями (несколько изображений с названиями к одному материалу)

Profile picture for user 1541
Максим
02.04.2014

Добрый день! А по крону из удаленного файла csv можно сделать?

Profile picture for user pantey
pantey
02.04.2014

да...

Profile picture for user 1541
Максим
02.04.2014

Еще вопрос! 70000 товаров осилит?

Profile picture for user pantey
pantey
02.04.2014

на счет этого, точно не скажу... пробуйте...

Profile picture for user 1541
vadim_n
21.04.2014

контент в виде стиха, с короткими строками! в файле нормально, а после импорта на странице сплошной текст, нету переноса в нужном месте строки! пробовал и в цсв и тхт форматы! как импортировать контент рус с переносами на новую строку? пробовал пошаманить с форматом текста почемуто не получилось задействовать теги бр

например:
title,body
"стих 1","Былик ли в моей жизни мужчины которых я хотела бы вернуть?
Нет. Но есть мужчина которого я не хотела бы потерять."
"стих 2","- Ну, и что он тебе сказал?
- Что любит меня.
- Прямо так сразу и сказал?
- Нет, как только я вышла замуж за другого."

а после импорта получилось:
Былик ли в моей жизни мужчины которых я хотела бы вернуть? Нет. Но есть мужчина которого я не хотела бы потерять.

- Ну, и что он тебе сказал?- Что любит меня.- Прямо так сразу и сказал?- Нет, как только я вышла замуж за другого.

Profile picture for user pantey
pantey
21.04.2014

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

Profile picture for user 1541
Akri
25.04.2014

Добрый день! Как же парсить остатки товаров на складе? Может есть дополнительные модули? Хелп!!!

Profile picture for user pantey
pantey
25.04.2014

ну если вы используете ubercart то можно воспользоваться этим модулем

Profile picture for user 1541
Ирина
02.10.2015

Доброго!
В форме настройки соответствий (где "select target") нет остатков. Есть альтернативный путь?

Profile picture for user 1541
vadim_n
25.04.2014

Уточните пожалуйста где именно эта посмотреть?

Profile picture for user 1541
Tun
19.05.2014

так а этим модулем можно перенести контент, например, ноды, с одного сайта на другой (если быть точным, то с 6 на 7-ку)? а то урок как-то резко обрывается... и что с фреймворк «Migration»? эта тема будет раскрыта на сайте?

Profile picture for user 1541
Denis
12.07.2014

А если мне нужно табличку где много полей перенести,то это возможно?
В материале должно быть столько же полей сколько и в таблице,и нужно указывать соответствие между всеми полями?http://radikal.ru/fp/c0fb6e92de3943259fcef58cb6030871][IMG]http://s006.radikal.ru/i215/1407/4b/23009d9b525ct.jpg

Profile picture for user 1541
Denis
12.07.2014

А если мне нужно табличку где много полей перенести,то это возможно?
В материале должно быть столько же полей сколько и в таблице,и нужно указывать соответствие между всеми полями?http://s006.radikal.ru/i215/1407/4b/23009d9b525c.jpg

Profile picture for user pantey
pantey
12.07.2014

да, для каждого поля необходимо выставлять соответствие.

Profile picture for user 1541
Koms
27.08.2014

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

Profile picture for user pantey
pantey
27.08.2014

не правильное соответствие полей для импорта.

Profile picture for user 1541
Вовка
28.10.2014

Подскажите а можно как-то передать дату публикации? в расчете на то что кое какие материалы попадут в отложку.

Profile picture for user pantey
pantey
28.10.2014

Дату добавить можно, про "отложку" не понял.

Profile picture for user 1541
Вовка
28.10.2014

Подскажите как передать дату создания в стандартное поле?

Profile picture for user pantey
pantey
28.10.2014

через

hook_node_presave()
Profile picture for user 1541
Deys
11.01.2015

Приветствую.
А если, необходимо ноду привязать к нескольким терминам таксоновии т.е. допустим: Товары-Авто-Зап. части. Как в CSV писать? Через запятую?

Profile picture for user pantey
pantey
12.01.2015

да, через запятую.

Profile picture for user 1541
Almi
23.01.2015

Что-то у меня не получается через запятую. Тип поля - Ссылка на термин, Виджет - Автозавершение ввода. Количество значений - 2.
Пробывал и через русскую запятую и через латиницу, и точку с запятой, и с пробелом и без. Если одно значение то все ОК. Если вожу 2 через запятую не одно не привязывается.
Подскажите пожалуйста, в чем может быть проблема?

Profile picture for user 1541
Almi
23.01.2015

Разобрался. Сделал при помоще Tamper

Profile picture for user 1541
Alex
30.01.2015

У меня не получается вывести имя пользователя пишет Опубликовано пт, 01/30/2015 - 23:45 пользователем Гость (не проверено), хотя я указал в Node processor автора. Помогите разобраться.

Profile picture for user 1541
Роман
05.02.2015

Добрый день.

А Вы случайно не подскажете, почему при импортировании нод feeds записи создает, но значения в поля не записывает и поля остаются пустыми ?

Profile picture for user pantey
pantey
05.02.2015

Скорее всего указали не правильный разделитель

Profile picture for user 1541
александр
10.03.2015

млин а как с ленты новостей RSS новость полностью скачать а не только заголовок и краткое описание

Profile picture for user pantey
pantey
10.03.2015

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

Profile picture for user 1541
александр
10.03.2015

http://feedex.net/ а подобное реально сделать на друпале

Profile picture for user pantey
pantey
10.03.2015

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

Profile picture for user 1541
Сергей-2
11.03.2015

Прошу подсказать: материал имеет несколько вложенных терминов таксономии (например: каталог, подраздел каталога, акция), импортируется только один первый термин. Материал предварительно экспортирован с того же сайта, так что структура типа материалов и католога терминов такие как долнжны быть, вроде бы. В остально все гладко. Как быть в таком случае?

Profile picture for user 1541
Сергей-2
11.03.2015

Разобрался с множественными полями: модуль Feeds Tamper, плагин Explode - объединение нескольких значений в массив. Вложенные термины таксономии импортируются как надо.

Profile picture for user 1541
Антон Евгеньевич
18.09.2015

Добрый день!
Во-первых, хочу поблагодарить автора за замечательную и доходчивую статью!
А теперь вопросы:
1. При составлении соответствий полей, почему то в выпадающем списке отсутствует поле "Цена". В чем может быть причина?
2. Как добавить импортируемые товары в Commerce?
Товары очень хорошо импортировались (кроме цены, т.к. такое поле добавить не смог), но при этом они не отражаются в разделе "Товары" в Commerce. Соответственно совершить покупку невозможно. Подскажите, пожалуйста, где копать?

Profile picture for user pantey
pantey
21.09.2015

может commerce_feeds вам поможет

Profile picture for user 1541
Антон Евгеньевич
21.09.2015

Спасибо. Уже разобрался. Дело действтвительно было в модуле commerce_feeds.

Profile picture for user 1541
Дмитрий
08.11.2015

Скажите, импорт происходит нормально, НО при импортировании код HTML потом на сайте так и показывается

название
и т.д.

Скажите где поменять, что бы код HTML импортировался как код.

Profile picture for user 1541
Дмитрий
13.12.2015

Здравствуйте.
У меня идет импорт из нескольких csv файлов. Состав - название, картинка, тег. Картинки складываю в папку.
Почему то при каждом импорте происходит дублирование картинок, типа было img1. При каждом импорте добавляется img1_0, потом img1_1 и так далее.
Подскажите пожалуйста что это? И как правильно организовать импорт, или как бороться с такой проблемой?

Profile picture for user pantey
pantey
13.12.2015

скорее всего у вас стоит "принудительное обновление" нод при каждом импорте. Отсюда и вытекает ваша проблема.

Profile picture for user 1541
Rav
06.01.2016

Здравствуйте.
У меня создаются ноды, но пустые в содержание заместо заголовка пишет -Новое.
Подскажите в чем проблема?

Profile picture for user 1541
Дмитрий
06.01.2016

Здравствуйте.
Это скорей всего ошибка при создании соответствий. Какое то поле соотнесено правильно, поэтому ноды создаются. А дальше ошибка.
Я в такой ситуации обычно все удаляю и начинаю заново по одному полю. То есть сделал соответствие например заголовку, сделал импорт проверил, если заголовок залился, то добавляю еще поле, если нет ищу ошибку. Ошибка может быть любая, даже грамматическая.

Profile picture for user 1541
Rav
07.01.2016

Здравствуйте еще раз! Где может быть ошибка в csv файле в поле заголовка?
все проверил перенес как там в поле источник ! не парсит даже заголовок все тоже самое. Разделители верные все верное. В типе материалов в форме убрал все обязательные поля. Не могу разобраться в чем проблема. В поле язык в содержание почему то пишет -Нейтральный по отношению к языку. Может в этом проблема ? Какой кодировкой должен быть фаил CSV ?

Profile picture for user 1541
Дмитрий
07.01.2016

ААА полнял )))) При редактирование фала в excl снимаются кавычки в файле Csv ))))

Profile picture for user 1541
Дмитрий
07.01.2016

Ошибка может быть любая, например "Заголовок" можно написать "Загловок" и все. Можно неправильно соотнести поля. Кодировка только UTF_8. EXEL не знаю как последние версии, раньше не сохранял в этой кодировке, поэтому я делаю в OPEN OFFICE. А вообще так подсказать очень сложно. Если уже совсем приперло и ничего не получается пиши в скайп ddd2207984 , только обозначься как то, а то слишком много спамеров развелось. Попробую помочь.