Обработка пользовательского синтаксического анализа и импорта с помощью каналов


Я пробирался через модуль каналов и документацию и по какой-то причине не смог найти наилучший способ сделать это, поэтому я надеюсь, что кто-нибудь сможет указать мне правильное направление.

Мне нужно получить информацию о видеоузле с одного сайта D6 на другой. Я настроил канал через представления на исходном сайте, и я хочу использовать каналы для передачи информации на целевой сайт. Есть две особые вещи, которые мне нужно сделать, и я не могу понять лучший способ сделать это.

  1. На исходном сайте есть два словаря таксономии, которые мне нужны, чтобы перейти к конкретным словарям на целевом сайте. Один из них - словарь тегов, а другой называется Канал (одинаковый на обоих сайтах). Я добавил tid для термина целевого канала в канал как <channel-map>, и мне нужно импортировать это значение в назначенный термин канала на целевом узле. Проблема в том, что основной модуль таксономии сбрасывает все термины таксономии, независимо от словарного запаса, в исходный канал как <category>; единственный способ различать вокабы при импорте элемента канала - посмотреть на атрибут домена, который является URL-адресом для этого термина. В стандартном импортере каналов есть цель тегов, но мне нужно отфильтровать термины канала, а также термины для других вокаб, которые существуют только на исходном сайте.

  2. На целевом сайте есть пользовательский форматировщик видео, который воспроизводит встроенное видео с исходного сайта, когда вы вводите URL-адрес исходного сайта в Поле видео на целевом узле в формате http://mysourcesite.com/node /$nid. Я добавил исходный идентификатор nid в канал как <source-nid>, поэтому мне просто нужно принять это значение и построить URL-адрес, URL-адрес исходного сайта уже сохранен в переменной на целевом сайте как часть пользовательских настроек форматирования), а затем вставьте его в поле Видео на новом целевом узле.

Итак, я пытаюсь понять, как лучше всего обрабатывать эти экземпляры при импорте ленты. Похоже, что одним из вариантов является написание пользовательского синтаксического анализатора и/или плагина импортера. Однако мне не нужно переписывать все процессы синтаксического анализа и импорта; Мне просто нужно обработать два случая, описанных выше. Для двух полей, в которые мне нужно импортировать, уже определены цели, так что будет ли просто использовать крючок feeds_node_processor_targets_alter() и переопределить существующий процессор узла? Или мне нужно будет написать свои собственные плагины?

Спасибо.

РЕДАКТИРОВАТЬ: Я попытался создать свой собственный обратный вызов в качестве оболочки для content_taxonomy_feeds_set_target() используется функция hook_feeds_node_processor_targets_alter(), но к этому моменту процесса все, что предоставляется, - это имя термина без дополнительной информации для указания исходного словаря.

 1
Author: wonder95, 2013-10-15

1 answers

Наконец-то я получил все необходимое для работы с некоторым кодом вуду и изменением синтаксических анализаторов. Одна вещь, которую я не добавил в исходный вопрос выше в качестве редактирования, заключалась в том, что с помощью обычного синтаксического анализатора синдикации мои пользовательские элементы, которые я добавил в исходный канал, никогда не были доступны. Затем я переключился на использование синтаксического анализатора SimplePie и смог расширить эту функциональность, чтобы делать то, что мне нужно.

В соответствии с документацией модуля Feeds для разработчиков и этим блогом после , вы можете выполнить некоторый пользовательский синтаксический анализ, переопределив метод parseextensions() класса FeedsSimplePieParser. Во-первых, вы должны объявить класс с помощью функции hook_feeds_plugins():

/**
 * Implementation of hook_feeds_plugins().
 */
function mymodule_feeds_plugins() {
  $info = array();

  $info['MyModuleFeedsParser'] = array(
    'name' => 'Custom Parser',
    'description' => 'Custom parser for my video import.',
    'handler' => array(
      'parent' => 'FeedsSimplePieParser',
      'class' => 'MyModuleFeedsParser',
      'file' => 'MyModuleFeedsParser.inc',
      'path' => drupal_get_path('module', 'mymodule') . '/plugins/feeds/',
    ),
  );
  return $info;
}

