Apa perbedaan antara hook_preprocess_page dan hook_preprocess_html?


13

Saya melihat keduanya hook_preprocess_page()dan hook_preprocess_html()merupakan implementasi dari hook_preprocess_HOOK(), tetapi saya tidak mengerti kapan harus menggunakan yang mana.

hook_preprocess_page dipanggil pertama, tetapi itu tidak benar-benar membantu saya memahami siapa yang memanggilnya.

Melihat debug_print_backtrace()output, itu dipanggil theme(), tetapi itu tidak benar-benar membuat saya mendapatkan jawabannya.

Apakah itu hanya ditentukan oleh array yang diteruskan drupal_render()?


Ada dalam pesan log, tapi saya mengedit nama fungsi untuk menyelaraskannya dengan dokumen API.
mpdonadio

1
template_preprocess_page()berbeda dari hook_preprocess_page(), dan ada dokumentasi untuk hook_preprocess_HOOK , dengan cara yang sama ada untuk hook_process_HOOK .
kiamlaluno

Jawaban:


17

hook_preprocess_pageadalah kait preprocess yang dipanggil ketika file template page.tpl.php digunakan, dan hook_preprocess_htmlhook preprocess dipanggil ketika file template html.tpl.php digunakan.

Kedua kait praproses dipanggil saat laman dirender theme('page'), karena elemen laman yang ditentukan dari system_element_info () mendefinisikan html sebagai pembungkus tema.

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

system_theme () lalu mendefinisikan html sebagai berikut.

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

Adapun kapan harus mengimplementasikan hook_preprocess_html(), Anda menerapkannya untuk mengubah variabel yang digunakan dalam file html.tpl.php, yang secara default memiliki konten berikut.

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

Seperti yang Anda lihat, itu hanya berisi tag HTML yang membungkus konten halaman, tersedia di $page. Dengan itu, Anda dapat mengubah konten <head>tag, judul halaman (yang masuk dalam <title>tag pada <head>tag), gaya CSS, dan file JavaScript yang ditambahkan ke halaman, kelas, dan atribut untuk <body>tag.
Dengan file template page.tpl.php, Anda dapat mengubah lebih banyak halaman yang diberikan, termasuk nama situs, slogan situs, judul halaman, dan feed yang terkait dengan halaman tersebut. Untuk sebagian besar dari mereka, ada fungsi Drupal khusus / hook yang harus Anda gunakan.

hook_preprocess_HOOKadalah nama kait generik yang digunakan untuk semua kait preproses, dengan cara yang sama hook_form_FORM_ID_alter()adalah nama kait yang digunakan untuk kelas kait pengubahan.


Terima kasih atas kelengkapan jawabannya. Saya mendukung Drupal dari Rails jadi saya menemukan beberapa aspek lebih mudah daripada yang lain.
trimbletodd

8

hook_preprocess_pagedan hook_preprocess_htmladalah pengait lapisan tema yang dapat Anda gunakan untuk menambahkan variabel yang dapat digunakan di templat ( page.tpl.php& html.tpl.php) Anda.

hook_preprocess_hookadalah pengait lapisan tema besar yang digunakan laman dan html, dan pengubahsuaian khusus yang Anda buat hook_theme()juga.

Sebagai contoh, berikut adalah deklarasi dari 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
    ),
  );
}

dan inilah fungsi preproses Anda:

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

tambahan hook_preprocess()memungkinkan Anda untuk menangkap beberapa kait tema, dan menambahkan variabel di dalamnya juga

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

Terima kasih atas petunjuknya dengan parameter tambahan. Benar-benar banyak membantu saya, karena hal-hal seperti "mytheme_preprocess_html" tidak pernah dipanggil dari dalam modul saya.
func0der
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.