ผ่านตัวแปรจากฟังก์ชัน preprocess html ไปยังฟังก์ชัน preprocess หน้าหรือไม่


10

ในชุดรูปแบบที่กำหนดเองhook_preprocess_page()และhook_preprocess_html()ฟังก์ชั่นของฉันฉันมักจะต้องระบุข้อมูลเดียวกัน แทนที่จะเรียกใช้คำสั่งเดิมหากตรวจสอบทั้งข้อมูลระบุเหมือนกันมันจะสมเหตุสมผลมากกว่าที่จะทำเพียงครั้งเดียวทั้งคู่จากนั้นส่งผ่านข้อมูลนั้นไปยังฟังก์ชัน preprocess อื่น ฉันจะทำสิ่งนี้ได้อย่างไร ฉันลองสิ่งต่อไปนี้ แต่มันไม่ทำงาน:

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

ฉันยังได้ลองวิธีอื่น ๆ (การตั้งค่าในฟังก์ชั่น preprocess html แล้วดึงข้อมูลในฟังก์ชั่น preprocess หน้า) แต่ก็ไม่ได้ผลเช่นกัน คำถามใดบ้างที่เกี่ยวข้อง: ในฟังก์ชัน preprocess, er, processing ในลำดับใด ดูเหมือนว่าฉันว่าฟังก์ชั่น preprocess หน้ามาก่อนหนึ่ง html นั้นถูกต้องหรือไม่

คำตอบ:


14

คุณจะต้องใช้ a globalหรือstaticตัวแปรในการทำสิ่งนี้ให้สำเร็จ ... โดยส่วนตัวฉันขอแนะนำให้staticใช้ฟังก์ชันผู้ช่วยทั่วไปโดยใช้รูปแบบคงที่ของ Drupal ดังนี้:

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

$varsอาร์เรย์สำหรับแต่ละฟังก์ชั่น preprocess เป็นวัตถุที่แตกต่างอย่างสิ้นเชิงในหน่วยความจำดังนั้นคุณจะไม่สามารถที่จะใช้อาร์เรย์ที่จะผ่านสิ่งต่าง ๆ รอบ ฉันเห็นรูปแบบแบบนี้ใช้กันมากใน Drupal core ดังนั้นฉันคิดว่ามันจะเป็นวิธีที่ดีที่สุด

แก้ไข

โอ้และใช่hook_preprocess_page()ถูกเรียกมาก่อนhook_preprocess_html()... เท่าที่ฉันรู้ Drupal ทำงานในลักษณะ "Inside-out" ดังนั้นhook_preprocess_html()อาจเป็นอันสุดท้ายที่ทำงานในการสร้างหน้า


3

ฉันทำได้โดยใช้ 'node' และ 'page' ที่คล้ายกันโดยทำดังนี้

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

ดังนั้นฉันคิดว่ามันจะทำงานคล้ายกับ 'หน้า' และ 'html' แทน


ใช่ว่าจะได้ผล แต่มันไม่ได้มีประสิทธิภาพมากนักเพราะ $ vars ที่ต้องการการประมวลผลบางประเภทนั้นจะต้องทำการประมวลผลหลายครั้ง
maxedison

จริงถ้าเป็นสิ่งที่มีน้ำหนักมากเหมือนกันระหว่างฟังก์ชั่น preprocess เช่นการตั้งค่าตัวแปรให้ผลลัพธ์ sql ที่ซับซ้อนใช่คุณอาจไม่ต้องการทำหลาย ๆ ครั้ง แต่ก็แก้ไขได้อย่างง่ายดายด้วยstatic การประมวลผลบางอย่างเช่นคำตอบแรก และการตั้งค่าน้ำหนักเบาอาจจริงเร็วกว่าเนื่องจากคุณไม่มีการเรียกใช้ฟังก์ชันสำหรับชุดตัวแปรแต่ละชุดเพียงครั้งแรกในการโทรจากฟังก์ชันหลัก และเห็นได้ชัดว่าส่วนสำคัญ (โหนด & หน้า) ได้รับการตั้งค่าเพียงครั้งเดียว
Jimajamma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.