Вы также хотите реализовать hook_enable для очистки кэшей.

/**
 * Implementation of hook_enable.
 */
function mymodule_enable() {
  //clear the cache to display in Feeds as available plugin.
  cache_clear_all('plugins:feeds:plugins', 'cache');
}

Затем вы создаете класс.

/**
 * Custom Feeds parser class used to parse custom info from source site video feed.
 */

class MyModuleFeedsParser extends FeedsSimplePieParser {
  /**
   * Add the extra mapping sources provided by this parser.
   */
  public function getMappingSources() {
    return parent::getMappingSources() + array(
      'source-nid' => array(
        'name' => t('Video NID - SimplePie'),
        'description' => t('.'),
      ),
      'channel-map' => array(
        'name' => t('Channel Map - SimplePie'),
        'description' => t('Target Channel tid - SimplePie.'),
      ),
    );
  }

  /**
   * Parse the extra mapping sources provided by this parser.
   */
  protected function parseExtensions(&$item, $simplepie_item) {
    if ($value = $simplepie_item->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'source-nid')) {
      $item['source-nid'] = $value[0]['data'];
    }
    if ($value = $simplepie_item->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel-map')) {
      $item['channel-map'] = $value[0]['data'];
    }
    // Filter out non-Tags terms.
    $categories = $simplepie_item->get_categories();
    // Cycle through the categories and delete any items
    // in feed item that aren't tags. The array id values
    // are synchronized between $categories and $item['tags'].
    foreach($categories as $id => $category) {
      if (!strstr($category->scheme, '/tag/')) {
        unset($item['tags'][$id]);
      }
    }
  }
}

Этот код выполняет несколько функций:

  1. getmappingsources() создает пару источников, доступных для сопоставления. Вы устанавливаете их в настройках импортера для вашего процессор.
  2. Получает значение source-nid из источника канала и добавляет его в элемент.
  3. Получает значение карты канала из источника канала и добавляет его в элемент.
  4. Отфильтровывает термины, не относящиеся к тегам, из категорий (они же термины таксономии). Значение схемы - это URL-адрес термина таксономии (например, mysite.com/tag/tag-term), поэтому я использую это для идентификации терминов без тегов и их отмены.

Наконец, я должен создать значения для поля видео и канала запас слов. Это делается с помощью некоторых пользовательских обратных вызовов, определенных в hook_feeds_node_processor_targets_alter().

/**
 * Implements hook_feeds_node_processor_targets_alter().
 */
function mymodule_feeds_node_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
  $targets['field_source_url'] = array(
    'name' => 'Source Video URL',
    'description' => 'The URL of the source video',
    'callback' => 'mymodule_feeds_set_source_url',
  );

  $targets['channel'] = array(
    'name' => 'Target Channel',
    'description' => 'The target video channel',
    'callback' => 'mymodule_feeds_set_channel_target',
  );
}

И сами обратные вызовы:

/**
 * Custom callback to set the video source URL in field_video.
 *
 * @param $node - The node object being built.
 * @param $target - The target field.
 * @param $value - The field value from the feed.
 */
function mymodule_feeds_set_source_url(&$node, $target, $value) {
  $source_url = variable_get('emvideo_source_domain', '') . '/node/' . $value;
  $node->field_video[0]['embed'] = $source_url;
}

/**
 * Custom callback to set the target vocabulary term.
 *
 * @param $node - The node object being built.
 * @param $target - The target field.
 * @param $value - The field value from the feed.
 */
function mymodule_feeds_set_channel_target(&$node, $target, $value) {
  $term = taxonomy_get_term($value);
  $node->taxonomy[(int)$value] = $term;
}

Затем вы определяете их как целевые объекты в своем отображении процессора (чтобы они совпадали с приведенными выше исходными значениями), и все готово.

 2
Author: wonder95, 2013-10-17 04:21:07