ความแตกต่างระหว่าง hook_page_alter และ preprocess_page หรือไม่


10

ฉันไม่เข้าใจอย่างสมบูรณ์เมื่อฉันควรใช้ hook_page_alter (& $ หน้า) หรือ template_preprocess_page (& $ vars, $ hook) ใน Drupal 7

อะไรคือแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับสิ่งนั้นที่จะใช้ใน template.php

ขอบคุณ

คำตอบ:


16

ความแตกต่างคือจุดประสงค์ของพวกเขา

hook_page_build ()และhook_page_alter ()ใช้เพื่อลบแก้ไขหรือเพิ่มองค์ประกอบที่ระดับหน้า
อาร์เรย์ $ page ส่งผ่านไปยังhook_page_alter()มีองค์ประกอบระดับบนสุดสำหรับแต่ละภูมิภาคของบล็อก โดยค่าเริ่มต้นพวกเขาเป็นคนต่อไปนี้:

  • page_top
  • หัวข้อ
  • sidebar_first
  • เนื้อหา
  • sidebar_second
  • page_bottom

ตัวอย่างของการนำไปใช้อาจเป็นดังต่อไปนี้:

function mymodule_page_alter(&$page) {
  // Add help text to the user login block.
  $page['sidebar_first']['user_login']['help'] = array(
    '#weight' => -10, 
    '#markup' => t('To post comments or add new content, you first have to log in.'),
  );
}

ฟังก์ชัน preprocess ถูกเรียกเพื่อแก้ไขตัวแปรที่ส่งผ่านไปยังไฟล์เทมเพลต พวกเขาไม่สามารถเปลี่ยนโครงสร้างของหน้า แต่พวกเขาสามารถแก้ไขเนื้อหาขององค์ประกอบบางอย่างของหน้าเปลี่ยนเนื้อหาของตัวแปรเหล่านั้น
ตัวอย่างเช่นโมดูล Overlay จะลบแท็บหลักเมื่อหน้าเว็บที่กำลังแสดงข้อมูลเป็นภาพซ้อนทับ

function overlay_preprocess_page(&$variables) {
  if (overlay_get_mode() == 'child') {
    unset($variables['tabs']['#primary']);
  }
}

1
แต่ด้วย hook preprocess_page ฉันสามารถเปลี่ยนโครงสร้างหน้าได้โดยเปลี่ยนสิ่งต่าง ๆ ใน $ vars ['page'] ฉันใช้มันเพราะฉันมีเวลายากที่จะรับ nid ด้วย hook_page_alter สำหรับหน้าโหนด
กาการีน

2
คุณสามารถรับ nid สำหรับเพจโหนดโดยใช้ menu_get_object ()
andrewmacpherson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.