답변:
모듈을 개발할 때는 다음 사항에 유의하십시오.
모듈에서 수행 된 후크의 구현은 이름에 모듈 짧은 이름 ( 기계 이름 이라고도 함)이 붙는 함수입니다 . 후크 이름에서 후크 부품 을 제거 하고 모듈 머신 이름으로 교체하십시오. 예를 들어 hook_menu()
example.module에서 의 구현은 입니다 example_menu()
. 모듈이 example_menu.module이고 함수가 example_menu()
인 hook_menu()
경우 example_menu.module 의 구현으로 간주되지 않습니다 .
이것은 또한 것으로, 예를 들면, 수단 hook_form_alter()
example_form.module에서 구현하지 않다 example_form_alter()
, 그러나 example_form_form_alter()
. 다른 예로, example.module에서 hook_form_FORM_ID_alter()
반환 된 양식을 변경하기위한 done 의 구현은 아니지만user_register_form()
example_form_user_register_alter()
example_form_user_register_form_alter()
. 양식 ID는 user_register_form 입니다.
일반적으로 문제를 만들지 않습니다 모듈 컴퓨터 이름에 대문자를 사용하여 말하기 : PHP는 차이가되지 않습니다 myModule_get_value()
, 그리고 mymodule_get_value()
, 그리고 $value = myModule_get_value()
중 하나를 부를 것이다 myModule_get_value()
, 또는 mymodule_get_value()
.
그러나 모듈 머신 이름에 대문자를 사용하면 모듈에 대한 업데이트 후크를 정의 할 때 문제가 발생할 수 있습니다. drupal_get_schema_versions()
사용 가능한 업데이트 목록을 반환하는 함수에는 다음 코드가 포함되어 있습니다.
// Prepare regular expression to match all possible defined hook_update_N().
$regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
$functions = get_defined_functions();
// Narrow this down to functions ending with an integer, since all
// hook_update_N() functions end this way, and there are other
// possible functions which match '_update_'. We use preg_grep() here
// instead of foreaching through all defined functions, since the loop
// through all PHP functions can take significant page execution time
// and this function is called on every administrative page via
// system_requirements().
foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
// If this function is a module update function, add it to the list of
// module updates.
if (preg_match($regexp, $function, $matches)) {
$updates[$matches['module']][] = $matches['version'];
}
}
마지막 행 drupal_get_schema_versions()
은 다음과 같습니다.
return empty($updates[$module]) ? FALSE : $updates[$module];
모듈 이름이 myModule.module이면 myModule_update로 drupal_get_schema_versions('myModule')
시작하고 숫자로 끝나는 이름의 함수 만 반환합니다. mymodule_update_7120()
에서 사용 된 정규식 drupal_get_schema_versions()
은 대소 문자를 구분 하므로 이와 같은 함수 는 포함되지 않습니다 . 정규 표현식은 여전히 Drupal 7에서 사용 된 것과 동일하므로 Drupal 8에도 적용됩니다.
특정 후크에서 일부 후크가 호출됩니다. 예를 들어, hook_menu()
한 hook_menu_alter()
모듈이 활성화 된 후 드루팔 7에서 호출 / 비활성화, 또는 라우터 정보 캐시가 클리어 될 때; hook_init()
캐시 된 페이지에 대해 호출되지 않습니다.
특정 이벤트가 발생하여 후크가 호출되면 유사한 이벤트가 발생하지 않을 때까지 후크가 다시 호출되지 않습니다. 두 개의 연속적인 페이지 요청에서 호출되지 않습니다.
Drupal은 모듈에서 구현 된 후크 목록을 캐시합니다. 새 후크를 추가하기 위해 활성화 된 모듈의 코드를 편집하는 경우 먼저 모듈을 비활성화했다가 다시 활성화해야합니다. 그렇지 않으면 Drupal이 새 후크가 있음을 알 수 없습니다.
return
리팩토링 중에 명령문이 후크 함수 중 하나로 들어 가지 않았 는지 확인하십시오 . 그것은 후크에 나타나는 후크뿐만 아니라 다른 후크를 끊는 연쇄 반응을 일으켜 문제를 찾기가 어려울 수 있습니다.