Qual è la differenza tra hook_preprocess_page e hook_preprocess_html?


13

Vedo che entrambi hook_preprocess_page()e hook_preprocess_html()sono implementazioni di hook_preprocess_HOOK(), ma non capisco quando usare quale.

hook_preprocess_page viene chiamato per primo, ma questo non mi aiuta davvero a capire chi lo sta chiamando.

Guardando l' debug_print_backtrace()output, viene chiamato theme(), ma questo non mi porta davvero alla risposta.

È semplicemente definito dall'array in cui viene passato drupal_render()?


È nel messaggio di registro, ma ho modificato i nomi delle funzioni per allinearli ai documenti API.
mpdonadio

1
template_preprocess_page()è diverso da hook_preprocess_page()e esiste la documentazione per hook_preprocess_HOOK , allo stesso modo per hook_process_HOOK .
kiamlaluno

Risposte:


17

hook_preprocess_pageè l'hook di pre-elaborazione invocato quando si utilizza il file modello page.tpl.php ed hook_preprocess_htmlè l'hook di pre-elaborazione richiamato quando si utilizza il file modello html.tpl.php .

Entrambi gli hook di preelaborazione vengono richiamati quando viene eseguito il rendering di una pagina theme('page'), poiché l'elemento di pagina definito da system_element_info () definisce HTML come wrapper di temi.

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

system_theme () quindi definisce html come segue.

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

Per quanto riguarda quando implementarlo hook_preprocess_html(), lo si implementa per alterare le variabili utilizzate nel file html.tpl.php, che per impostazione predefinita ha il seguente contenuto.

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

Come puoi vedere, contiene solo i tag HTML che racchiudono il contenuto di una pagina, disponibile in $page. Con ciò, puoi cambiare il contenuto del <head>tag, il titolo della pagina (quello che si trova nel <title>tag nel <head>tag), gli stili CSS e i file JavaScript aggiunti a una pagina, le classi e gli attributi per il <body>tag.
Con il file modello page.tpl.php, puoi modificare una parte maggiore della pagina visualizzata, inclusi il nome del sito, lo slogan del sito, il titolo della pagina e i feed associati alla pagina. Per la maggior parte di essi, esiste invece una funzione / hook Drupal specifica che dovresti invece usare.

hook_preprocess_HOOKè il nome di hook generico utilizzato per tutti gli hook di preelaborazione, allo stesso modo hook_form_FORM_ID_alter()è il nome di hook utilizzato per una classe di hook di modifica.


Grazie per la completezza della risposta. Sto sostenendo Drupal da Rails, quindi trovo alcuni aspetti più facili di altri.
trimbletodd,

8

hook_preprocess_pagee hook_preprocess_htmlsono hook a livello di tema che puoi usare per aggiungere variabili che possono essere usate nei tuoi template ( page.tpl.php& html.tpl.php).

hook_preprocess_hookè il grande hook del layer tema utilizzato da page e html, e anche quelli personalizzati che hai creato hook_theme().

Ad esempio, ecco la dichiarazione di 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 qui ci sono le tue funzioni di pre-elaborazione:

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()consente inoltre di catturare più hook a tema e aggiungere anche variabili al suo interno

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

Grazie per il suggerimento con il parametro aggiuntivo. Mi ha davvero aiutato molto, perché cose come "mytheme_preprocess_html" non vengono mai chiamate dai miei moduli.
func0der,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.