web-dev-qa-db-ja.com

カスタムエンティティでのエンティティ参照のドロップダウンを持つようにフィルターを公開したビュー

drupalコンソールユーティリティで独自のモジュールとコンテンツエンティティコードを生成しました。ユーザーエンティティ参照フィールドと分類用語エンティティエンティティ参照フィールドを追加した後。

今、私はコンテンツをビューでリストしていますが、統合が行われて生成されたコードで何もしません。

しかし、分類フィールドとユーザーフィールドでフィルターを公開すると、ドロップダウンとして表示するオプションが表示されず、テキストフィールドとして直接表示されます。

他のビューでは、エンティティ参照フィールドを持つノードを一覧表示します。エンティティ参照オファーの公開フィルターを追加すると、ドロップダウンまたはオートコンプリートウィジェットが表示されます。

ビューで公開フィルターとしてエンティティ参照フィールドのドロップダウンを選択するには、エンティティに何を変更する必要がありますか?

Entityクラスのフィールド定義は次のとおりです

    $fields['term_id'] = BaseFieldDefinition::create('entity_reference')
  ->setLabel(t('Log type'))
  ->setDescription(t('The term ID of the Log entry type.'))
  ->setRevisionable(FALSE)
  ->setSetting('target_type', 'taxonomy_term')
  ->setSetting('handler', 'default:taxonomy_term')
  ->setSetting('handler_settings', 
    array(
      'target_bundles' => array(
        'logs_type' => 'logs_type'
    )))
  ->setTranslatable(FALSE)
  ->setDisplayOptions('view', array(
    'label' => 'inline',
    'type' => 'taxonomy_term',
    'weight' => -2,
  ))
  ->setDisplayOptions('form', array(
    'type' => 'entity_reference_autocomplete',
    'weight' => -2,
    'settings' => array(
      'match_operator' => 'CONTAINS',
      'size' => '60',
      'autocomplete_type' => 'tags',
      'placeholder' => '',
    ),
  ))
  ->setDisplayConfigurable('form', TRUE)
  ->setDisplayConfigurable('view', TRUE);

更新:

私のビューの公開されたフィルターにドロップダウンがあり、ファイルmymodule.views.incを作成し、次のコードを配置します。

function log_activity_views_data_alter(&$data) {
  $data['log']['term_log_tid_depth'] = array(
    'help' => t('Display content if it has the selected taxonomy terms, or children of the selected terms. Due to additional complexity, this has fewer options than the versions without depth.'),
    'real field' => 'term_id',
    'argument' => array(
      'title' => t('Log type (with depth)'),
      'id' => 'taxonomy_index_tid_depth',
      'accept depth modifier' => TRUE,
    ),
    'filter' => array(
      'title' => t('Has taxonomy terms (with depth)'),
      'id' => 'taxonomy_index_tid_depth',
    ),
  );
}

しかし、ビューをフィルターする用語を選択すると、それはアイテムを返さず、返すべきです。

3
ferriol

Berdirが言ったように、 https://www.drupal.org/node/2429699 の準備ができていない限り、独自のビューフィルタープラグインを提供する必要があります。

ノード用に、TaxonomyIndexTidに基づいてこのプラグインを作成しました。参照 https://Gist.github.com/StryKaizer/ae1cb9abc4844a9e7ac12317a9d84a78

このファイルをyourmodule/src/Plugin/views/filter/NodeIndexNid.phpのカスタムモジュールに配置し、次のようにyourmodule.moduleファイルにhook_views_data_alterを実装する必要があります。

/**
 * Implements hook_field_views_data_alter().
 *
 * Views integration for entity reference fields which reference nodes.
 * Adds a term relationship to the default field data.
 *
 * @see views_field_default_views_data()
 */
function yourmodule_field_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage) {
  if ($field_storage->getType() == 'entity_reference' && $field_storage->getSetting('target_type') == 'node') {
    foreach ($data as $table_name => $table_data) {
      foreach ($table_data as $field_name => $field_data) {
        if (isset($field_data['filter']) && $field_name != 'delta') {
          $data[$table_name][$field_name]['filter']['id'] = 'node_index_nid';
        }
      }
    }
  }
}
4
StryKaizer

現在、ビューは、taxonomy_term参照に対してのみ提供しています。これは、taxonomy.moduleが特別なビュー統合を提供するためです。

この一般的なものにするために開いているコアの問題があります。例: https://www.drupal.org/node/2429699

それが解決されるまで、\ Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTidに基づいて独自のビューフィルタープラグインを提供し、エンティティタイプにviews_dataハンドラーを追加して、そのフィールドで使用されているフィルターをオーバーライドする必要があります、taxonomy.moduleのように、すべてのエンティティ参照フィールドに対して、taxonomy_field_views_data_alter()の用語をポイントします

1
Berdir

モジュール エンティティ参照公開フィルター は、参照されるタイトルエンティティのビュー公開フィルターを生成する可能性を提供します。

1
romain ni