Завдання, що полягає у імпорті контента часто буває нетривіальним для веб-розробника. Написання імпорту "з нуля", для кожного випадку, - варіант далеко не оптимальный, тому ми рекомендуємо вдаватись до вже існуючих рішень, наприклад, 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', ), ), ); }
/** * 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 можно тут. До статті прикріплено архів з модулем розбірника, фіча з імпортером та в’юшкою. Дякую за увагу.