Jaka jest różnica między hook_preprocess_page a hook_preprocess_html?

13

Widzę to hook_preprocess_page()i hook_preprocess_html()są implementacjami hook_preprocess_HOOK(), ale nie rozumiem, kiedy tego użyć.

hook_preprocess_page nazywa się pierwszy, ale to tak naprawdę nie pomaga mi zrozumieć, kto to nazywa.

Patrząc na debug_print_backtrace()wynik, jest wywoływany theme(), ale tak naprawdę nie dostaję odpowiedzi.

Czy jest to po prostu zdefiniowane przez tablicę, do której jest przekazywany drupal_render()?

trimbletodd
źródło
Jest w komunikacie dziennika, ale edytowałem nazwy funkcji, aby wyrównać je z dokumentami API.
mpdonadio
1
template_preprocess_page()różni się od hook_preprocess_page()i istnieje dokumentacja dla hook_preprocess_HOOK , podobnie jak dla hook_process_HOOK .
kiamlaluno

Odpowiedzi:

17

hook_preprocess_pagejest hakiem wstępnego wywołania, gdy używany jest plik szablonu page.tpl.php , i hook_preprocess_htmljest hakiem wstępnego wywołania, gdy używany jest plik szablonu html.tpl.php .

Oba przechwytywania procesu wstępnego są wywoływane podczas renderowania strony theme('page'), ponieważ element strony zdefiniowany w systemie_element_info () definiuje HTML jako opakowanie motywu.

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

system_theme () następnie definiuje HTML w następujący sposób.

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

Jeśli chodzi o czas implementacji hook_preprocess_html(), to implementujesz go, aby zmienić zmienne używane w pliku html.tpl.php, który domyślnie ma następującą zawartość.

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

Jak widać, zawiera tylko tagi HTML, które zawijają zawartość strony, dostępne w $page. Dzięki temu możesz zmienić zawartość <head>znacznika, tytuł strony (ten, który znajduje się w <title>znaczniku w <head>znaczniku), style CSS i pliki JavaScript dodane do strony, klasy i atrybuty <body>znacznika.
Za pomocą pliku szablonu page.tpl.php możesz zmienić więcej renderowanej strony, w tym nazwę witryny, hasło witryny, tytuł strony i kanały powiązane ze stroną. Dla większości z nich istnieje specyficzna funkcja / haczyk Drupala, którego powinieneś użyć zamiast tego.

hook_preprocess_HOOKto ogólna nazwa haka używana dla wszystkich haków wstępnego przetwarzania, w taki sam sposób hook_form_FORM_ID_alter()jak nazwa haka używana dla klasy haków modyfikacji.

kiamlaluno
źródło
Dziękuję za kompletność odpowiedzi. Wracam do Drupala z Rails, więc znajduję pewne aspekty łatwiejsze niż inne.
trimbletodd
8

hook_preprocess_pagei hook_preprocess_htmlsą zaczepami warstwy motywu, których można użyć do dodania zmiennych, które można wykorzystać w szablonach ( page.tpl.php& html.tpl.php).

hook_preprocess_hookto duży hak warstwy motywu, którego używają strona i HTML, a także niestandardowe hook_theme().

Na przykład tutaj jest deklaracja 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
    ),
  );
}

a oto funkcje wstępnego przetwarzania:

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

dodatkowo hook_preprocess()pozwala na przechwytywanie wielu zaczepów motywu i dodawanie w nim również zmiennych

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
  }
}
bezwładność
źródło
Dziękujemy za podpowiedź z dodatkowym parametrem. Naprawdę bardzo mi pomogło, ponieważ takie rzeczy jak „mytheme_preprocess_html” nigdy nie są wywoływane z moich modułów.
func0der