it-swarm-vi.com

thứ tự thực hiện hook_form_alter

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?

Tôi đang cố gắng thay đổi thành phần được thêm vào dịch_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à.

10
Bart

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 là afterhook_form_alter(), do đó, ngay cả việc thay đổi trọng lượng mô-đun cũng không đủ. Tôi nghĩ rằng hai tùy chọn của bạn là sử dụng 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ể).

2
Andy

Cũng đáng đề cập, có một API drupal 7 API mới được gọi là hook_module_implements_alter () cho phép bạn thay đổi thứ tự thực hiện cho một hook cụ thể 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;
  }
}
?>
17
wiifm

Đâ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

4
rosell.dk