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

Answers:


17

hook_preprocess_page是使用page.tpl.php模板文件时调用的预处理挂钩,并且hook_preprocess_html是使用html.tpl.php模板文件时调用的预处理挂钩。

当使用呈现页面时,两个预处理钩子都被调用theme('page'),因为从system_element_info()定义的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模板文件,您可以更改要呈现的页面的更多内容,包括网站名称,网站标语,页面标题以及与该页面关联的feed。对于其中大多数,您应该使用特定的Drupal函数/挂钩。

hook_preprocess_HOOK是用于所有预处理挂钩的通用挂钩名称,以相同的方式hook_form_FORM_ID_alter()用于一类变更挂钩的挂钩名称。


感谢答案的完整性。我正在从Rails支持Drupal,所以我发现某些方面比其他方面容易。
trimbletodd

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 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.