メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Drupalのモジュール(Feeds)で複数のEntityreference値をコンテンツフィールドにインポート

Drupalのモジュール(Feeds)で複数のEntityreference値をコンテンツフィールドにインポート

drupal
development
entity type

やりたいこと:複数のEntityreference値をコンテンツにインポート

  • 以下の実例:単語と例文
    EntityReferenceモジュールで一つ単語に複数の例文を参照
  • 構成は:単語コンテンツタイプ、例文コンテンツタイプをそれぞれ作成します
  • 単語コンテンツタイプにEnityreferenceで例文コンテンツタイプを参照します
  • Enityreferenceに関する詳細は記事:「 Drupalのモジュール(Entity Reference)で作成した記事からほかの記事への参照リンク作成 」を参考にしてください
  • 二つのテーブルにあるデータはそれぞれインポートされたものので、関連付けはありません
  • 単語に複数の例文参照できるようにする場合以下のステップが必要
    • 単語を用いて例文テーブルで単語が含まる例文をすべて取得
    • 取得した例文を単語IDをコンテンツにEntityreferenceフィールドに保存

実現手法:FeedsAPIを利用してカスタムモジュールを作成して、単語に複数の例文参照データをインポートします

  • 単一のEntityreference値をコンテンツにインポートするサブモジュールがあります( FeedsモジュールでEnityにデータインポート )
  • 複数のEnityreference値をコンテンツにインポートするサブモジュールはありません
  • ここで、FeedsAPIを利用して、カスタムモジュールを作成することにします
  • 必要なモジュール:Feeds SQL7.x-1.0
    • 単語テーブルをスキャンして、単語のIDと単語を取得します
  • カスタムモジュール(hook_feeds_processor_targets_alter)で各単語の例文を探して、単語のEntityreferenceフィールドにセットします
    • hook_feeds_processor_targets_alterを実装して、ノードプロセッサーのマッピングターゲットに専用フィールドを追加します
      /**
       * Implements hook_feeds_processor_targets_alter().
       */
      function my_module_feeds_feeds_processor_targets_alter(array &$targets, $entity_type, $bundle)
      {
        if( $entity_type=="node"&&$bundle=="chinese_word"){
          $field_info = field_info_instances("node", "chinese_word") ;
          if( array_key_exists('field_ch_word_sentences', $field_info ) &&
              field_info_field( 'field_ch_word_sentences' )['type'] == "entityreference" ){
            $targets["field_ch_word_sentences:drills_hander"] = array(
              'name' => check_plain( $field_info['field_ch_word_sentences']['label'] ).t(' (Import multiple value instance field)'),
              'callback' => 'drills_custom_feeds_set_target_entity_reference',
              'description' => t('This filed for converting Chinese Examples to word reference only.Do not use it for other fields!!'),
            );
          }
        }
      }
      
    • Feedsの管理画面(ホーム » 管理 » サイト構築 » Feedsインポーター)で上記コードで追加されたフィールド(
      例句 (Import multiple value instance field) (field_ch_word_sentences:drills_hander)
      )は以下のようカスタムモジュールがFeedsAPIを利用してマッピングターゲットに専用のフィールドを作成
    • 単語を用いて例文を検索、取得して、単語コンテンツにあるEntityreferenceフィールドにセット(専用フィールドのコールバック関数:drills_custom_feeds_set_target_entity_reference)
      function drills_custom_feeds_set_target_entity_reference($source, &$entity, $target, $value, $mapping){
        if (empty($value)) {
          return;
        }
        $target = str_replace(':drills_hander', '', $target);
        $query = db_query("select title, nid, CHAR_LENGTH(title) as char_num from node where title like '%".$value[0]."%' and type='example_sentences'  order by char_num limit 100");
        $sentences = $query->fetchAll();
        $field = array();
        foreach( $sentences as $i => $sentence ){
          $field[LANGUAGE_NONE][$i]['target_id'] = $sentence->nid;
        }
        $entity->{$target} = $field;
      }

       

drupal
drupal
feeds
customization

