Скрипт экспорта в базу публикаций Drupal

import-export

Когда заказывают переделать сайты с «историей», приходится перетаскивать имеющиеся публикации на новый сайт. Хочу поделиться некоторыми моментами, связанными с программированием такого рода задач в Drupal.

Вот типовые операции, которые возникают при переносе статьи:

  • Загрузка картинки(-нок) в специальные поля публикации, экспорт картинок из текста статьи;
  • сохранение старого url;
  • сохранение текста и тизера статьи;
  • создание и сохранение объекта публикации (node);
  • заполнение каких то дополнительных полей.

Когда у вас 15-20 статей, то данные операции производятся вручную. А вот когда число статей переваливает за сотню, то время ручной работы сравнивается с временем создания скрипта для переноса. А если вы создаёте такие скрипты регулярно, то порогом может стать необходимость скопировать всего 40-50 статей. Вообще, я предпочитаю, чтобы переносом занимались «специально обученные люди». :)

Что я хочу получить от программы?

Я задаю url переносимой с сайта-донора статьи, жму «ОК» и получаю статью уже на сайте под Drupal. Картинки в процессе переноса тоже копируются в папку пользовательских файлов нового сайта.

Что отличает разные источники друг от друга?

Каждый сайт имеет уникальную верстку и набор атрибутов публикаций. Поэтому вам нужно определить, что вы сможете легко извлечь из HTML кода, опираясь на характерные фрагменты шаблона. Т.е. вначале надо изучить как выглядит статья в шаблоне сайта-донора.

К примеру, заголовок статьи обрамлен тегом H1, а тело статьи находится внутри <div class=»content»>…</div>.

С H1 проблем, как правило, не возникает. А вот текст публикации может содержать случайные вкрапления <div></div>, содержать ошибки HTML, не закрытые теги и т.п. Надежнее использовать какой либо идущий за текстом сегмент шаблона, чем выискивать закрывающий </div>, соответствующий открывающему <div class=»content»>.

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

Конкретный пример

Я писал экспорт для новостей с сайта delovoymir2003.ru. Общее количество — 124 новости ясно сигнализировало, что вручную ими заниматься не стоит.

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

article-sample

Максимальный вариант также мог содержать — тизер статьи (сжатое изложение), а сама статься могла содержать изображения.

Инструменты для разбора HTML

HTML — это частный случай XML, но ошибки шаблона и отклонения от спецификации не дают использовать для разбора HTML какие либо XML парсеры. Я давно разработал и использую набор утилит для парсинга HTML текстов. Когда логика работы формулируется примерно так:

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

и т.д, то этот класс помогает сократить код. Читайте про него в отдельной статье, здесь разбирать и приводить его код не буду.

Загрузка картинки(-нок) в специальные поля публикации.

Если у вас есть image поле в сохраняемой публикации (node), то ваша задача состоит в том, чтобы перейти от url картинки к объекту друпала — file, соответствующему этой картинке. Нужно вам это или нет — зависит от конструкции публикации, тип которой вы используете для приема статьи при импорте.

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

Эта операция будет содержать довольно много рутинных проверок и логики. Подробно я изложил этот процесс в статье — грузим картинку в поле image в Drupal.

Сохранение старого url статьи.

Чтобы поисковые машины не растерялись, надо сохранить прежний url статьи. В бесконечной веренице определений полей объекта node, синоним страницы задаётся вот так:

Сохранение текста и тизера публикации.

Если вам удалось извлечь из источника короткое описание статьи, то я покажу как его сохранить в поле body. Это поле имеет тип «Полный и краткий текст», т.е. может хранить два текста.

Заполнение дополнительных полей публикации.

Чтобы вам не пришлось сшивать из кусочков, я приведу более развернутый пример (только без поля типа image). Описание объекта публикации я уже разбирал ранее, если хотите ещё более полное описание, можете прежде с ним ознакомиться.

Если собрать все элементы пазла получится несколько сотен строк на PHP. Большая часть из них — это утилиты и функции с постоянным кодом. Написав экспорт статей под drupal один раз, вы будете заимствовать 90% кода в следующий раз.

Написать комментарий

Мало букафф? Читайте есчо !

И о других проблемах таксономии в Drupal 6

Август 26, 2013 г.

Кроме отсутствия гибкого управления (явно не хватает ряда hook-ов), о чем я говорил ранее, таксономия в 6-м Drupal еще и делает по два запроса на каждый node_load, а не хранится в кеше контента cache_content (это хорошо показывает devel). При ...

Читать

Drupal API функции для работы с таксономией

Октябрь 12, 2018 г.

Drupal 7 поддерживает работу с таксономией на уровне ядра (модуль taxonomy), предоставляя богатый арсенал функций. Здесь мы рассмотрим только функции, ...

Читать

 

Комментарии к «Скрипт экспорта в базу публикаций Drupal»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: