thứ tự thực hiện hook_form_alter


10

Có cách nào để thay đổi thứ tự thực hiện hook_form_alter trong Drupal 7 mà không thay đổi trọng lượng của mô-đun hoặc hack Drupal Core không?

Tôi đang cố gắng thay đổi thành phần được thêm vào trong transl_form_node_form_alter từ mô-đun dịch. Khi gỡ lỗi biểu mẫu, tôi không thể tìm thấy phần tử vì vậy tôi giả sử hook của tôi đang được thực thi trước khi phần tử trong mô-đun dịch là.

Câu trả lời:


2

Tôi không nghĩ vậy. translation_form_node_form_alter()thực hiện hook_form_BASE_FORM_ID_alter()mà tôi tin là được gọi sau hook_form_alter() , vì vậy ngay cả việc thay đổi trọng lượng mô-đun sẽ không đủ. Tôi nghĩ rằng hai tùy chọn của bạn là sử dụng a hook_form_BASE_FORM_ID_alter()và đảm bảo bạn có trọng lượng mô-đun đủ cao hoặc sử dụng hook_form_FORM_ID_alter()(nếu có thể).


hook_form_FORM_ID_alter () IS được gọi sau hook_form_alter ()
iStryker

Đã giải quyết nó bằng hook_form_form_id_alter và trọng lượng mô-đun.
Bart

@Bart nếu bạn đã sử dụng hook_form_FORM_ID_alter()thì tôi hiểu rằng bạn không cần phải sửa đổi trọng lượng (vì tất cả các hook_form_FORM_ID_alter()cuộc gọi được thực hiện sau tất cả hook_form_BASE_FORM_ID_alter()).
Andy

@Andy, nó dường như không hoạt động nếu tôi sử dụng foo_form_page_node_form_alter mà không điều chỉnh trọng lượng.
Bart

1
@Bart Tôi đã xem nguồn để cung cấp cho bạn những chi tiết đó - hãy xem phần dưới cùng drupal_prepare_form()drupal_alter(). Tôi đã nhận thấy rằng các tài liệu dường như tắt, vì vậy tôi đã tạo ra một vấn đề . Tại sao nó không làm việc cho bạn mà không làm thay đổi trọng lượng hệ thống tho!
Andy

17

Cũng đáng đề cập, có một API 7 drupal mới có tên hook_module_implements_alter () cho phép bạn thay đổi thứ tự thực hiện cho một hook đã cho WIHOUT thay đổi bảng trọng số mô-đun.

Mã mẫu từ các tài liệu API cho thấy việc này dễ thực hiện như thế nào:

<?php
function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'rdf_mapping') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}
?>

Tôi đã có thể thực hiện hook của mình lần cuối với mã chính xác này. Cảm ơn!
Beau

4

Đây là cách đảm bảo hook_form_alter của bạn được gọi sau một mô-đun khác hook_form_alter:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, &$form_state, $form_id) {
  // do your stuff
}

/**
 * Implements hook_module_implements_alter().
 *
 * Make sure that our form alter is called AFTER the same hook provided in xxx
 */
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}

Điều này cũng hoạt động khi mô-đun khác đã cung cấp một hook form_alter trong biến thể: hook_form_FORM_ID_alter. (họ giải thích rằng trong tài liệu: hook_module_implements_alter ).

Tôi biết rằng bài đăng này khá giống với bài đăng của wiifm, nhưng nghĩ rằng nó hữu ích với một ví dụ với hook_form_alter


Không làm việc cho tôi.
Achraf JEDAY
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.