Was ist der Unterschied zwischen hook_preprocess_page und hook_preprocess_html?


13

Ich sehe, dass beides hook_preprocess_page()und hook_preprocess_html()Implementierungen von sind hook_preprocess_HOOK(), aber ich verstehe nicht, wann ich welche verwenden soll.

hook_preprocess_page wird zuerst angerufen, aber das hilft mir nicht wirklich zu verstehen, wer es anruft.

Wenn ich mir die debug_print_backtrace()Ausgabe anschaue, wird sie aufgerufen theme(), aber das bringt mich nicht wirklich zur Antwort.

Wird es einfach durch das Array definiert, an das übergeben wird drupal_render()?


Es ist in der Protokollnachricht enthalten, aber ich habe die Funktionsnamen bearbeitet, um sie an den API-Dokumenten auszurichten.
mpdonadio

1
template_preprocess_page()unterscheidet sich von hook_preprocess_page()und es gibt Dokumentation für hook_preprocess_HOOK , genauso wie für hook_process_HOOK .
kiamlaluno

Antworten:


17

hook_preprocess_pagewird der Vorverarbeitungs-Hook aufgerufen, wenn die Vorlagendatei page.tpl.php verwendet wird, und hook_preprocess_htmlwird der Vorverarbeitungs-Hook aufgerufen, wenn die Vorlagendatei html.tpl.php verwendet wird.

Beide Preprocess-Hooks werden aufgerufen, wenn eine Seite mit gerendert wird theme('page'), da das von system_element_info () definierte Seitenelement html als Theme-Wrapper definiert.

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

system_theme () definiert dann HTML wie folgt.

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

Wenn hook_preprocess_html()Sie implementieren möchten, müssen Sie es implementieren, um die in der Datei html.tpl.php verwendeten Variablen zu ändern, die standardmäßig den folgenden Inhalt hat.

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

Wie Sie sehen, enthält es nur die HTML-Tags, die den Inhalt einer Seite umschließen, die in verfügbar sind $page. Damit können Sie den Inhalt des <head>Tags, den Seitentitel (derjenige, der in das <title>Tag im <head>Tag eingefügt wird), die CSS-Stile und die einer Seite hinzugefügten JavaScript-Dateien, die Klassen und die Attribute für das <body>Tag ändern.
Mit der Vorlagendatei page.tpl.php können Sie einen größeren Teil der gerenderten Seite ändern, einschließlich des Site-Namens, des Site-Slogans, des Seitentitels und der mit der Seite verknüpften Feeds. Für die meisten von ihnen gibt es eine spezielle Drupal-Funktion / einen speziellen Hook, den Sie stattdessen verwenden sollten.

hook_preprocess_HOOKist der generische Hook-Name, der für alle Vorverarbeitungs-Hooks verwendet wird, ebenso wie hook_form_FORM_ID_alter()der Hook-Name, der für eine Klasse von Änderungs-Hooks verwendet wird.


Vielen Dank für die Vollständigkeit der Antwort. Ich kehre von Rails zu Drupal zurück, daher finde ich einige Aspekte einfacher als andere.
Trimbletodd

8

hook_preprocess_pageund hook_preprocess_htmlsind Themenebenen-Hooks, mit denen Sie Variablen hinzufügen können, die in Ihren Vorlagen ( page.tpl.php& html.tpl.php) verwendet werden können.

hook_preprocess_hookist der große Theme-Layer-Hook, den diese Seite und HTML verwenden, und die benutzerdefinierten, die Sie ebenfalls erstellt haben hook_theme().

Zum Beispiel ist hier die Deklaration von 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
    ),
  );
}

Und hier sind Ihre Vorverarbeitungsfunktionen:

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

Außerdem hook_preprocess()können Sie mehrere Themen-Hooks erfassen und Variablen hinzufügen

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

Vielen Dank für den Hinweis mit dem zusätzlichen Parameter. Hat mir sehr geholfen, weil Dinge wie "mytheme_preprocess_html" in meinen Modulen nie aufgerufen werden.
func0der
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.