• урок
  • 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
Сергей
26.04.2016

Большое спасибо за статью, всё разжовано и доходчиво :-)
Но столкнулся с проблемой, которая в статье не описана, а именно:
Мой файл импорта разделён не ",", а ";".
В настройках я изменил разделитель , и всё импортируется как нужно и всё супер. Кроме одного, а именно: у меня есть поле Теги, и в нём они идут в таком виде:
комедия,семейный,2000
и модуль импортирует всю эту строку как 1 тег, а не как 3.
Подскажите пожалуйста, как можно исправить эту ситуацию средствами друпала, чтобы каждый тег импортировался отдельно.
Вариант с редактированием файла отпадает, потому как в нём более 7 миллионов строк.

Большое спасибо за внимание, буду рад любому ответу.

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

Модуль feeds tamper