2009-10-04 38 views
13

Sử dụng trường autocomplete cho một nodereference cck luôn hiển thị id nút như một phần mở rộng khó hiểu trong ngoặc vuông:Loại bỏ [nid: n] trong nodereference autocomplete

Page Title [nid:23] 

Tôi hiểu rằng điều này đảm bảo rằng các lựa chọn là duy nhất trong trường hợp các nút có cùng một tiêu đề, nhưng rõ ràng đây là một điều khó chịu để tiếp xúc với người dùng.

Có ai có thành công trong việc xóa các dấu ngoặc đơn này hoặc thêm một số nhận dạng duy nhất khác không?

Trả lời

17

Cuối cùng, bạn cần thay đổi đầu ra của nodereference_autocomplete() trong nodereference.module.

Để thực hiện việc này đúng cách, bạn muốn mô-đun tùy chỉnh ghi đè chức năng một cách rõ ràng.

Chức năng này được định nghĩa là một callback menu, do đó,

/** 
* Implementation of hook_menu_alter(). 
*/ 
function custom_module_menu_alter(&$items) { 
    $items['nodereference/autocomplete']['page callback'] = 'custom_module_new_nodereference_autocomplete'; 
} 

Sau đó, sao chép chức năng nodereference_autocomplete vào mô-đun tùy chỉnh của bạn, thay đổi tên của nó để phù hợp với callback của bạn. Sau đó, thay đổi một dòng này:

