Qual é a diferença entre hook_preprocess_page e hook_preprocess_html?

13

Vejo que tanto hook_preprocess_page()e hook_preprocess_html()são implementações de hook_preprocess_HOOK(), mas eu não entendo quando usar cada.

hook_preprocess_page é chamado primeiro, mas isso realmente não me ajuda a entender quem está chamando.

Olhando para a debug_print_backtrace()saída, está sendo chamado theme(), mas isso realmente não me leva à resposta.

É simplesmente definido pela matriz que é passada para drupal_render()?

trimbletodd
fonte
Está na mensagem de log, mas editei os nomes das funções para alinhá-los aos documentos da API.
mpdonadio
1
template_preprocess_page()é diferente hook_preprocess_page()e existe documentação para hook_preprocess_HOOK , da mesma forma que existe para hook_process_HOOK .
Kiamlaluno

Respostas:

17

hook_preprocess_pageé o gancho de pré-processo chamado quando o arquivo de modelo page.tpl.php é usado e hook_preprocess_htmlé o gancho de pré-processo chamado quando o arquivo de modelo html.tpl.php é usado.

Os ganchos de pré-processo são chamados quando uma página é renderizada theme('page'), pois o elemento da página definido em system_element_info () define html como wrapper de tema.

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

system_theme () define o html da seguinte maneira.

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

Quanto a quando implementar hook_preprocess_html(), você o implementa para alterar as variáveis ​​usadas no arquivo html.tpl.php, que por padrão possui o seguinte conteúdo.

<!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 você pode ver, ele contém apenas as tags HTML que envolvem o conteúdo de uma página, disponíveis em $page. Com isso, você pode alterar o conteúdo da <head>tag, o título da página (aquele que <title>aparece na <head>tag), os estilos CSS e os arquivos JavaScript adicionados a uma página, as classes e os atributos da <body>tag.
Com o arquivo de modelo page.tpl.php, você pode alterar mais a página que está sendo renderizada, incluindo o nome do site, o slogan do site, o título da página e os feeds associados à página. Para a maioria deles, existe uma função / gancho Drupal específica que você deve usar.

hook_preprocess_HOOKé o nome genérico do gancho usado para todos os ganchos de pré-processamento, da mesma maneira que hook_form_FORM_ID_alter()é o nome do gancho usado para uma classe de ganchos de alteração.

kiamlaluno
fonte
Obrigado pela completude da resposta. Estou apoiando o Drupal no Rails, por isso estou achando alguns aspectos mais fáceis do que outros.
trimbletodd
8

hook_preprocess_pagee hook_preprocess_htmlsão ganchos da camada de tema que você pode usar para adicionar variáveis ​​que podem ser usadas em seus modelos ( page.tpl.php& html.tpl.php).

hook_preprocess_hooké o grande gancho da camada de tema que a página e o html usam e os personalizados que você criou hook_theme()também.

Por exemplo, aqui está a declaração 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
    ),
  );
}

e aqui estão suas funções de pré-processo:

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

Além disso, hook_preprocess()permite capturar vários ganchos de tema e adicionar variáveis ​​também

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
fonte
Obrigado pela dica com o parâmetro adicional. Realmente me ajudou muito, porque coisas como "mytheme_preprocess_html" nunca são chamadas de dentro dos meus módulos.
func0der