Показать идентификаторы узлов вместе с заголовками в справочнике по объектам. Список автозаполнения

8

Я хотел бы добавить эту функцию в виджет автозаполнения в поле Entityreference, чтобы показать идентификатор узла рядом с заголовками в раскрывающемся списке. Причиной этой идеи является различие между несколькими узлами с одинаковым названием.

Пример:

  • Это название (3)
  • Это название (2)
  • Это название (1)

Я знаю, что идентификатор узла отображается после выбора, но мне нравится показывать его в раскрывающемся списке, чтобы быстро выбрать нужный узел на основе идентификатора узла.

neemu
источник
взгляните на этот drupal.stackexchange.com/questions/82165/…
oksana-c
@ oksana-c проверь мой ответ другим простым способом
Адриан Сид Алмагер

Ответы:

20

Установите модули видов и ссылок на сущности , создайте новый вид и добавьте отображение ссылок на сущности:

введите описание изображения здесь

Затем добавьте в поля заголовок содержимого и nid, щелкните nid и установите флажок «Исключить из отображения», «Сохранить», щелкните заголовок и перейдите, чтобы перезаписать вывод заголовка как [title] - ([nid])

введите описание изображения здесь введите описание изображения здесь

Зайдите в настройки формата и проверьте заголовок, это позволит вам искать по заголовку.

введите описание изображения здесь

Сохранить вид.

Перейдите, чтобы отредактировать поле «Ссылка на сущность» и выберите в представлении «Режим»: .... (как на следующем изображении), выберите ваш вид (в данном случае это имя: article_with_id) и сохраните настройки:

введите описание изображения здесь

Затем перейдите, чтобы увидеть результат:

введите описание изображения здесь

РЕДАКТИРОВАТЬ: Это теперь работает в Drupal 8, по крайней мере, в версии 8.3.4.

Адриан Сид Альмагер
источник
2
О боже, мне всегда было интересно, для чего нужен вариант просмотра. Это грязно !!!
Нет Sssweat
1
@ NoSssweat Я сейчас учу английский, не могли бы вы дать мне синоним грязного, пожалуйста? Я не могу понять фразу «Это грязно»
Адриан Сид Алмагер
3
Нет, это означает, что это действительно хорошее / впечатляющее решение. Например: грязная перестрелка цели Александра Ниландера
без ссвита
1
@AdrianCidAlmaguer Я согласен, что это решение "плохо"! (идиома)
Джон
2
Единственная проблема, связанная с этим решением, состоит в том, что после выбора поля ссылки на сущность идентификатор дважды отображается в форме редактирования сущности, поскольку он включается по умолчанию после его выбора.
Юрий
5

Создать поле Entity Reference с конфигурацией по умолчанию

введите описание изображения здесь

Функция 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доступен, который является идентификатором. Вы можете сделать то, что я сделал в этой строке (показано **), просто напишите:

 $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оператор и проверьте пакет или тип контента.

М ама Д
источник