Drupal은 내 후크를 호출하지 않습니다.


9

모듈을 개발하고 있지만 추가하는 후크는 Drupal에서 호출되지 않습니다. 하나 이상의 후크로 발생합니다.

나는 후크에 대한 문서를 읽었으며 왜 이런 일이 발생했는지 설명 할 수있는 것을 찾을 수 없습니다. 올바른 매개 변수를 사용하고 올바른 값을 반환하는지 확인했습니다.

내가 무엇을 잘못하고 있지? 누락 된 것이 있습니까?


이 질문은 Drupal이 호출하지 않은 후크에 대한 질문에 대한 표준 질문으로 생각됩니다.
kiamlaluno

답변:


13

모듈을 개발할 때는 다음 사항에 유의하십시오.

  • 모듈에서 수행 된 후크의 구현은 이름에 모듈 짧은 이름 ( 기계 이름 이라고도 함)이 붙는 함수입니다 . 후크 이름에서 후크 부품 을 제거 하고 모듈 머신 이름으로 교체하십시오. 예를 들어 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리팩토링 중에 명령문이 후크 함수 중 하나로 들어 가지 않았 는지 확인하십시오 . 그것은 후크에 나타나는 후크뿐만 아니라 다른 후크를 끊는 연쇄 반응을 일으켜 문제를 찾기가 어려울 수 있습니다.


또한 나중에 다른 사람들을 위해 내 실수를 언급 할 가치가 있습니다. .module (또는 다른 "플랫", 비 클래스 PHP) 파일에 네임 스페이스를 정의하지 마십시오. 그렇지 않으면 Drupal은 파일을 인식하지 못하므로 파일에 정의 된 후크를 발견하지 못합니다.
Balu Ertl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.