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',
),
);
}
しかし、ビューをフィルターする用語を選択すると、それはアイテムを返さず、返すべきです。
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';
}
}
}
}
}
現在、ビューは、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()の用語をポイントします
モジュール エンティティ参照公開フィルター は、参照されるタイトルエンティティのビュー公開フィルターを生成する可能性を提供します。