모듈의 무게를 바꾸거나 Drupal Core를 해킹하지 않고 Drupal 7에서 hook_form_alter의 실행 순서를 변경하는 방법이 있습니까?
translation_form_node_form_alter에 추가 된 요소를 번역 모듈 에서 변경하려고 합니다. 양식을 디버깅 할 때 요소를 찾을 수 없으므로 변환 모듈의 후크가 실행되기 전에 후크가 실행되고 있다고 가정합니다.
모듈의 무게를 바꾸거나 Drupal Core를 해킹하지 않고 Drupal 7에서 hook_form_alter의 실행 순서를 변경하는 방법이 있습니까?
translation_form_node_form_alter에 추가 된 요소를 번역 모듈 에서 변경하려고 합니다. 양식을 디버깅 할 때 요소를 찾을 수 없으므로 변환 모듈의 후크가 실행되기 전에 후크가 실행되고 있다고 가정합니다.
답변:
나는 그렇게 생각하지 않습니다. 내가 생각하는 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()
경우 내 이해는 무게를 전혀 수정할 필요가 없다는 것입니다 (모든 hook_form_FORM_ID_alter()
호출이 결국 이루어 지기 때문에 hook_form_BASE_FORM_ID_alter()
).
drupal_prepare_form()
하고 drupal_alter()
. 문서가 잘못 표시되어 문제가 발생 했음을 이미 알고 있었습니다. 시스템 무게를 변경하지 않고 왜 작동하지 않는지 모르겠습니다!
또한 언급 할 가치가있는 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;
}
}
?>
다음은 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의 예제에서 유용하다고 생각했습니다.