때로는 후크를 적용하려고 할 때 모듈 파일에 있어야한다고 생각합니다.
테마의 template.php 파일 또는 모듈에서 구현할 수있는 후크를 아는 방법이 있습니까?
때로는 후크를 적용하려고 할 때 모듈 파일에 있어야한다고 생각합니다.
테마의 template.php 파일 또는 모듈에서 구현할 수있는 후크를 아는 방법이 있습니까?
답변:
일반적으로, 주제에 의해 alter hook 만 구현할 수 있습니다. 이는 hook_form_alter()
and와 같은 후크를 의미 hook_menu_alter()
하거나 drupal_alter()
Drupal 7 이하 ( ModuleHandler()::alter()
또는 ThemeManager::alter()
Drupal 8)에서 호출되는 모든 후크를 의미 합니다.
에 의해 호출되는 다른 후크 module_invoke_all()
( ModuleHandler::invokeAll()
드루팔 8)는 현재 사용 가능한 테마 어떤 훅을 정의하는 경우 단순히 사실에 대한 코드가 확인하지 않는 주제에 대해 호출되지 않습니다.
foreach (module_implements($hook) as $module) {
$function = $module . '_' . $hook;
if (function_exists($function)) {
$result = call_user_func_array($function, $args);
if (isset($result) && is_array($result)) {
$return = array_merge_recursive($return, $result);
}
elseif (isset($result)) {
$return[] = $result;
}
}
}
드루팔 8에서, ModuleHandler
모듈로부터 구현 클래스를 원용 후크 ThemeManager
클래스가 원용 테마 첫 번째 클래스가 구현에 의해 구현되는 후크 invoke()
와 invokeAll()
. 이는 Drupal 8 테마 테마가 Drupal 코어에 의해 호출되지 않았 음을 의미합니다.
이는 Drupal 코어 후크 및 대부분 타사 모듈에서 사용하는 모든 후크에 유효합니다. 그런 다음 테마에 의해 후크가 구현되었는지 확인하고 호출하는 것은 모듈에 달려 있습니다. 이것이 Views 모듈이하는 일입니다.
// Let modules modify the view just prior to rendering it.
foreach (module_implements('views_pre_render') as $module) {
$function = $module . '_views_pre_render';
$function($this);
}
// Let the themes play too, because pre render is a very themey thing.
foreach ($GLOBALS['base_theme_info'] as $base) {
$function = $base->name . '_views_pre_render';
if (function_exists($function)) {
$function($this);
}
}
$function = $GLOBALS['theme'] . '_views_pre_render';
if (function_exists($function)) {
$function($this);
}
타사 모듈에서 사용하는 후크의 경우 호출에 사용 된 코드를 확인해야합니다. 테마에 대해 변경 후크 만 호출 될 수 있지만 경우에 따라 테마에 의해 다른 후크도 구현 될 수 있습니다.
테마의 경우, 모든 활성화 된 테마가 모듈에서 발생하는 것과 반대로 후크 구현에 대해 점검되지는 않습니다. 보기 모듈에서 수행 한대로 현재 사용 된 테마와 기본 테마 만 확인합니다.
theme()
). 초기화되지 않은 경우 테마의 대체 후크가 실행되지 않습니다.
theme()
페이지에 사용 된 테마는 변경하지 않지만 데이터를 렌더링하는 함수를 호출합니다. 예를 들어 Garland에서 Minelli로 테마는 변경되지 않습니다.
drupal_alter()
호출 된 경우에만 테마에서 alter-hook을 호출한다는 것을 알 수 있습니다 drupal_theme_initialize()
. 그렇지 않은 경우 활성 테마 (아직)가 없으므로 후크가 없습니다. 적어도 D7에서는 drupal_theme_initialize()
요청에서 처음 호출 될 때 보장 할 수 없습니다 .