web-dev-qa-db-fra.com

Quelle est la différence entre hook_preprocess_page et hook_preprocess_html?

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

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

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

Est-il simplement défini par le tableau qui est passé dans drupal_render()?

13
trimbletodd

hook_preprocess_page Est le hook de prétraitement invoqué lorsque le fichier de modèle page.tpl.php est utilisé, et hook_preprocess_html Est le hook de prétraitement invoqué lorsque html. tpl.php le fichier modèle 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 alors le html comme suit.

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

Quant au moment d'implémenter 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 ne contient que les balises HTML qui enveloppent le contenu d'une page, disponibles dans $page. Avec cela, vous pouvez changer le contenu de la balise <head>, Le titre de la page (celui qui va dans la balise <title> Dans la balise <head>), Les styles CSS et les fichiers JavaScript ajoutés à une page, les classes et les attributs de la balise <body>.
Avec le fichier de modèle page.tpl.php, vous pouvez modifier davantage la page en cours de rendu, y compris 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 spécifique Drupal) que vous devriez utiliser à la place.

hook_preprocess_HOOK Est 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() est le nom du hook utilisé pour une classe de hooks de modification.

17
kiamlaluno

hook_preprocess_page Et hook_preprocess_html Sont des crochets de calque de thème que vous pouvez utiliser pour ajouter des variables pouvant être utilisées dans vos modèles (page.tpl.php & html.tpl.php).

hook_preprocess_hook Est le grand crochet de calque de thème que cette page et ce code HTML utilisent, ainsi que ceux personnalisés que vous avez créés dans 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)
}

hook_preprocess() vous permet également de capturer plusieurs crochets de thème et d'y ajouter des variables

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
  }
}
8
inertialmedia