Ghi đè thực thể tự động hoàn thành và trả về đầu ra của trường thực thể


7

Tôi đang cố gắng ghi đè một mục biểu mẫu tự động hoàn thành thực thể, tôi đã quản lý để ghi đè biểu mẫu và nhận được đối số được chuyển đến một cuộc gọi lại hook_menu. Tuy nhiên, tôi đang vật lộn để khiến cuộc gọi lại hoạt động dựa trên những gì tôi nhập vào hộp biểu mẫu. Nhìn vào mô-đun tham chiếu Thực thể, có một số mã trong hook_autocomplete_callback xử lý đối số chuỗi $ và tìm kiếm kết quả khớp $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']- tương tự như vậy.

Bất cứ ai có thể giúp đỡ?

Mã của tôi:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function wl_event_form_event_node_form_alter(&$form, &$form_state, $form_id) {
  dpm($form);
  // We will get our term id argument from the from build itself.
    $node_id  = $form['#node']->nid;
  // This is the path we will create in hook_menu().
     $new_path = "wl_event/autocomplete/{$node_id}";
  // Maximum number of descrete values (deltas) that are present.
 $max_delta = $form['field_wl_event_acquired_resource']['und']['#max_delta'];
  // Hijack the autocomplete callback for each of our values.
  for($x=0; $x <= $max_delta; $x++) {
    $form['field_wl_event_acquired_resource']['und'][$x]['target_id']['#autocomplete_path']= $new_path;
  }
}

/**
 * Implements hook_menu().
 */
// can be used to do a lookup on a menu path to return json
// probably entity reference autocomplete does a similar thing

//we want to get all of the resources of the user profiles of
//users who are registered on the event

//
function wl_event_menu() {
  $items = array();
  $items['wl_event/autocomplete/%'] = array(
    'title' => t('project call back'),
    'page callback' => 'wl_event_autocomplete_callback',
    'page arguments' => array(2),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK
  );
  return $items;
}

function wl_event_autocomplete_callback($arg1, $string = '') {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'resource');
  // ->propertyCondition('nid', '1')
  $results = $query->execute();
  print_r(drupal_json_output($results));
  return drupal_json_output($results);
}

Làm thế nào để tôi giao diện với việc tra cứu và xuất nội dung mới. Tôi đã kiểm tra mã trong mô-đun thực thể, nhưng tôi không thể làm cho nó làm những gì tôi muốn. Mục đích của tôi là tìm kiếm những thứ được đăng ký thông qua đăng ký thực thể trên nút mà trường tự động hoàn thành được đính kèm, sau đó thực hiện truy vấn trên một nút khác gọi là 'tài nguyên' được tạo bởi mỗi một trong số những người dùng đã đăng ký. .
Andrew Welch

Mã trong entityreference thường thực hiện điều này là entityreference_autocomplete_callback_get_matches () trong drupalcode.org/project/entityreference.git/blob/HEAD:/...
Andrew Welch

theo như tôi có thể thấy (với một số thông tin mới đạt được ngay bây giờ), cuộc gọi lại được kích hoạt mỗi khi người dùng thêm một ký tự mới vào đường dẫn tự động hoàn thành, do đó, bất cứ điều gì trong cuộc gọi lại đều phải lấy giá trị được nhập và thực hiện tra cứu và trả về con trai
Andrew Welch

Câu trả lời:


10

EntityReference sử dụng hệ thống plugin ctools để xác định các trình xử lý lựa chọn đưa vào các tùy chọn tự động hoàn thành. Định nghĩa giao diện được định nghĩa trong entityreference / plugins / select / trừu tượng . Trong cùng thư mục đó, bạn sẽ thấy hai trình xử lý bao gồm, Đơn giản và Chế độ xem. Mỗi tệp được xác định bởi hai tệp, một tệp cho chính lớp và một tệp có mảng để đăng ký plugin với ctools.

Để cung cấp trình xử lý lựa chọn của riêng bạn, trước tiên hãy cho ctools biết nơi tìm plugin của bạn bằng cách triển khai hook_ctools_plugin_directory.

/**
 * Implements hook_ctools_plugin_directory().
 */
function wl_event_ctools_plugin_directory($module, $plugin) {
  if ($module == 'entityreference') {
    return 'plugins/' . $plugin;
  }
}

Sau đó tạo 2 tệp wl_event/plugins/selectiontương tự như các tệp trong thực thể. Các .inctập tin cần xác định các ctools cắm thông tin, và các .class.phptập tin nên chứa lớp plugin của bạn. Nhiều khả năng bạn sẽ muốn phân lớp EntityReference_SelectionHandler_Genericvà chỉ ghi đè các phương thức thích hợp.

Cuối cùng, hãy đảm bảo bạn thêm tệp với lớp plugin vào files[]mảng trong tệp thông tin mô-đun để trình tải tự động có thể tìm thấy.


Nghe có vẻ tốt với tôi. Bất cứ ai khác muốn bình luận / trả lời trước khi tôi đưa tiền thưởng?
Andrew Welch

Tôi đã tạo các tệp và các lớp, lớp của tôi mở rộng lớp gốc, nhưng lớp plugin của tôi không bao giờ được chọn. Bạn có thể vui lòng chỉnh sửa câu trả lời của bạn và mở rộng phần? Tôi có nên bằng cách nào đó chỉ ra rằng lớp học của tôi nên được ưu tiên hơn so với lớp ban đầu?
Alexei Rayu
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.