hook_form_alter 실행 순서


10

모듈의 무게를 바꾸거나 Drupal Core를 해킹하지 않고 Drupal 7에서 hook_form_alter의 실행 순서를 변경하는 방법이 있습니까?

translation_form_node_form_alter에 추가 된 요소를 번역 모듈 에서 변경하려고 합니다. 양식을 디버깅 할 때 요소를 찾을 수 없으므로 변환 모듈의 후크가 실행되기 전에 후크가 실행되고 있다고 가정합니다.

답변:


2

나는 그렇게 생각하지 않습니다. 내가 생각하는 translation_form_node_form_alter()구현 hook_form_BASE_FORM_ID_alter()후에 호출 hook_form_alter()되므로 모듈 무게를 변경해도 충분하지 않습니다. 귀하의 두 가지 옵션은 a를 사용하고 hook_form_BASE_FORM_ID_alter()모듈 무게가 충분히 높거나 hook_form_FORM_ID_alter()가능한 경우 사용하는 것 입니다.


hook_form_FORM_ID_alter () IS hook_form_alter () 이후에 호출 됨
iStryker

hook_form_form_id_alter와 모듈 무게를 사용하여 해결했습니다.
Bart

@Bart 당신이 사용한 hook_form_FORM_ID_alter()경우 내 이해는 무게를 전혀 수정할 필요가 없다는 것입니다 (모든 hook_form_FORM_ID_alter()호출이 결국 이루어 지기 때문에 hook_form_BASE_FORM_ID_alter()).
Andy

@Andy, 무게를 조정하지 않고 foo_form_page_node_form_alter를 사용하면 작동하지 않는 것 같습니다.
Bart

1
@Bart 나는 당신에게 그 정보를 제공하는 소스보고 있었다 -의 바닥을 확인 drupal_prepare_form()하고 drupal_alter(). 문서가 잘못 표시되어 문제가 발생 했음을 이미 알고 있었습니다. 시스템 무게를 변경하지 않고 왜 작동하지 않는지 모르겠습니다!
Andy

17

또한 언급 할 가치가있는 hook_module_implements_alter () 라는 새로운 drupal 7 API가 있습니다.이 API 는 모듈 가중치 테이블을 변경하여 지정된 후크에 대한 실행 순서를 변경할 수 있습니다.

이것이 얼마나 쉬운지를 보여주는 API 문서의 샘플 코드 :

<?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;
  }
}
?>

이 정확한 코드로 마지막으로 후크를 실행할 수있었습니다. 감사!
Beau

4

다음은 hook_form_alter가 다른 모듈 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;
  }
}

이는 다른 모듈이 변형에서 hook_form_FORM_ID_alter와 같은 form_alter 후크를 제공 한 경우에도 작동합니다. (문서에서 hook_module_implements_alter 설명합니다 ).

이 게시물이 wiifm의 게시물과 매우 유사하다는 것을 알고 있지만 hook_form_alter의 예제에서 유용하다고 생각했습니다.


나를 위해 작동하지 않았다.
Achraf JEDAY
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.