hook_preprocess_page와 hook_preprocess_html의 차이점은 무엇입니까?


13

나는 두 볼 hook_preprocess_page()과이 hook_preprocess_html()구현되어 hook_preprocess_HOOK()있지만, 어떤 사용할 때 이해가 안 돼요.

hook_preprocess_page 먼저 호출되지만 누가 전화했는지 이해하는 데 실제로 도움이되지는 않습니다.

debug_print_backtrace()출력을 살펴보면에 의해 호출 theme()되지만 실제로 답변을 얻지는 못합니다.

단순히 전달 된 배열에 의해 정의 drupal_render()됩니까?


로그 메시지에 있지만 API 문서와 정렬되도록 함수 이름을 편집했습니다.
mpdonadio

1
template_preprocess_page()다른 hook_preprocess_page()및 문서에 대한이 hook_preprocess_HOOK 에 대한이 같은 방식으로, hook_process_HOOK .
kiamlaluno

답변:


17

hook_preprocess_page전처리 후크가 때 호출되는 page.tpl.php의 템플릿 파일을 사용하고 hook_preprocess_html때 전처리 후크가 호출 html.tpl.php의 템플릿 파일이 사용됩니다.

system_element_info ()theme('page') 에서 정의 된 페이지 요소가 html을 테마 랩퍼로 정의하므로 페이지를 렌더링 할 때 두 전처리 후크가 호출됩니다 .

  $types['page'] = array(
    '#show_messages' => TRUE,
    '#theme' => 'page',
    '#theme_wrappers' => array('html'),
  );

그런 다음 system_theme ()는 다음과 같이 html을 정의합니다.

'html' => array(
  'render element' => 'page',
  'template' => 'html',
),

구현시기 hook_preprocess_html()에 대해서는 html.tpl.php 파일에 사용 된 변수를 변경하도록 기본적으로 다음과 같은 내용을 포함하도록 구현합니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
  "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language; ?>" version="XHTML+RDFa 1.0" dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces; ?>>

<head profile="<?php print $grddl_profile; ?>">
  <?php print $head; ?>
  <title><?php print $head_title; ?></title>
  <?php print $styles; ?>
  <?php print $scripts; ?>
</head>
<body class="<?php print $classes; ?>" <?php print $attributes;?>>
  <div id="skip-link">
    <a href="#main-content" class="element-invisible element-focusable"><?php print t('Skip to main content'); ?></a>
  </div>
  <?php print $page_top; ?>
  <?php print $page; ?>
  <?php print $page_bottom; ?>
</body>
</html>

보시다시피, 페이지 내용을 감싸는 HTML 태그 만 포함되어 있습니다 $page. 그것으로, 당신은의 내용을 변경할 수 있습니다 <head>태그, 페이지 제목합니다 (에가는 일 <title>태그 <head>태그), CSS 스타일과 자바 스크립트는 페이지, 클래스와의 속성에 추가 된 파일 <body>태그입니다.
page.tpl.php 템플릿 파일을 사용하면 사이트 이름, 사이트 슬로건, 페이지 제목 및 페이지와 관련된 피드를 포함하여 렌더링중인 페이지를 더 많이 변경할 수 있습니다. 대부분의 경우, 대신 사용해야하는 특정 Drupal 기능 / 후크가 있습니다.

hook_preprocess_HOOK모든 전처리 후크에 사용되는 일반 후크 이름 hook_form_FORM_ID_alter()이며, 변경 후크 클래스에 사용되는 후크 이름 과 동일 합니다.


답변의 완전성에 감사드립니다. Rails에서 Drupal로 지원하고 있으므로 다른 측면보다 쉬운 측면을 찾고 있습니다.
trimbletodd

8

hook_preprocess_pagehook_preprocess_html테마 층은 당신이 당신의 템플릿 (에서 사용할 수있는 변수를 추가하는 데 사용할 수있는 후크이다 page.tpl.php& html.tpl.php).

hook_preprocess_hook이 페이지와 HTML이 사용하는 큰 테마 레이어 훅과 사용자 정의 커스텀 레이어 hook_theme()입니다.

예를 들어, 다음은 선언입니다 hook_theme().

function mymodule_theme($existing, $type, $theme, $path) {
  return array(
    'custom_theme_function' => array(
      'variables' => NULL
      'template' => 'custom-theme-template', // available as custom-theme-template.tpl.php
    ),
  );
}

전처리 기능은 다음과 같습니다.

mytheme_preprocess_page(&$vars) {
    $vars['variable'] = 'string'; // $variable will be available in page.tpl.php
}

mytheme_preprocess_html(&$vars) {
    $vars['variable'] = 'string'; // $variable will be available in html.tpl.php
}

mytheme_preprocess_custom_theme_function(&$vars) {
    $vars['variable'] = 'string';  // $variable will be available in the template you specified in mymodule_theme() (custom-theme-template.tpl.php)
}

또한 hook_preprocess()여러 테마 후크를 캡처하고 변수를 추가 할 수 있습니다.

mymodule_preprocess(&$vars, $hook) {
  if ($hook == 'custom_theme_function') {
    $vars['variable'] = 'string'; // $variable will be available in them template you specified in mymodule_theme() (custom-theme-template.tpl.php)
  }
  if ($hook == 'page') {
    $vars['variable'] = 'string'; // $variable will be available in page.tpl.php
  }
  if ($hook == 'html') {
    $vars['variable'] = 'string'; // $variable will be available in html.tpl.php
  }
}

추가 매개 변수가있는 힌트에 감사합니다. "mytheme_preprocess_html"과 같은 것들이 내 모듈 내에서 호출되지 않기 때문에 정말 많은 도움이되었습니다.
func0der
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.