Quelle est la différence entre hook_preprocess_page et hook_preprocess_html?

13

Je vois que les deux hook_preprocess_page()et hook_preprocess_html()sont des implémentations de hook_preprocess_HOOK(), mais je ne comprends pas quand les utiliser.

hook_preprocess_page est appelé en premier, mais cela ne m'aide pas vraiment à comprendre qui l'appelle.

En regardant la debug_print_backtrace()sortie, elle est appelée theme(), mais cela ne m'amène pas vraiment à la réponse.

Est-il simplement défini par le tableau transmis drupal_render()?

trimbletodd
la source
C'est dans le message du journal, mais j'ai modifié les noms des fonctions pour les aligner avec les documents de l'API.
mpdonadio
1
template_preprocess_page()est différent de hook_preprocess_page(), et il existe une documentation pour hook_preprocess_HOOK , de la même manière que pour hook_process_HOOK .
kiamlaluno

Réponses:

17

hook_preprocess_pageest le hook de prétraitement invoqué lorsque le fichier de modèle page.tpl.php est utilisé et hook_preprocess_htmlle hook de prétraitement invoqué lorsque le fichier de modèle html.tpl.php est utilisé.

Les deux crochets de prétraitement sont invoqués lorsqu'une page est rendue avec theme('page'), car l'élément de page défini à partir de system_element_info () définit html comme wrapper de thème.

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

system_theme () définit ensuite le html comme suit.

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

Quant au moment de l'implémentation hook_preprocess_html(), vous l'implémentez pour modifier les variables utilisées dans le fichier html.tpl.php, qui par défaut a le contenu suivant.

<!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>

Comme vous pouvez le voir, il contient uniquement les balises HTML qui enveloppent le contenu d'une page, disponibles dans $page. Avec cela, vous pouvez modifier le contenu de la <head>balise, le titre de la page (celui qui va dans la <title>balise dans la <head>balise), les styles CSS et les fichiers JavaScript ajoutés à une page, les classes et les attributs de la <body>balise.
Le fichier de modèle page.tpl.php vous permet de modifier davantage la page en cours de rendu, notamment le nom du site, le slogan du site, le titre de la page et les flux associés à la page. Pour la plupart d'entre eux, il existe une fonction / hook Drupal spécifique que vous devriez utiliser à la place.

hook_preprocess_HOOKest le nom générique du hook utilisé pour tous les hooks de prétraitement, de la même manière que hook_form_FORM_ID_alter()le nom du hook utilisé pour une classe de hooks d'altération.

kiamlaluno
la source
Merci pour l'exhaustivité de la réponse. Je reviens à Drupal depuis Rails, donc je trouve certains aspects plus faciles que d'autres.
trimbletodd
8

hook_preprocess_pageet hook_preprocess_htmlsont des crochets de couche de thème que vous pouvez utiliser pour ajouter des variables qui peuvent être utilisées dans vos modèles ( page.tpl.php& html.tpl.php).

hook_preprocess_hookest le grand crochet de calque de thème que cette page et le format HTML utilisent, ainsi que ceux personnalisés que vous avez créés hook_theme().

Par exemple, voici la déclaration de 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
    ),
  );
}

et voici vos fonctions de prétraitement:

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)
}

De plus hook_preprocess()vous permet de capturer plusieurs crochets à thème, et d' ajouter des variables aussi bien

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
la source
Merci pour l'astuce avec le paramètre supplémentaire. Cela m'a vraiment beaucoup aidé, car des choses comme "mytheme_preprocess_html" ne sont jamais appelées depuis mes modules.
func0der