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.