В чем разница между 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()?

trimbletodd
источник
Это в сообщении журнала, но я отредактировал имена функций, чтобы выровнять их с документами 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 .

Обе ловушки препроцессора вызываются при визуализации страницы theme('page'), поскольку элемент страницы, определенный из system_element_info (), определяет 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()является имя хука, используемое для класса хуков изменения.

киамлалуно
источник
Спасибо за полноту ответа. Я возвращаюсь в Drupal из Rails, поэтому нахожу некоторые аспекты проще, чем другие.
trimbletodd
8

hook_preprocess_pageи hook_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
  }
}
inertialmedia
источник
Спасибо за подсказку с дополнительным параметром. На самом деле мне очень помогло, потому что такие вещи, как «mytheme_preprocess_html», никогда не вызываются из моих модулей.
func0der