แสดงบล็อกโดยทางโปรแกรมในแม่แบบกิ่งไม้


28

ฉันต้องการแสดงบล็อกการดูในเทมเพลตของฉัน html.twig ใน D7 ฉันจะทำสิ่งนี้:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

ใน Drupal 8 module_invoke เลิกใช้แล้วและแนะนำให้ใช้สิ่งนี้: (ฉันได้เพิ่มชื่อบล็อกเป็นพารามิเตอร์ตัวที่สอง)

Drupal::moduleHandler()->invoke($block, 'views_block__blog_block_1', $args = array());

ฉันลองบางสิ่ง ก่อนอื่นให้ลองทำในเทมเพลตกิ่งไม้ แต่ฉันไม่รู้วิธีเรียกใช้ฟังก์ชัน php ในเทมเพลตกิ่งไม้ดังนั้นจึงไม่ได้ผลดีเกินไป

จากนั้นฉันเรียกใช้ฟังก์ชันใน preprocess_page () ฟังก์ชั่นในไฟล์. theme แต่ก่อนที่ฉันจะสามารถใช้งานได้ฉันพยายามทำสิ่งที่ง่ายกว่าเพียงแค่พยายามทำให้ตัวแปรทำงานภายในเทมเพลตกิ่งที่ไม่ทำงานเช่น:

ในฟังก์ชัน template_preprocess_page (& $ vars) ในไฟล์. theme:

$test = 'Hello World';
$vars['$my_var'] = $test;

ฉันพยายามโทรหา my_var ในเทมเพลตกิ่งไม้ แต่มันใช้งานไม่ได้และฉันได้รับข้อความแสดงข้อผิดพลาดว่า "เว็บไซต์มีข้อผิดพลาดกรุณาติดต่อผู้ดูแลระบบ"

ดังนั้นเพื่อสรุปนี่คือคำถามของฉัน:

  1. ฉันจะทำให้ตัวแปรพร้อมใช้งานภายในแม่แบบกิ่งไม้ได้อย่างไร
  2. ฉันจะเรียกฟังก์ชันภายในแม่แบบกิ่งไม้ได้อย่างไร
  3. ฉันจะแสดงบล็อกภายในไฟล์. theme หรือแม่แบบกิ่งไม้ได้หรือไม่?

คำตอบ:


47

คุณกำลังติดตามผิดกับ module_invoke () นั่นเป็นเพียงวิธีแฟนซีในการเรียกใช้ฟังก์ชัน {$ module_name} _block_view ()

ความจริงที่ว่ามันเปลี่ยนไปไม่สำคัญประเด็นก็คือระบบบล็อกเปลี่ยนไปอย่างสมบูรณ์ใน 8.x และตอนนี้ใช้ปลั๊กอินและเอนทิตี config ฟังก์ชั่นเหล่านั้นไม่มีอยู่อีกต่อไป

คุณมีตัวเลือกน้อย

a) ใช้เอนทิตีการตั้งค่าบล็อกที่มีอยู่อีกครั้งและดู ง่ายมาก แต่ต้องมีการกำหนดค่าที่มีอยู่เช่นบล็อกที่ถูกปิดใช้งาน

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  ->getViewBuilder('block')
  ->view($block);

b) สร้างอินสแตนซ์บล็อกปลั๊กอินโดยตรงส่งการกำหนดค่า (คุณสามารถค้นหา id ปลั๊กอินบล็อกและการกำหนดค่าได้อย่างง่ายดายในเอนทิตีการตั้งค่าบล็อกที่ส่งออก) ข้อเสียคือคุณไม่ได้รับการเรนเดอร์แคช แต่ถ้าคุณแสดงที่ใดที่แคชแล้ว (เช่นเทมเพลตโหนด) นั่นไม่สำคัญเลย

$variables['block_output'] = \Drupal::service('plugin.manager.block')
  ->createInstance($plugin, $configuration)
  ->build();

c) ในกรณีที่มีมุมมองคุณสามารถโหลดมุมมองโดยตรงและแสดง

d) คุณสามารถคิดวิธีการของคุณใหม่ได้อย่างสมบูรณ์และใช้พื้นที่บล็อกหรือPage Manager (ซึ่งใช้ปลั๊กอินบล็อกมาตรฐานใน 8.x)


ขอบคุณสำหรับคำตอบ. ฉันอยากไปกับ A หรือ B. A Region จะใช้งานได้ แต่ฉันต้องการหลีกเลี่ยงการใช้พื้นที่ ปัญหาเดียวที่ฉันมีคือเมื่อฉันเรียก block_output ในเทมเพลตทวิกที่ฉันมีข้อผิดพลาด - "ชื่อแท็กที่ไม่คาดคิด" block_output "ดังนั้นฉันไม่ทราบวิธีการทำให้ตัวแปรนั้นพร้อมใช้งานแม้ว่าฉันจะสร้างขึ้นในฟังก์ชั่น preprocess_page ฉันจะลองทำดู
Rick Bergmann

ดูเหมือนว่าคุณกำลังใช้ {% หรือไม่ ใช้ {{block_output}}
Berdir

ใช่นั่นแหละ! ยังคงพยายามที่จะได้รับกิ่งไม้ ขอบคุณ
Rick Bergmann

เนื่องจาก Drupal 8.0.0 entityManagerเลิกใช้แล้ว ใช้entityTypeManagerแทน
Philipp Michael

ฉันจะวางรหัสนี้ที่ไหน $ block = \ Drupal \ block \ Entity \ Block :: load ('your_block_id'); $ ตัวแปร ['block_output'] = \ Drupal :: entityManager () -> getViewBuilder ('บล็อก') -> ดู ($ block); ขอขอบคุณ!

11

ใน Drupal 8 สิ่งนี้ใช้สำหรับการแสดงผลปลั๊กอินบล็อก (นั่นคือสิ่งที่คุณสร้างขึ้นในโมดูลที่กำหนดเอง) ใน preprocess_hook:

function mymodule_preprocess_something(array &$variables) {
  $customblock = \Drupal::service('plugin.manager.block')->createInstance('my_custom_block', []);
  $variables['content']['custom_block_output'] = $customblock->build();
}

จากนั้นคุณสามารถแสดงผลในเทมเพลตกิ่งของคุณดังนี้:

{{ content.custom_block_output }}

หมายเหตุ: จะเป็นการโหลดบล็อกทั่วไปของคุณ หากคุณต้องการโหลดอินสแตนซ์ของบล็อกด้วยตัวแปร (หลังจากคุณสร้างที่ / admin / โครงสร้าง / บล็อก) คุณต้องโหลดด้วยวิธีนี้:

    // Load Instance of custom block with variables
    $example_block = \Drupal::entityManager()->getStorage('block')->load('example_block_machine_name');
    if (!empty($example_block)){
      $example_block_content = \Drupal::entityManager()
        ->getViewBuilder('block')
        ->view($example_block);
      if ($example_block_content) {
        // Add block content to build array
        $variables['content']['custom_block_output'] = $example_block_content;
      }
    }

1
นี่คือทางออกสำหรับฉันและโดยง่ายที่สุด
Guillaume Bois

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