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
キアムルノ

回答:


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スタイルとJavaScriptファイル、<body>タグのクラスと属性を変更できます。
page.tpl.phpテンプレートファイルを使用すると、サイト名、サイトスローガン、ページタイトル、ページに関連付けられたフィードなど、レンダリングされるページをさらに変更できます。ほとんどの場合、代わりに使用する必要がある特定のDrupal関数/フックがあります。

hook_preprocess_HOOKは、すべての前処理フックに使用される汎用フック名です。同様にhook_form_FORM_ID_alter()、変更フックのクラスに使用されるフック名です。


回答の完全性に感謝します。RailsからDrupalに戻っているので、いくつかの側面を他の側面よりも簡単に見つけています。
トリムブルトッド

8

hook_preprocess_pageまたhook_preprocess_html、テンプレートで使用できる変数を追加するために使用できるテーマレイヤーフックです(page.tpl.phphtml.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.