¿Cuál es la diferencia entre hook_preprocess_page y hook_preprocess_html?

13

Veo que ambos hook_preprocess_page()y hook_preprocess_html()son puestas en práctica de hook_preprocess_HOOK(), pero no entiendo cuándo usar cuál.

hook_preprocess_page se llama primero, pero eso no me ayuda a entender quién lo llama.

Mirando la debug_print_backtrace()salida, se llama theme(), pero eso realmente no me lleva a la respuesta.

¿Se define simplemente por la matriz que se pasa drupal_render()?

trimbletodd
fuente
Está en el mensaje de registro, pero edité los nombres de las funciones para alinearlos con los documentos de la API.
mpdonadio
1
template_preprocess_page()es diferente de hook_preprocess_page(), y hay documentación para hook_preprocess_HOOK , de la misma manera que hay para hook_process_HOOK .
kiamlaluno

Respuestas:

17

hook_preprocess_pagees el enlace de preproceso invocado cuando se usa el archivo de plantilla page.tpl.php , y hook_preprocess_htmles el enlace de preproceso invocado cuando se usa el archivo de plantilla html.tpl.php .

Ambos ganchos de preproceso se invocan cuando se procesa una página theme('page'), ya que el elemento de página definido desde system_element_info () define html como envoltorio de tema.

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

system_theme () luego define html de la siguiente manera.

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

En cuanto a cuándo implementar hook_preprocess_html(), lo implementa para alterar las variables utilizadas en el archivo html.tpl.php, que por defecto tiene el siguiente contenido.

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

Como puede ver, contiene solo las etiquetas HTML que envuelven el contenido de una página, disponible en $page. Con eso, puede cambiar el contenido de la <head>etiqueta, el título de la página (el que va en la <title>etiqueta en la <head>etiqueta), los estilos CSS y los archivos JavaScript agregados a una página, las clases y los atributos de la <body>etiqueta.
Con el archivo de plantilla page.tpl.php, puede cambiar más de la página que se representa, incluido el nombre del sitio, el eslogan del sitio, el título de la página y los feeds asociados a la página. Para la mayoría de ellos, hay una función / gancho específico de Drupal que deberías usar.

hook_preprocess_HOOKes el nombre de gancho genérico utilizado para todos los ganchos de preproceso, del mismo modo hook_form_FORM_ID_alter()es el nombre de gancho utilizado para una clase de ganchos de alteración.

kiamlaluno
fuente
Gracias por la integridad de la respuesta. Estoy retrocediendo a Drupal desde Rails, así que encuentro algunos aspectos más fáciles que otros.
trimbletodd
8

hook_preprocess_pagey hook_preprocess_htmlson ganchos de capa de tema que puede usar para agregar variables que se pueden usar en sus plantillas ( page.tpl.php& html.tpl.php).

hook_preprocess_hookes el gran gancho de capa de tema que usan la página y el html, y también los personalizados que has creado hook_theme().

Por ejemplo, aquí está la declaración 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
    ),
  );
}

y aquí están sus funciones de preproceso:

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

adicionalmente le hook_preprocess()permite capturar múltiples ganchos de tema y agregar variables también

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
  }
}
medios inerciales
fuente
Gracias por la pista con el parámetro adicional. Realmente me ayudó mucho, porque cosas como "mytheme_preprocess_html" nunca reciben llamadas desde mis módulos.
func0der