it-swarm.dev

타사 모듈 또는 핵심 모듈에서 제공하는 후크 구현을 변경하는 방법이 있습니까?

다른 모듈에서 수행 한 후크 구현을 대체해야하는 모듈이 있습니다.
Drupal 7? 가능하다면 어떤 조건에서 가능합니까?

다른 모듈에서 수행 한 후크 구현 대체는 해당 모듈이 활성화 될 때 Drupal에 의해 자동으로 호출되는 함수를 사용하는 것을 의미합니다. Poll 모듈이 활성화되면 Drupal poll_user_restriction_info() 또는 poll_metatags_info() (여기서 hook_user_restriction_info()hook_metatags_info()는 내 모듈에서 사용하는 사용자 지정 후크입니다.) 내 모듈 파일에있는 함수입니다.
사용 가능한 모듈을 기반으로 내 모듈 디렉토리 (예 : poll_custom_hooks.inc)에서 일부 포함 파일을로드하는 모듈의 함수를 사용할 수 있지만 Drupal는 이러한 파일을 자동으로로드합니다.

4
kiamlaluno

모듈이 모듈 파일이 아닌 파일에서 후크를 구현하고 해당 후크 구현을 재정의하려는 모듈이 모듈 파일에서이를 구현하는 경우에만 가능합니다. 이 경우 hook_module_implements_alter () 를 구현하여 Drupal)에 후크 구현이 외부 파일에 포함되어 있지 않다는 것을보고 할 수 있습니다 (즉, 후크 구현은 모듈 파일에 포함됨).

function mymodule_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'token_info') {
    $implementations['poll']['group'] = FALSE;
  }
}

후크 구현을 덮어 쓰고있는 모듈이 모듈 파일에서이를 구현하는 경우 해당 모듈에서 사용하는 파일을 변경하거나 필요한 모듈이 포함 된 디렉토리에 새 파일을 추가하지 않고는 아무것도 할 수 없습니다. "덮어 쓰기"됩니다. 그 이유는 다음과 같습니다.

  • module_hook () , module_invoke () 에서 호출 된 함수는 다음 코드를 사용하고 있습니다.

    function module_hook($module, $hook) {
      $function = $module . '_' . $hook;
      if (function_exists($function)) {
        return TRUE;
      }
    
      // If the hook implementation does not exist, check whether it may live in an
      // optional include file registered via hook_hook_info().
      $hook_info = module_hook_info();
      if (isset($hook_info[$hook]['group'])) {
        module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);
        if (function_exists($function)) {
          return TRUE;
        }
      }
      // ...
    }
    

    이 코드는 후크 구현이 Drupal에서 이미로드 된 파일 (예 : 모듈 파일)에없는 경우에만 module_hook_info()을 호출합니다. hook_module_implements_alter()module_hook_info()에 의해 호출되므로이 경우 hook_module_implements_alter()의 구현이 호출되지 않습니다.

  • module_implements() , module_invoke_all() 에 의해 호출 된 함수는 다음 코드를 실행합니다.

    foreach ($list as $module) {
      $include_file = isset($hook_info[$hook]['group']) && module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);
      // Since module_hook() may needlessly try to load the include file again,
      // function_exists() is used directly here.
      if (function_exists($module . '_' . $hook)) {
        $implementations[$hook][$module] = $include_file ? $hook_info[$hook]['group'] : FALSE;
      }
      // ...
    }
    

    코드는 후크를 구현하는 모듈이 포함 된 디렉토리에서로드 할 파일을 찾고 있습니다. 내 코드는 Drupal 후크가 포함 된 파일을 찾을 위치를 알 수 없으므로 파일에 넣을 수 있습니다. Drupal 모듈과 같은 자동로드) 내 모듈의 파일.

PHP가 두 번 정의 된 함수에 대해 불평하기 때문에 다른 모듈 파일에서 구현 된 함수로 모듈 파일에 구현 된 모듈 후크를 재정의하는 것은 작동하지 않습니다.

5
kiamlaluno

hook_module_implements_alter () 를 사용하여 주어진 후크를 구현하는 모듈 목록을 변경할 수 있습니다. 따라서 모듈에도 후크를 구현 한 다음 교체하려는 모듈에서 후크를 제거하십시오.

이 후크는 매우 신중하게 사용해야합니다. 정말 이상한 일을 할 수 있습니다. .

7
Berdir