Hiển thị ID nút cùng với các tiêu đề trong danh sách Tự động tham chiếu thực thể


8

Tôi muốn thêm chức năng này vào tiện ích tự động hoàn thành trong trường Entityreference để hiển thị ID nút bên cạnh các tiêu đề trong danh sách thả xuống. Lý do đằng sau ý tưởng là để phân biệt giữa nhiều nút có cùng tiêu đề.

Thí dụ:

  • Đây là một tiêu đề (3)
  • Đây là một tiêu đề (2)
  • Đây là một tiêu đề (1)

Tôi biết ID nút được hiển thị sau khi lựa chọn được thực hiện nhưng tôi muốn hiển thị nó trong danh sách thả xuống để chọn nút phải nhanh chóng dựa trên ID nút.



@ oksana-c kiểm tra câu trả lời của tôi bằng một cách dễ dàng khác
Adrian Cid Almaguer

Câu trả lời:


20

Cài đặt xemEntity tham khảo mô-đun, tạo ra một Xem mới và Thêm một hiển thị Entity tham khảo:

nhập mô tả hình ảnh ở đây

Sau đó Thêm vào các trường tiêu đề nội dung và nid, nhấp vào nid và kiểm tra Loại trừ khỏi màn hình, Lưu và nhấp vào tiêu đề và đi đến viết lại đầu ra của tiêu đề như [title] - ([nid])

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Đi để chỉnh sửa các cài đặt của định dạng và kiểm tra tiêu đề, điều này sẽ cho phép bạn tìm kiếm theo tiêu đề.

nhập mô tả hình ảnh ở đây

Lưu lại xem.

Chuyển đến chỉnh sửa trường Tham chiếu thực thể của bạn và chọn trong Chế độ xem: .... (như hình ảnh sau) và chọn Chế độ xem của bạn (trong trường hợp này là tên: article_with_id) và lưu cài đặt:

nhập mô tả hình ảnh ở đây

Sau đó đi xem kết quả:

nhập mô tả hình ảnh ở đây

EDIT: Điều này hiện đang hoạt động trong Drupal 8, ít nhất là trong phiên bản 8.3.4.


2
OMG, tôi luôn tự hỏi tùy chọn lượt xem là gì. Thật là bẩn thỉu !!!
Không có

1
@NoSssweat Bây giờ tôi đang học tiếng Anh, bạn có thể cung cấp cho tôi một từ đồng nghĩa của bẩn thỉu không? Tôi không thể hiểu cụm từ "Đây là bẩn thỉu"
Adrian Cid Almaguer

3
Không, nó có nghĩa là nó là một giải pháp thực sự tốt / ấn tượng. Vd: Mục tiêu đá luân lưu bẩn thỉu của Alexander Nylander
Không có Sssweat

1
@AdrianCidAlmaguer Tôi đồng ý giải pháp này là "bệnh"! (thành ngữ)
John R

2
Vấn đề duy nhất với giải pháp này là trường tham chiếu thực thể, một khi được chọn, hiển thị ID hai lần trong biểu mẫu chỉnh sửa thực thể, bởi vì nó được bao gồm theo mặc định sau khi được chọn.
Yuri

5

Tạo trường tham chiếu thực thể với cấu hình mặc định

nhập mô tả hình ảnh ở đây

Hàm entityreference_autocomplete_callback_get_matches xác định đầu ra của tự động hoàn thành sẽ là gì.

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);
}

dòng cuối cùng $matches[$prefix . $key] = '<div class="reference-autocomplete">'xác định đầu ra và $entity_idcó sẵn đó là ID. Bạn có thể làm những gì tôi đã làm trong dòng đó (hiển thị bởi **), chỉ cần viết:

 $matches[$prefix . $key] = '<div class="reference-autocomplete">' . $label .' - ('. $entity_id . ')</div>';

bạn có thể sử dụng $entity_idđể tìm nạp các trường khác và bất cứ điều gì bạn muốn.

Một điều nữa!

Đôi khi không nên thay đổi chức năng của mô-đun lõi (nếu điều đó không quan trọng với bạn thì giải pháp trên là đủ).

Nếu bạn cần ghi đè chức năng cốt lõi của entity_referencemô-đun, hãy xây dựng một mô-đun nhỏ và đặt tên cho nóelabel

nó là 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

và nó là 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);
}

Tôi đã thử mã này và nó hoạt động hoàn hảo Nếu có loại tham chiếu thực thể khác và bạn không cần phải làm điều này cho chúng, chỉ cần thêm một IFcâu lệnh và kiểm tra gói hoặc loại nội dung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.