メインコンテンツに移動

メインナビゲーション

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

パンくず

  • ホーム
  • Drupalのモジュール(Feeds)でエンティティ(Entity)データインポートにユニックマッチングキーの追加

Drupalのモジュール(Feeds)でエンティティ(Entity)データインポートにユニックマッチングキーの追加

drupal
customization
feeds

やりたいこと:モジュール(Feeds)でエンティティデータへのインポート

  • モジュール(Feeds)を用いて、エンティティタイプにデータインポートする場合にサブモジュール(Feeds Entity Processor)が必要です
  • モジュール(Feeds Entity Processor)でエンティティタイプに新規データインポートが問題なくできました

問題点:モジュール(Feeds Entity Processor)でデータ更新インポート時にフィールドのマッチングキー設定はできない

  • モジュール(Feeds)でエンティティデータへの更新時に、データマッチングキーが必要です
    • 例:ノードタイプの場合、titleがマッチングキーとして利用することができます
    • titleと一致する場合に、データが更新されます。そうでなければ、データが新規作成されます
  • モジュール(Feeds Entity Processor)を利用する場合、エンティティデータのプロパティ/フィールドのユニックなマッチングキーの設定はできないです

原因:エンティティ(Entity)のプロパティ/フィールドの設定が自由なので、どのプロパティ/フィールドをユニックキーにするかを指定する必要があります

  • コンテンツタイプ(nodeタイプ)であれば、どのコンテンツ(例:Article、basic pageなど)データにもプロパティ:"title"が存在しています
    • モジュール(Feeds)のNode Processorに"title"がユニックキーに設定することができるわけです
  • エンティティ(Entity)タイプの場合は、プロパティ/フィールドが自由に設定されているので、エンティティに定義されているentity_id以外に、どれがユニックキーにするかは、エンティティを定義する人でないとわかりません
    • エンティティのプロパティ/フィールドのユニックキーは指定する必要はあります

解決:hook_feeds_processor_target_alter()を実装してユニックキーの指定ができます

  • モジュール(Feeds)がデータマッピング方法設定hook(hook_feeds_processor_target_alter)が提供しています
  • hook_feeds_processor_target_alter()を実装して、指定したエンティティタイプに任意のプロパティ/フィールドをユニックキーの指定ができます
    /**
     * Implements hook_feeds_processor_targets_alter().
     */
    function MODULE_feeds_processor_targets_alter(array &$targets, $entity_type, $bundle)
    {
        if( $entity_type == "drills_ch_vocabulary" ){
            $targets['vocabulary'] = array(
                'name' => t('vocabulary'),
                'description' => t('Vocabulary that can be unique target'),
                'callback' => 'vocabulary_mapper_set_target',
                'optional_unique' => TRUE,
                'unique_callbacks' => array('vocabulary_mapper_unique'),
            );
        }
    }
    
    /**
     * Set target value on entity.
     */
    function vocabulary_mapper_set_target(FeedsSource $source, &$entity, $target, array $values, array $mapping) {
        $entity->{$target} = reset($values);
    }
    
    /**
     * Callback for unique_callbacks for test_target mapper.
     */
    function vocabulary_mapper_unique(FeedsSource $source, $entity_type, $bundle, $target, array $values) {
        $records = db_query("SELECT v.vid FROM {drills_ch_vocabulary} v WHERE v.vocabulary=:voca", array(':voca'=>reset($values)) )->fetchAll();
        if(count($records)>0 ) {
            return reset($records)->vid ;
        }
        return false ;
    
    }
    
  • 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)