Feedsの機能

  • いろいろなフォーマットのデータをDrupalのデータ構造(例:ユーザー/ノード/Taxonomyなど)に合わせてインポートする
    • 一対一のコンテンツデータ(例:User -> Userデータ)
    • いろいろなフォーマットデータ(例:RSS/OPML/Atom feeds、csvなど)を各種Drupalのコンテンツ(例:User,Articleなど)データのインポート
    • PubSubHubbub のサポート
  • Feeds APIが提供されているので、独自のFetcher,Parser,Processorのプラグインの追加が可能
  • 基本設定:インポーターの名前、実行タイミングなどの設定
  • Fetcher: インポートするデータ/ファイルのフォーマット、場所などの指定
  • Parser: インポートデータの解析方法の指定
  • Processor: 出力するデータのフォーマット/コンテンツ、インポートデータのフィールドマッピングの指定

 

drupal
drupal
customization
feeds
data import

目的

  • Entity Typeデータにほかのデータ(例:csv、xmlなど)からのインポートを可能にする
  • Feedsの初期データ変換プロセッサーに「Entity Type」のものがなかった

解決の選択肢

  • Feed Importモジュールでのデータインポート
  • Feedsモジュールのカスタマイズをする

ここでの解決:Feedsのカスタマイズ

  • インストールされたモジュール
    • Feeds :  7.x-2.0
    • ECK  :  7.x-2.0
    • Entity API :  7.x-1.5
  • 上記モジュールのインストールと有効化
  • ECKでインポートデータタイプとBundleを作成する
    • 例: データタイプ:「組織データ」、Bundle:「xxxの組織データ」
    • 「組織データ」のプロパティ:title、uid、created、changedを使用する
    • 「xxxの組織データ」のフィールド:「組織コード」、「正式組織名」をテキストフィールドで追加

Feedsの紹介

  • Feedsが三つの部分から構成される:Fetcher、Parser、Processor
    • Fetcher:インポータデータの取得(例:File upload、external RSS Feedなど)
    • Parser:インポートデータの解析方法の指定(csv、xls、xml、RSSなど)
    • Processor:インポートデータの作成(Node、terms、usersなどのデータ作成)

 

FeedsにEntity Typeデータ変換プロセッサーに追加

  • PatchファイルをFeedsモジュールに当てる
  • Feedsのデータ変換プロセッサー設定画面にEntity Typeのデータ変換プロセッサー追加前後のイメージ
添付 サイズ
feeds_entity_processor-1033202-217.patch_.txt (16.03 KB) 16.03 KB
drupal
video
entity api
module usage

やりたいこと:作成した記事からほかの記事への参照リンクをつけたいです

  • シリーズの記事作成するとに、記事からほかの記事への参照リンクをつけるので必要となります
  • 書いた文書ないで参照リンクをつけることができますが、参考リンクを記事から別の場所で配置したりすることがコンテンツタイプではできないです

解決:モジュール(Entity Reference)でほかの記事を参照リンク作成

  • 他の記事を参照するモジュールはNode Referecneもありますが、Drupal7がEntityの概念を導入したので、より幅広く参照ができるようになるのはEntity Referenceです(Node Referecneが非推奨)
  • Enity Reference:7.x-1.2
  • Enity Referenceのインストール/設定/参照フィールド作成方法と手順などはビデオをご参考ください
Embedded thumbnail for Drupalのモジュール(Entity Reference)で作成した記事からほかの記事への参照リンク作成
drupal
bug
module usage

問題点:モジュール(Feeds)でデータインポートする際にエラーが発生

  • 環境: Drupal7.54、Feeds7.x-3.0、Feeds SQL7.X-1.0
  • Feedsでのデータインポート時に以下のエラーが発生
    Warning: substr() expects parameter 1 to be string, array given FeedsFetcherResult->sanitizeRaw() (/virtual/drills/public_html/drupal7/sites/all/modules/feeds/plugins/FeedsFetcher.inc ファイル 75行).

    モジュール(Feeds SQL)実行エラー

バグ報告とパッチ

  • ネットで調べてみたが、ほかのところでも同じエラーも発生しました(Feeds Fetcher sanitizeRaw() method expects string)
  • パッチも提供され、パッチ当てをすれば、エラーは消えます
drupal
development
entity type

やりたいこと:複数のEntityreference値をコンテンツにインポート

  • 以下の実例:単語と例文
    EntityReferenceモジュールで一つ単語に複数の例文を参照
  • 構成は:単語コンテンツタイプ、例文コンテンツタイプをそれぞれ作成します
  • 単語コンテンツタイプにEnityreferenceで例文コンテンツタイプを参照します
  • Enityreferenceに関する詳細は記事:「 Drupalのモジュール(Entity Reference)で作成した記事からほかの記事への参照リンク作成 」を参考にしてください
  • 二つのテーブルにあるデータはそれぞれインポートされたものので、関連付けはありません
  • 単語に複数の例文参照できるようにする場合以下のステップが必要
    • 単語を用いて例文テーブルで単語が含まる例文をすべて取得
    • 取得した例文を単語IDをコンテンツにEntityreferenceフィールドに保存

