Entityreferenceフィールドのオートコンプリートウィジェットにこの機能を追加して、ドロップダウンリストのタイトルの横にノードIDを表示します。このアイデアの背後にある理由は、同じタイトルを持つ複数のノードを区別するためです。
例:
選択するとノードIDが表示されることはわかっていますが、ノードIDに基づいて適切なノードをすばやく選択するために、ドロップダウンリストに表示したいです。
Views および Entity Reference モジュールをインストールし、新しいビューを作成してエンティティ参照表示を追加します。
次に、フィールドにコンテンツタイトルとnidを追加し、nidをクリックして、[表示から除外]をオンにし、保存してタイトルをクリックし、タイトルの出力を[title] - ([nid])
に書き換えます。
フォーマットの設定を編集し、タイトルを確認してください。これにより、タイトルで検索できます。
ビューを保存します。
Entity Referenceフィールドの編集に移動し、Mode Views:....(次の画像のように)を選択し、ビュー(この場合は名前はarticles_with_id)を選択して設定を保存します。
次に、結果を確認します。
EDIT:これは現在、Drupal 8で動作しています。少なくともバージョン8.3.4では。
デフォルト構成でエンティティ参照フィールドを作成する
関数 entityreference_autocomplete_callback_get_matches は、オートコンプリートの出力を決定します。
function entityreference_autocomplete_callback_get_matches($type, $field, $instance, $entity_type, $entity_id = '', $string = '') {
$matches = array();
$entity = NULL;
if ($entity_id !== 'NULL') {
$entity = entity_load_single($entity_type, $entity_id);
$has_view_access = (entity_access('view', $entity_type, $entity) !== FALSE);
$has_update_access = (entity_access('update', $entity_type, $entity) !== FALSE);
if (!$entity || !($has_view_access || $has_update_access)) {
return MENU_ACCESS_DENIED;
}
}
$handler = entityreference_get_selection_handler($field, $instance, $entity_type, $entity);
if ($type == 'tags') {
// The user enters a comma-separated list of tags. We only autocomplete the last tag.
$tags_typed = drupal_explode_tags($string);
$tag_last = drupal_strtolower(array_pop($tags_typed));
if (!empty($tag_last)) {
$prefix = count($tags_typed) ? implode(', ', $tags_typed) . ', ' : '';
}
}
else {
// The user enters a single tag.
$prefix = '';
$tag_last = $string;
}
if (isset($tag_last)) {
// Get an array of matching entities.
$entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator'], 10);
// Loop through the products and convert them into autocomplete output.
foreach ($entity_labels as $values) {
foreach ($values as $entity_id => $label) {
$key = "$label ($entity_id)";
// Strip things like starting/trailing white spaces, line breaks and tags.
$key = preg_replace('/\s\s+/', ' ', str_replace("\n", '', trim(decode_entities(strip_tags($key)))));
// Names containing commas or quotes must be wrapped in quotes.
if (strpos($key, ',') !== FALSE || strpos($key, '"') !== FALSE) {
$key = '"' . str_replace('"', '""', $key) . '"';
}
/* *** */$matches[$prefix . $key] = '<div class="reference-autocomplete">' . $label .' - ('. $entity_id . ')</div>';//****
}
}
}
drupal_json_output($matches);
}
最後の行$matches[$prefix . $key] = '<div class="reference-autocomplete">'
は出力を決定し、$entity_id
はIDです。その行で私がしたこと(**
で示される)を実行できます。
$matches[$prefix . $key] = '<div class="reference-autocomplete">' . $label .' - ('. $entity_id . ')</div>';
$entity_id
を使用して、他のフィールドや必要なものをフェッチできます。
コアモジュールの機能を変更するのが適切でない場合があります(上記のソリューションで十分ではない場合)。
entity_reference
モジュールのコア関数をオーバーライドする必要がある場合は、小さなモジュールをビルドして、elabel
という名前を付けます
elabel.info
;$Id;
name = My Entity Reference Label
description = This module creates special Entity Reference Label
package = My Modules
core = 7.x
php = 5.1
files[] = elabel.module
そしてそれはelabel.module
です
<?php function elabel_menu_alter(&$items){
unset($items['entityreference/autocomplete/single/%/%/%']);
unset($items['entityreference/autocomplete/tags/%/%/%']);
$items['entityreference/autocomplete/single/%/%/%'] = array(
'title' => 'Entity Reference Autocomplete',
'page callback' => 'elabel_autocomplete_callback',
'page arguments' => array(2, 3, 4, 5),
'access callback' => 'entityreference_autocomplete_access_callback',
'access arguments' => array(2, 3, 4, 5),
'type' => MENU_CALLBACK,
);
$items['entityreference/autocomplete/tags/%/%/%'] = array(
'title' => 'Entity Reference Autocomplete',
'page callback' => 'elabel_autocomplete_callback',
'page arguments' => array(2, 3, 4, 5),
'access callback' => 'entityreference_autocomplete_access_callback',
'access arguments' => array(2, 3, 4, 5),
'type' => MENU_CALLBACK,
);
return $items;
}
function elabel_autocomplete_callback($type, $field_name, $entity_type, $bundle_name, $entity_id = '', $string = '') {
// If the request has a '/' in the search text, then the menu system will have
// split it into multiple arguments and $string will only be a partial. We want
// to make sure we recover the intended $string.
$args = func_get_args();
// Shift off the $type, $field_name, $entity_type, $bundle_name, and $entity_id args.
array_shift($args);
array_shift($args);
array_shift($args);
array_shift($args);
array_shift($args);
$string = implode('/', $args);
$field = field_info_field($field_name);
$instance = field_info_instance($entity_type, $field_name, $bundle_name);
return elabel_autocomplete_callback_get_matches($type, $field, $instance, $entity_type, $entity_id, $string);
}
function elabel_autocomplete_callback_get_matches($type, $field, $instance, $entity_type, $entity_id = '', $string = '') {
$matches = array();
$entity = NULL;
if ($entity_id !== 'NULL') {
$entity = entity_load_single($entity_type, $entity_id);
$has_view_access = (entity_access('view', $entity_type, $entity) !== FALSE);
$has_update_access = (entity_access('update', $entity_type, $entity) !== FALSE);
if (!$entity || !($has_view_access || $has_update_access)) {
return MENU_ACCESS_DENIED;
}
}
$handler = entityreference_get_selection_handler($field, $instance, $entity_type, $entity);
if ($type == 'tags') {
// The user enters a comma-separated list of tags. We only autocomplete the last tag.
$tags_typed = drupal_explode_tags($string);
$tag_last = drupal_strtolower(array_pop($tags_typed));
if (!empty($tag_last)) {
$prefix = count($tags_typed) ? implode(', ', $tags_typed) . ', ' : '';
}
}
else {
// The user enters a single tag.
$prefix = '';
$tag_last = $string;
}
if (isset($tag_last)) {
// Get an array of matching entities.
$entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator'], 10);
// Loop through the products and convert them into autocomplete output.
foreach ($entity_labels as $values) {
foreach ($values as $entity_id => $label) {
$key = "$label ($entity_id)";
// Strip things like starting/trailing white spaces, line breaks and tags.
$key = preg_replace('/\s\s+/', ' ', str_replace("\n", '', trim(decode_entities(strip_tags($key)))));
// Names containing commas or quotes must be wrapped in quotes.
if (strpos($key, ',') !== FALSE || strpos($key, '"') !== FALSE) {
$key = '"' . str_replace('"', '""', $key) . '"';
}
/* *** */ $matches[$prefix . $key] = '<div class="reference-autocomplete">' . $label .'('.$entity_id.')' .'</div>';
}
}
}
drupal_json_output($matches);
}
このコードを試してみましたが、完全に機能します。他のタイプのエンティティ参照があり、それらを実行する必要がない場合は、IF
ステートメントを追加して、バンドルまたはコンテンツタイプを確認します。