hook_preprocess_page และ hook_preprocess_html แตกต่างกันอย่างไร


13

ฉันเห็นว่าทั้งสองhook_preprocess_page()และhook_preprocess_html()มีการใช้งานhook_preprocess_HOOK()แต่ฉันไม่เข้าใจว่าจะใช้เมื่อใด

hook_preprocess_page ถูกเรียกมาก่อน แต่นั่นไม่ได้ช่วยให้ฉันเข้าใจว่าใครกำลังโทรมา

ดูที่debug_print_backtrace()ผลลัพธ์มันถูกเรียกโดยtheme()แต่นั่นไม่ได้ทำให้ฉันได้รับคำตอบจริงๆ

มันเป็นเพียงการกำหนดโดยอาร์เรย์ที่ส่งผ่านเข้าไปในdrupal_render()?


มันอยู่ในข้อความบันทึก แต่ฉันแก้ไขชื่อฟังก์ชันเพื่อจัดแนวพวกเขากับเอกสาร API
mpdonadio

1
template_preprocess_page()จะแตกต่างจากhook_preprocess_page()และมีเอกสารhook_preprocess_HOOKในทางเดียวกันมีสำหรับhook_process_HOOK
kiamlaluno

คำตอบ:


17

hook_preprocess_pageคือ hook preprocess ที่เรียกใช้เมื่อใช้ไฟล์เท็เพลต page.tpl.phpและhook_preprocess_htmlเป็น hook preprocess ที่เรียกใช้เมื่อใช้ไฟล์เท็เพลต html.tpl.php

ทั้งตะขอ preprocess จะถูกเรียกใช้เมื่อมีการแสดงผลtheme('page')หน้าเนื่องจากองค์ประกอบของหน้าที่กำหนดจากsystem_element_info ()กำหนด html เป็น wrapper ธีม

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

system_theme ()จากนั้นกำหนด html ดังนี้

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

สำหรับการนำไปใช้เมื่อใดhook_preprocess_html()คุณจะใช้เพื่อแก้ไขตัวแปรที่ใช้ในไฟล์ html.tpl.php ซึ่งโดยค่าเริ่มต้นจะมีเนื้อหาดังต่อไปนี้

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

ในขณะที่คุณสามารถดูจะมีเพียงแท็ก HTML $pageที่ห่อเนื้อหาของหน้าเว็บในที่มีอยู่ ด้วยสิ่งนี้คุณสามารถเปลี่ยนเนื้อหาของ<head>แท็กชื่อหน้า (เนื้อหาที่อยู่ใน<title>แท็กใน<head>แท็ก) สไตล์ CSS และไฟล์ JavaScript ที่เพิ่มให้กับเพจคลาสและคุณสมบัติสำหรับ<body>แท็ก
ด้วยไฟล์เท็มเพลต page.tpl.php คุณสามารถเปลี่ยนหน้าที่แสดงผลได้มากขึ้นรวมถึงชื่อไซต์สโลแกนของไซต์ชื่อหน้าและฟีดที่เชื่อมโยงกับหน้า สำหรับพวกเขาส่วนใหญ่มีฟังก์ชั่น / เบ็ดเสร็จ Drupal ที่คุณควรใช้แทน

hook_preprocess_HOOKเป็นชื่อ hook ทั่วไปที่ใช้สำหรับ hooks preprocess ทั้งหมดในวิธีเดียวกันhook_form_FORM_ID_alter()คือชื่อ hook ที่ใช้สำหรับคลาสของ hooks การแก้ไข


ขอบคุณสำหรับความสมบูรณ์ของคำตอบ ฉันสำรองข้อมูล Drupal จาก Rails ดังนั้นฉันจึงค้นหาบางแง่มุมง่ายกว่าที่อื่น
trimbletodd

8

hook_preprocess_pageและhook_preprocess_htmlเป็นตะขอเลเยอร์ธีมที่คุณสามารถใช้เพื่อเพิ่มตัวแปรที่สามารถใช้ในเทมเพลต ( page.tpl.php& html.tpl.php)

hook_preprocess_hookเป็นเลเยอร์ชุดรูปแบบขนาดใหญ่ที่ใช้หน้าและ html และชุดรูปแบบที่คุณกำหนดเองhook_theme()เช่นกัน

ตัวอย่างเช่นนี่คือการประกาศของ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
    ),
  );
}

และนี่คือฟังก์ชัน preprocess ของคุณ:

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()ช่วยให้คุณสามารถจับภาพหลายตะขอธีมและเพิ่มตัวแปรในมันได้เช่นกัน

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

ขอบคุณสำหรับคำใบ้พร้อมพารามิเตอร์เพิ่มเติม ช่วยฉันได้มากจริงๆเพราะสิ่งต่างๆเช่น "mytheme_preprocess_html" ไม่เคยถูกเรียกจากภายในโมดูลของฉัน
func0der
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.