実現手法:FeedsAPIを利用してカスタムモジュールを作成して、単語に複数の例文参照データをインポートします

  • 単一のEntityreference値をコンテンツにインポートするサブモジュールがあります( FeedsモジュールでEnityにデータインポート )
  • 複数のEnityreference値をコンテンツにインポートするサブモジュールはありません
  • ここで、FeedsAPIを利用して、カスタムモジュールを作成することにします
  • 必要なモジュール:Feeds SQL7.x-1.0
    • 単語テーブルをスキャンして、単語のIDと単語を取得します
  • カスタムモジュール(hook_feeds_processor_targets_alter)で各単語の例文を探して、単語のEntityreferenceフィールドにセットします
    • hook_feeds_processor_targets_alterを実装して、ノードプロセッサーのマッピングターゲットに専用フィールドを追加します
      /**
       * Implements hook_feeds_processor_targets_alter().
       */
      function my_module_feeds_feeds_processor_targets_alter(array &$targets, $entity_type, $bundle)
      {
        if( $entity_type=="node"&&$bundle=="chinese_word"){
          $field_info = field_info_instances("node", "chinese_word") ;
          if( array_key_exists('field_ch_word_sentences', $field_info ) &&
              field_info_field( 'field_ch_word_sentences' )['type'] == "entityreference" ){
            $targets["field_ch_word_sentences:drills_hander"] = array(
              'name' => check_plain( $field_info['field_ch_word_sentences']['label'] ).t(' (Import multiple value instance field)'),
              'callback' => 'drills_custom_feeds_set_target_entity_reference',
              'description' => t('This filed for converting Chinese Examples to word reference only.Do not use it for other fields!!'),
            );
          }
        }
      }
      
    • Feedsの管理画面(ホーム » 管理 » サイト構築 » Feedsインポーター)で上記コードで追加されたフィールド(
      例句 (Import multiple value instance field) (field_ch_word_sentences:drills_hander)
      )は以下のようカスタムモジュールがFeedsAPIを利用してマッピングターゲットに専用のフィールドを作成
    • 単語を用いて例文を検索、取得して、単語コンテンツにあるEntityreferenceフィールドにセット(専用フィールドのコールバック関数:drills_custom_feeds_set_target_entity_reference)
      function drills_custom_feeds_set_target_entity_reference($source, &$entity, $target, $value, $mapping){
        if (empty($value)) {
          return;
        }
        $target = str_replace(':drills_hander', '', $target);
        $query = db_query("select title, nid, CHAR_LENGTH(title) as char_num from node where title like '%".$value[0]."%' and type='example_sentences'  order by char_num limit 100");
        $sentences = $query->fetchAll();
        $field = array();
        foreach( $sentences as $i => $sentence ){
          $field[LANGUAGE_NONE][$i]['target_id'] = $sentence->nid;
        }
        $entity->{$target} = $field;
      }

       

drupal
feeds
module usage

Feedsモジュールの基本使用:csvデータをノード(node)にインポート

  • 環境:Drupal7.54、Feeds7.x-2.0
  • Feedsのインポート機能を理解するには、csvデータインポートから始めたほうが良いでしょう
  • 例:コンテンツのタイトルと内容をインポートします
    DrupalのFeedsモジュールでcsvデータのインポート

注意事項:基本設定とプロセッサーの設定

  • 基本的なインポート操作はビデオを参考してください
  • 基本設定の内容に周期的なインポートが必要の場合にインポートの頻度を設定します
  • プロセッサーの設定
    • 新規ノートの作成許可するかの設定
    • 複数回のインポートが必要な場合に「 ハッシュチェックをスキップ 」をチェックします
    • 投稿者の設定はデータ新規作成のみに使用されます
    • コンテンツ更新の場合、コンテンツの作成者が更新権限がチェックされます
  • プロセッター設定について、記事「Drupalのモジュール(Feeds)で手動でデータインポート時の必須設定 」を参考してください
 
 
 
Embedded thumbnail for Drupalのモジュール(Feeds)でcsvデータをコンテンツにインポート(Feedsの基本)
ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)