Je souhaite ajouter cette fonctionnalité au widget de saisie semi-automatique dans le champ Entityreference pour afficher l'ID du nœud à côté des titres dans la liste déroulante. La raison derrière l'idée est de différencier plusieurs nœuds avec le même titre.
Exemple:
Je sais que l'ID de nœud est affiché une fois qu'une sélection est effectuée, mais j'aime l'afficher dans la liste déroulante afin de choisir rapidement le bon nœud en fonction de l'ID de nœud.
Installez les modules Vues et Référence d'entité , créez une nouvelle vue et ajoutez un affichage de référence d'entité:
Ensuite, ajoutez dans les champs le titre du contenu et le nid, cliquez dans le nid et cochez Exclure de l'affichage, enregistrez et cliquez dans le titre et allez réécrire la sortie du titre en [title] - ([nid])
Allez pour modifier les paramètres du format et vérifiez le titre, cela vous permettra de rechercher par titre.
Enregistrez la vue.
Allez à modifier votre champ de référence d'entité et sélectionnez dans les vues de mode: .... (comme l'image suivante) et sélectionnez votre vue (dans ce cas, le nom est: articles_with_id) et enregistrez les paramètres:
Allez ensuite voir le résultat:
EDIT: Cela fonctionne maintenant dans Drupal 8, au moins dans la version 8.3.4.
Champ Créer une référence d'entité avec la configuration par défaut
La fonction entityreference_autocomplete_callback_get_matches détermine quelle devrait être la sortie de la saisie semi-automatique.
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);
}
la dernière ligne $matches[$prefix . $key] = '<div class="reference-autocomplete">'
détermine la sortie et le $entity_id
est disponible qui est l'ID. Vous pouvez faire ce que j'ai fait dans cette ligne (indiquée par **
), écrivez simplement:
$matches[$prefix . $key] = '<div class="reference-autocomplete">' . $label .' - ('. $entity_id . ')</div>';
vous pouvez utiliser $entity_id
pour récupérer d'autres champs et tout ce que vous voulez.
Parfois, ce n'est pas une bonne idée de changer la fonction du module de base (si cela n'est pas important pour vous, la solution ci-dessus est suffisante).
Si vous devez remplacer la fonction principale du entity_reference
module, construisez un petit module et nommez-le elabel
c'est 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
et c'est 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);
}
J'ai essayé ce code et il fonctionne parfaitement S'il existe d'autres types de références d'entité et que vous n'avez pas besoin de le faire pour elles, ajoutez simplement une instruction IF
et vérifiez le type de bundle ou de contenu.