สามารถพิมพ์ภูมิภาคภายในเทมเพลตโหนดได้หรือไม่


25

สามารถพิมพ์ภูมิภาคภายในเทมเพลตโหนดหรือภูมิภาคนั้น จำกัด ขอบเขตไว้ที่เทมเพลตหน้าอย่างเคร่งครัดหรือไม่

คำตอบ:


48

คุณสามารถพิมพ์ภูมิภาคภายในเทมเพลตใด ๆ แต่พวกเขาไม่พร้อมใช้งานในกล่องในnode.tpl.phpเทมเพลต หากต้องการทำให้พร้อมใช้งานคุณจะสร้างตัวแปรใหม่สำหรับใช้ในnode.tpl.phpเทมเพลตที่จะมีเนื้อหาภูมิภาคทั้งหมด

การสร้างตัวแปรเท็มเพลตใหม่ทำได้โดยใช้ฟังก์ชัน preprocess ในtemplate.phpไฟล์ธีมของคุณสร้างฟังก์ชั่นที่มีลักษณะดังนี้:

function mytheme_preprocess_node(&$variables) {
}

การแทนที่mythemeด้วยชื่อย่อของธีมของคุณ ตอนนี้เพื่อให้ Drupal รู้จักฟังก์ชัน preprocess ใหม่นี้คุณต้องสร้างชุดรูปแบบรีจิสตรีของไซต์ของคุณใหม่ สิ่งนี้ตรงไปตรงมาเหมือนกับการกำหนดค่าการพัฒนาประสิทธิภาพและกดปุ่ม "ล้างแคชทั้งหมด" ที่ด้านบน

ในตอนนี้ฟังก์ชั่นการทำงานของ preprocess ก็คือ$variablesมีอาร์เรย์ที่สอดคล้องกับตัวแปรที่มีอยู่ของแม่แบบ ยกตัวอย่างเช่นในnode.tpl.php, $submittedมีนามปากกาผู้เขียน ในฟังก์ชั่น preprocess $variables['submitted']ที่กล่าวมานั้นพบใน

ในการเลียนแบบสิ่งที่คุณมีในpage.tpl.phpที่ซึ่งคุณมีอาร์เรย์ที่เรียก$pageว่ามีภูมิภาคทั้งหมดคุณต้องการเติม$variables['page']ข้อมูล

ปัญหาคือมีคนอยู่$pageในnode.tpl.phpนั้นด้วยค่าจริง / เท็จที่ช่วยให้คุณรู้ว่าคุณกำลังดูที่โหนดด้วยตัวเองหรือในรายการ

ดังนั้นเพื่อหลีกเลี่ยงการชนกันของชื่อให้เติม$regionแทน:

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

จากนั้นในnode.tpl.phpเทมเพลตของชุดรูปแบบของคุณคุณสามารถแสดงผลภูมิภาคใด ๆ โดยทำดังต่อไปนี้:

<?php print render($region['sidebar_first']); ?>

ในกรณีที่sidebar_firstเป็นชื่อของภูมิภาคที่คุณต้องการที่จะทำให้


1
ในที่สุดวิธีแก้ปัญหาการทำงานสำหรับ Drupal 7 :)
Eduard Luca

4
นอกจากนี้ยังมี 'n' <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>แก้ปัญหาสกปรกรวดเร็วที่ทำงานให้ฉัน จากที่นี่: webomelette.com/add-region-node-template
Darragh Enright

วิธีนี้เป็นวิธีที่ดี คุณสามารถยกตัวอย่างว่าเมื่อใดจะใช้กับพื้นที่การพิมพ์ภายใน node.tpl.php มากที่สุดแทนที่จะใช้ใน page.tpl.php
Randell

มันขึ้นอยู่กับการออกแบบของคุณ บางครั้งเลย์เอาต์อาจวางแถบด้านข้างในที่ที่มันง่ายกว่ามากถ้ามันอยู่ในโหนด div แทนที่จะเป็นด้านนอก
rooby

อย่าลืมห่อหุ้มภูมิภาคที่เหมาะสม! ดูsystem_page_alter ()สำหรับการอ้างอิง โปรดจำไว้ว่าblock_get_blocks_by_region()ส่งคืนอาร์เรย์ของบล็อกเท่านั้นและหากคุณต้องการแสดงผลเป็นพื้นที่คุณต้องเพิ่ม wrapper ของภูมิภาค
SiliconMind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.