$matches[$row['title'] ." [nid:$id]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>'; 

Thả tham chiếu nid.

$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>'; 

Tôi tin rằng số nhận dạng hoàn toàn là mỹ phẩm tại thời điểm này, có nghĩa là bạn cũng có thể thay đổi văn bản theo ý muốn. Nếu nó không hoàn toàn là mỹ phẩm, tốt, tôi chưa thử nghiệm để xem điều gì sẽ xảy ra trong điều kiện sai.

Tôi luôn muốn xác định cách thực hiện việc này. Cảm ơn bạn đã thúc đẩy tôi với câu hỏi của bạn.

+0

Điều tuyệt vời là nó xóa [nid: 123] khỏi chế độ xem sau khi nút được chọn, nhưng [nid: 123] vẫn xuất hiện khi tải nút để chỉnh sửa nút . Tôi muốn có thể loại bỏ nid khỏi hiển thị khi tôi chỉnh sửa nút. Ok, bây giờ tôi thấy điều này: http://stackoverflow.com/questions/2743924/how-remove-node-id-nidn-in-nodereference-fields –

6

Những gì Grayside đã đăng sẽ hoạt động ... miễn là bạn không có hai nút có cùng tiêu đề. Nói cách khác, nếu bạn muốn làm như Grayside đã đề xuất, bạn cần phải nhận thức được rằng nid không hoàn toàn không quan trọng. Hàm nodereference_autocomplete_validate() thực hiện hai điều. Nó kiểm tra xem có một nút nào khớp với không và nếu có, nó sẽ chuyển giá trị nid, đặt nó vào mảng $form_state. Nếu nó không thể tìm thấy một nút, nó sẽ thiết lập một lỗi. Nếu nid là hiện tại, nó sẽ được sử dụng để có được nút, cũng là nhanh hơn, mã là ở đây:

preg_match('/^(?:\s*|(.*))?\[\s*nid\s*:\s*(\d+)\s*\]$/', $value, $matches); 
    if (!empty($matches)) { 
     // Explicit [nid:n]. 
     list(, $title, $nid) = $matches; 
     if (!empty($title) && ($n = node_load($nid)) && $title != $n->title) { 
      form_error($element[$field_key], t('%name: title mismatch. Please check your selection.', array('%name' => t($field['widget']['label'])))); 
     } 
    } 

này chỉ kiểm tra để xem nếu có một nid và kiểm tra xem nút đó phù hợp với tiêu đề, nếu như vậy nid được thông qua.

Tùy chọn thứ 2 chậm hơn một chút, nhưng ở đây có lỗi xảy ra. Nếu bạn thực hiện theo các thực hiện, bạn sẽ thấy, rằng nếu sẽ cố gắng tìm một nút dựa trên tiêu đề một mình, và sẽ mất nút đầu tiên phù hợp. Kết quả của điều này, là nếu bạn có hai nút với cùng một tiêu đề, một trong số chúng sẽ luôn được sử dụng. Điều này có thể không phải là một vấn đề cho bạn, nhưng vấn đề là, rằng bạn sẽ không bao giờ tìm hiểu xem điều này có xảy ra hay không. Mọi thứ sẽ hoạt động tốt và người dùng sẽ nghĩ rằng mình đã chọn nút mà anh ta muốn. Đây có thể là trường hợp, nhưng anh ta cũng có thể đã chọn nút sai.

Vì vậy, trong ngắn hạn, bạn có thể thoát khỏi các nid trong callback autocomplete, nhưng nó có 2 nhược điểm:

  1. hoạt động (ít)
  2. sự không chắc chắn trong việc lựa chọn các nút chính xác.

Vì vậy, bạn phải suy nghĩ về điều đó, trước khi đi tuyến đường này. Đặc biệt, vì bạn rất có thể sẽ không thể tìm ra vấn đề về việc lựa chọn các nút sai, nên nó có xảy ra không. Một điều cần lưu ý là, nid hiển thị, cũng mang lại một số thông tin có giá trị cho người dùng, một cách nhanh chóng để tra cứu nút, nếu họ nghi ngờ nếu đó là nút họ muốn, nếu một số nút có tiêu đề tương tự .

+0

Cảm ơn bạn đã làm rõ các chi tiết. Nếu bạn có thể giả định các tiêu đề nút duy nhất, thì đó là * chỉ * một hiệu suất đạt được khi gửi, chứ không phải là một điểm tham nhũng tiêu cực. – Grayside

+0

cuối cùng bạn có thể sử dụng một javascript đặt phần [nid:% id] trong trường nhập ẩn sau đó tạo lại trường văn bản trước khi gửi biểu mẫu – gpilotino

0

Tôi nhận được câu trả lời của Grayside để làm việc, nhưng tôi đã phải sử dụng MENU thay đổi, thay vì thay đổi MẪU mà ông đã đăng. Không to!

function custommodule_menu_alter(&$items) { 
    $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete'; 
} 
+0

Ack! Typo. Cảm ơn bạn, sẽ thay đổi trong câu trả lời của tôi. – Grayside

0

Tôi đã tìm thấy một giải pháp thay thế là để thay đổi loại phụ tùng của bạn để chọn danh sách và sau đó sử dụng chosen module để chuyển đổi danh sách của bạn đến một lĩnh vực autocomplete.

Nút xử lý này có cùng tiêu đề và thực sự tôi nghĩ giao diện người dùng tốt hơn giao diện người dùng được cung cấp bởi tiện ích tự động điền.

0

Để bất kỳ ai xem chủ đề này (thay vì cũ) bằng cách tìm kiếm trên google - cho Drupal 7, hãy xem xét sử dụng mô đun entityreference và loại trường "Tham chiếu thực thể" nếu có thể.

Bạn có thể đạt được nhiều hơn trong cấu hình với trường "Tham chiếu thực thể". Nó không có vấn đề này với nid trong dấu ngoặc vuông.

0

Đây là phiên bản đầy đủ của Drupal 7 (Tài liệu tham khảo 7.x-2.1) của câu trả lời của Grayside. Điều này có trong mô-đun tùy chỉnh của bạn:

/** 
* Implementation of hook_menu_alter(). 
*/ 
function custom_menu_alter(&$items) { 
    $items['node_reference/autocomplete/%/%/%']['page callback'] = 'custom_new_node_reference_autocomplete'; 
} 

/** 
* Implementation of Menu callback for the autocomplete results. 
*/ 
function custom_new_node_reference_autocomplete($entity_type, $bundle, $field_name, $string = '') { 
    $field = field_info_field($field_name); 
    $instance = field_info_instance($entity_type, $field_name, $bundle); 

    $options = array(
    'string' => $string, 
    'match' => $instance['widget']['settings']['autocomplete_match'], 
    'limit' => 10, 
); 
    $references = node_reference_potential_references($field, $options); 

    $matches = array(); 
    foreach ($references as $id => $row) { 
    // Markup is fine in autocompletion results (might happen when rendered 
    // through Views) but we want to remove hyperlinks. 
    $suggestion = preg_replace('/<a href="([^<]*)">([^<]*)<\/a>/', '$2', $row['rendered']); 
    // Add a class wrapper for a few required CSS overrides. 
    $matches[$row['title']] = '<div class="reference-autocomplete">' . $suggestion . '</div>'; // this is the line that was modified to remove the "[nid:XX]" disambiguator 
    } 

    drupal_json_output($matches); 
}