В жизни каждого разработчика, рано или поздно приходят такие моменты когда необходимо перенести какие-то данные, из какого-либо формата (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»
Жмём «Сохранить». Теперь нам осталось лишь выбрать категорию, для этого источником у нас будет «Категория», а в качестве цели так же будет «Категория» (это название словаря, которое относится к данному типу материала)
И так же жмём «Сохранить». С настройками импорта мы закончили, теперь осталось лишь проверить, как это всё дело у нас заработает. Для этого переходим по адресу
название_сайта/import
И выбираем только-что созданный нами импорт, в моём случае «Импорт товаров»
Далее выбираем наш файл CSV и жмём «Импорт»
После чего мы увидим сообщение, что создано 4 материала
Для отката импорта необходимо перейти в пункт «Delete items», где потом нажать «Удалить»
Но пока в этом у нас нет необходимости, давайте посмотрим, как теперь выглядят наши 4 новых материала на сайте:
Как мы видим, всё выгрузилось именно так, как нам и было нужно. Надеюсь, принципы работы данного модуля стали более менее понятны. Feeds это мощный модуль, который может справиться с 80% всех необходимых задач, ну а если задача сверх сложная, то есть универсальный фреймворк «Migration», который позволяет переносить всё что угодно и откуда угодно, о нём мы поговорим в дальнейших уроках, а пока на этом всё.
Комментарии (52)
Большое спасибо за статью, всё разжовано и доходчиво :-)
Но столкнулся с проблемой, которая в статье не описана, а именно:
Мой файл импорта разделён не ",", а ";".
В настройках я изменил разделитель , и всё импортируется как нужно и всё супер. Кроме одного, а именно: у меня есть поле Теги, и в нём они идут в таком виде:
комедия,семейный,2000
и модуль импортирует всю эту строку как 1 тег, а не как 3.
Подскажите пожалуйста, как можно исправить эту ситуацию средствами друпала, чтобы каждый тег импортировался отдельно.
Вариант с редактированием файла отпадает, потому как в нём более 7 миллионов строк.
Большое спасибо за внимание, буду рад любому ответу.
Модуль feeds tamper