web-dev-qa-db-ja.com

フィードによるカスタムの解析とインポートの処理

私はFeedsモジュールとドキュメントを調べていましたが、何らかの理由でこれを行うための最良の方法を理解できなかったので、誰かが私を正しい方向に向けてくれることを願っています。

D6サイト間でビデオノード情報を取得する必要があります。ソースサイトのビューを介してフィードを設定しました。フィードを使用して、ターゲットサイトに情報を取り込みます。私がしなければならないカスタムの事柄が2つあり、それらを行うための最良の方法がわかりません。

  1. ソースサイトには2つの分類語彙があり、ターゲットサイトの特定の語彙に到達する必要があります。 1つはタグの語彙で、もう1つはチャネル(両方のサイトで同じ)というタイトルです。ターゲットチャネル用語のtidを_<channel-map>_としてフィードに追加しました。その値をターゲットノードの割り当てられたチャネル用語にインポートする必要があります。問題は、コアタクソノミーモジュールが語彙に関係なく、すべてのタクソノミー用語を_<category>_としてソースフィードにダンプすることです。フィード項目をインポートするときに語彙を区別する唯一の方法は、その用語のURLであるドメイン属性を調べることです。標準のフィードインポーターにはタグターゲットがありますが、チャンネルの用語と、ソースサイトにのみ存在する他の語彙の用語を除外する必要があります。

  2. ターゲットサイトには、ソースサイトのURLをターゲットノードの[ビデオ]フィールドに http:// mysourcesiteの形式で入力すると、ソースサイトから埋め込まれたビデオを再生するカスタムビデオフォーマッターがあります。 com/node / $ nid。ソースnidを_<source-nid>_としてフィードに追加したので、その値を取得して、ソースサイトのURLがカスタムフォーマッタ設定の一部としてターゲットサイトの変数に既に格納されているURLを作成するだけです)、それを新しいターゲットノードの[ビデオ]フィールドに挿入します。

だから私が理解しようとしているのは、フィードをインポートするときにこれらのインスタンスを処理する最良の方法です。 1つのオプションは、カスタムパーサーやインポータープラグインを作成することです。ただし、解析とインポートのプロセス全体を書き直す必要はありません。上記の2つのケースを処理するだけです。インポートする必要がある2つのフィールドにターゲットがすでに定義されているので、feeds_node_processor_targets_alter()フックを使用して既存のノードプロセッサをオーバーライドするだけで問題はありますか?または、独自のカスタムプラグインを作成する必要がありますか?

ありがとう。

編集:私はフック_フィード_ノード_プロセッサ_ターゲット_アルター()を使用してcontent_taxonomy_feeds_set_target()のラッパーとして独自のコールバックを作成しようとしましたが、プロセスのその時点で提供されているのは、ソースの語彙を示す追加情報のない用語名のみです。

1
wonder95

ようやく、すべてのコードブードゥーとパーサーの変更を処理するためのすべてを手に入れました。編集として上記の元の質問に追加しなかった1つのことは、共通のシンジケーションパーサーを使用して、ソースフィードに追加したカスタムアイテムが利用できないという事実でした。その後、SimplePieパーサーを使用するように切り替え、その機能を拡張して必要なことを行うことができました。

開発者向けのフィードモジュールのドキュメントブログ投稿 によると、FeedsSimplePieParserクラスのparseExtensions()メソッドをオーバーライドすることで、カスタム解析を行うことができます。最初に、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. カテゴリからタグ以外の用語(分類用語)を除外します。スキームの値は分類用語(例:mysite.com/tag/tag-term)へのURLであるため、これを使用して非タグ用語を識別し、設定を解除します。

最後に、ビデオフィールドとチャネルボキャブラリの値を作成する必要があります。これは、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
wonder95