it-swarm-korea.com

엔티티 참조 자동 완성 목록에서 제목과 함께 노드 ID 표시

드롭 다운 목록에서 제목 옆에 노드 ID를 표시하기 위해이 기능을 Entityreference 필드의 자동 완성 위젯에 추가하고 싶습니다. 아이디어의 이유는 동일한 제목을 가진 여러 노드를 구별하기위한 것입니다.

예:

  • 이 제목입니다 (3)
  • 이 제목입니다 (2)
  • 이 제목입니다 (1)

선택하면 노드 ID가 표시되지만 노드 ID를 기반으로 올바른 노드를 빠르게 선택하기 위해 드롭 다운 목록에 표시하고 싶습니다.

8
neemu

ViewsEntity Reference 모듈을 설치하고 새보기를 작성하고 엔티티 참조 표시를 추가하십시오.

enter image description here

그런 다음 컨텐츠 제목과 nid 필드를 추가하고 nid를 클릭 한 후 표시에서 제외를 선택하고 제목을 저장하고 클릭 한 다음 제목의 출력을 [title] - ([nid])으로 다시 쓰십시오.

enter image description hereenter image description here

형식 설정을 편집하고 제목을 확인하면 제목별로 검색 할 수 있습니다.

enter image description here

보기를 저장하십시오.

엔티티 참조 필드를 편집하여 모드보기 : .... (다음 이미지와 같이)를 선택하고보기 (이 경우 이름은 articles_with_id)를 선택하고 설정을 저장하십시오.

enter image description here

그런 다음 결과를 확인하십시오.

enter image description here

EDIT : 이것은 현재 Drupal 8, 적어도 버전 8.3.4에서는 작동 함)입니다.

20

기본 구성으로 엔티티 참조 필드 작성

enter image description here

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">'은 출력을 결정하고 ID 인 $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 문을 추가하고 번들 또는 컨텐츠 유형을 확인하십시오.

5
M a m a D