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:
- hoạt động (ít)
- 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ự .
Đ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 –