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

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

TMGMT переводит поле view_mode, объявленное плагином menu_link_extras

Июнь 17, 2024 г.

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

Читать

Проблема с сохранением asymmetric paragraphs в tmgmt

Октябрь 4, 2024 г.

Проблема описана вот тут, и там даже предлагается патч https://www.drupal.org/files/issues/2024-05-28/3134922-40.patch,который частично решает проблему, но в #43 siavash (Sia) более подробно рассказывает о том, как сохраняются данные, и становится ясно, ...

Читать

Ошибка обновления metatag remove_robots_noydir_noodp

Май 24, 2023 г.

Если у вас собран Drupal + Commerce, то, возможно, при обновлении модуля метатегов возникает ошибка. Модуль не находит таблицы мета информации для сущности commerce_product и прерывается с выводом сообщения: [crayon-69f8161dda165211351788/] ...

Читать

Ctools modal закрытие при клике вне модального окна

Июнь 28, 2019 г.

Привычное для пользователей поведение модального окна изначально не реализовано в ctools. Давайте добавим немного js, реализующего нужный функционал. Код универсален для модального окна создаваемого ctools, т.к. привязан к верстке окна: [crayon-69f8161dda2fb327249428/] ...

Читать
 

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

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



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