Скрипт экспорта в базу публикаций 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

Март 26, 2016 г.

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

Читать

Утилита для администрирования меню в Drupal

Июнь 26, 2017 г.

Очередные обновления модуля MAT для Drupal 7. Модуль тестируется на одном из сайтов, над которыми я работаю. Такое горячее тестирование возможно благодаря ...

Читать

 

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

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



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