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

05.09.2013
Parser-Plugin as Written Out for Feeds
Автор:

Завдання, що полягає у імпорті контента часто буває нетривіальним для веб-розробника. Написання імпорту "з нуля", для кожного випадку, - варіант далеко не оптимальный, тому ми рекомендуємо вдаватись до вже існуючих рішень, наприклад, MigrateFeeds

Розглянемо модуль 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 можно тут. До статті прикріплено архів з модулем розбірника, фіча з імпортером та в’юшкою. Дякую за увагу.

Голосів: 1 Рейтинг: 5

Також по темі

1

В даній статті описано процес розгортання CMS Drupal із використанням Oracle DB на Debian сервері.

2

Facebook є однією з найпопулярніших соціальних мереж в світі. На сьогодні цей сайт налічує більше 1...

3

Друпал-розробники зі стажем не уявляють роботи без утіліти Drush (Drupal shell), адже з її допомогою більшість рутинних дій в друпалі випоконуються...

4

Трапляються ситуації коли потрібно використовувати обидва інтернет-протоколи HTTP та...

5

Сьогодні iPhone та iPad - далі iГаджети - перестали бути для нас у дивовижу, і все частіше розробники наштовхуються на проблему реалізації функціоналу під ці пристрої.

Subscribe to our blog updates