Написание Parser-плагина для Feeds

05.09.2013
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

Задача импорта контента часто бывает нетривиальной для веб разработчика. Писать импорт "с нуля" для каждого случая - далеко не оптимальный вариант, поэтому мы рекомендуем использовать уже существующие решения, например - Migrate, Feeds. 

Рассмотрим детальнее модуль Feeds. Архитектурно он состоит из набора плагинов. Основные плагины - это:
Fetcher - выполняет роль поставщика данных для дальнейшего разбора и импорта;
Parser - осуществляет разбор данных и формирует массивы элементов для дальнейшего импорта;
Processor - обрабатывает данные от разборщика, определяет в какие поля записывать полученные данные и собственно сохраняет/обновляет контент.

В этой статье мы рассмотрим напсание плагина для разборщика (Parser). Импортировать будем XML-файл, который был получен с помощью модуля Views Data Export. Возможно кто-то скажет, что нет смысла писать свой плагин, ибо Feeds "из коробки" предоставляет свой плагин разбора XML. Это так, но для того, чтобы заставить его работать, нужно существенно переделать вывод VDE. Написание своего разборщика менее трудозатратно.

Итак, создадим модуль custom_parser. Содержание файла custom_parser.info:

name = Custom Parser
description = Contains feeds plugins for XML import.
core = 7.x
version = 7.x-1.0
files[] = CustomParserXML.inc 

В файле custom_parser.module объявляем hook_feeds_plugins(), в котором описываем наш плагин разборщика:

 /**
 * Implements hook_feeds_plugins().
 */
function custom_parser_feeds_plugins() {
  return array(
    'CustomParserXML' => array(
      'name' => t('Custom XML parser'),
      'description' => t('Parses XML as we want.'),
      'handler' => array(
        'parent' => 'FeedsParser',
        'class' => 'CustomParserXML',
        'file' => 'CustomParserXML.inc',
      ),
    ),
  );
}
Ключи массива-описания говорят сами за себя, поэтому нет смысла их разбирать. Перейдем к наиболее интересному - к классу разборщика. Все разборщики/парсеры расширяют класс FeedsParser. Обязательным к определению является только метод "parse()", так как он как раз и осуществляет разбор данных.
 /**
 * Parses a given file as a XML file.
 */
class CustomParserXML extends FeedsParser {

  /**
   * Implements FeedsParser::parse().
   */
  public function parse(FeedsSource $source, FeedsFetcherResult $fetcher_result) {
    // Loads xml file into string.
    @ $xml = simplexml_load_string($fetcher_result->getRaw(), NULL, LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NOCDATA);
    // Got a malformed XML.
    if ($xml === FALSE || is_null($xml)) {
      return FALSE;
    }
    $items = array();
    foreach ($xml->node as $node) {
      // Object to array conversion.
      $node = (array) $node;
      foreach ($node as $k => $v) {
        // We don't want to work with empty data.
        if (!$v) {
          unset($node[$k]);
        }
        else {
          $old_key = $k;
          // Converts all keys to lower case for consistency.
          $new_key = drupal_strtolower(str_replace('-', ' ', $old_key));
          $node[$new_key] = $v;
          unset($node[$old_key]);
        }
      }
      $items[] = $node;
    }
    return new FeedsParserResult($items, $source->feed_nid);
  }

  /**
   * Override parent::getSourceElement() to use only lower keys.
   */
  public function getSourceElement(FeedsSource $source, FeedsParserResult $result, $element_key) {
    return parent::getSourceElement($source, $result, drupal_strtolower($element_key));
  }
} 

Наш разборщик готов. Выбрать его можно на странице настроек импортера - example.com/admin/structure/feeds/[importer_name]/parser:

Более детально почитать о плагинах Feeds можно здесь. К статье прикреплен архив с модулем разборщика, фича с импортером и вьюшкой. Спасибо за внимание.

custom_parser.zip
1 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

В даной статье описан процесс развёртывания CMS Drupal с использованием Oracle DB на Debian сервере.

2

Иногда ситуация складывается так, что возникает потребность в использовании обоих интернет-протоколов  HTTP...

3

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

4

Модуль rules позволяет нам выполнять нужные действия (actions) после выполнения определенных событий (​​events). В своем арсенале он...

5

Для начала - несколько слов о библиотеке.
pChart – это набор классов для...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime