테마 훅 vs 모듈 훅


10

때로는 후크를 적용하려고 할 때 모듈 파일에 있어야한다고 생각합니다.

테마의 template.php 파일 또는 모듈에서 구현할 수있는 후크를 아는 방법이 있습니까?


4
일반적으로 테마에서 후크를 대체 할 수없는 경우에는 적절한 이유가 있습니다. 테마는 모듈이 제공하는 컨텐츠 및 기능의 표시와 관련된 코드에만 해당되어야합니다. 기능이나 내용을 추가 / 제거 / 변경하는 코드는 일반적으로 모듈에 있어야합니다. 또한 테마를 변경하면 template.php에서 만든 사용자 정의가 손실된다는 사실에 대해 생각하십시오. 따라서 테마를 변경 한 경우 계속 유지하려는 경우 모듈에 들어가고 싶을 것입니다.
루비

답변:


11

일반적으로, 주제에 의해 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);
  }

타사 모듈에서 사용하는 후크의 경우 호출에 사용 된 코드를 확인해야합니다. 테마에 대해 변경 후크 만 호출 될 수 있지만 경우에 따라 테마에 의해 다른 후크도 구현 될 수 있습니다.
테마의 경우, 모든 활성화 된 테마가 모듈에서 발생하는 것과 반대로 후크 구현에 대해 점검되지는 않습니다. 보기 모듈에서 수행 한대로 현재 사용 된 테마와 기본 테마 만 확인합니다.


hook_entity_view_alter ()는 테마에서 작동하지 않습니다.
dxvargas

최소한 D7에서 테마의 대체 후크는 테마가 동일한 요청에서 이미 초기화 된 경우에만 호출됩니다 (예 :을 호출하여 theme()). 초기화되지 않은 경우 테마의 대체 후크가 실행되지 않습니다.
zwirbeltier

@zwirbeltier 페이지를 렌더링하는 데 사용되는 테마에 대해 테마 후크가 호출됩니다. theme()페이지에 사용 된 테마는 변경하지 않지만 데이터를 렌더링하는 함수를 호출합니다. 예를 들어 Garland에서 Minelli로 테마는 변경되지 않습니다.
kiamlaluno

@kiamlaluno : 코드를 보면 이전에 drupal_alter()호출 된 경우에만 테마에서 alter-hook을 호출한다는 것을 알 수 있습니다 drupal_theme_initialize(). 그렇지 않은 경우 활성 테마 (아직)가 없으므로 후크가 없습니다. 적어도 D7에서는 drupal_theme_initialize()요청에서 처음 호출 될 때 보장 할 수 없습니다 .
zwirbeltier

@zwirbeltier Drupal의 테마 세트는 페이지가 렌더링 될 때 이미 초기화되었습니다. 모듈이 적절한 함수를 호출하지 않고 페이지에 대한 테마를 설정하면 해당 페이지를 초기화해야합니다.
kiamlaluno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.