Nếu bạn muốn sử dụng một hàm gọi lại menu khác, bạn có thể triển khai hook_menu_alter () để thay đổi gọi lại menu. Giả sử bạn muốn ghi đè trình đơn gọi lại menu Drupal xác định cho tìm kiếm , bạn có thể sử dụng mã sau đây.
function mymodule_menu_alter(&$items) {
if (isset($items['search'])) {
$items['search']['page callback'] = 'mymodule_search_view';
}
}
Từ mymodule_search_view()
bạn có thể gọi search_view () mà không cần bao gồm tệp chứa tệp đó, vì điều đó được thực hiện từ Drupal trước khi gọi lại menu gọi lại.
Mã tương tự có thể được thực hiện nếu gọi lại menu đang trả về một biểu mẫu, ngoại trừ việc thay vì gọi lại trang (có lẽ là drupal_get_form () ), bạn sẽ thay đổi đối số trang để sử dụng làm đối số đầu tiên cho tên gọi lại của Hàm trả về mảng mẫu. Thay vì làm điều này, bạn nên triển khai hook_form_alter () và để ẩn các phần tử biểu mẫu không cần thiết bằng $form['element']['#access'] = FALSE', and not with
unset ($ form ['Element']) `.
Đối với việc thay thế một chức năng được gọi từ một hook, những gì có thể được thực hiện là loại bỏ việc thực hiện hook gọi chức năng đó và thay thế nó bằng một triển khai khác. Chỉ có thể với Drupal 7, và nó phải được thực hiện cẩn thận. (Tôi sẽ giải thích lý do đúng.)
Giả sử bạn muốn thay đổi hàm được gọi trong menu_node_update () (việc triển khai hook_node_update () ) từ menu_node_save () thành mymodule_node_save()
. Bạn có thể sử dụng mã sau đây.
function mymodule_module_implements_alter(&$implementations, $hook) {
if ($hook == 'node_update') {
$group = $implementations['mymodule'];
unset($implementations['mymodule']);
unset($implementations['menu']);
$implementations = array('mymodule' => group) + $implementations;
}
}
function mymodule_node_update($node) {
mymodule_node_save();
}
Theo cách này, menu_node_update()
sẽ không được gọi nữa, nhưng mymodule_node_update()
sẽ.
Thông thường, các mô-đun phụ thuộc từ một hook được thực hiện bởi một mô-đun khác không kiểm tra xem hook đó có được thực thi hay không; họ kiểm tra mô-đun được kích hoạt (và giả sử hook được gọi) hoặc họ thêm mô-đun đó làm phụ thuộc. Tránh một hook được thực thi có thể gây ra vấn đề cho các mô-đun khác có thể khó theo dõi. Nếu thực sự cần thiết để tránh một hook được thực hiện bởi một mô-đun khác được thực thi, trước tiên bạn nên kiểm tra trên một trang web thử nghiệm rằng tất cả đang hoạt động như mong đợi. Hãy nhớ rằng phiên bản Drupal trong tương lai có thể phá vỡ mã của bạn và mã bạn đang viết cũng nên được kiểm tra trên phiên bản Drupal trong tương lai (khi chúng có sẵn).