สำหรับแสดงเฉพาะบล็อกของคุณในเทมเพลตที่มี preprocess วิธีที่ดีที่สุดคือ
$block = \Drupal\block\Entity\Block::load('my_block_id');
$variables['My_region'] = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
และในpage.html.twig
หรือnode.html.twig
หรือxxx.html.twig
ใช้ตัวแปร My_region ของคุณเช่นนี้:
{% if page.My_region %}
{{ page.My_region }}
{% endif %}
และในอาเรย์ที่สามารถเรนเดอร์ (โมดูลที่กำหนดเอง) โดยตัวอย่างลงในคอนโทรลเลอร์ที่กำหนดเองในเนื้อหา ():
public function content() {
$block = \Drupal\block\Entity\Block::load('my_block_id');
$block_content = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
return array(
'#type' => 'container',
'#attributes' => array(
'class' => array("Myclass"),
),
"element-content" => $block_content,
'#weight' => 0,
);
}
การใช้ drupal_render
ไม่เป็นประโยชน์เป็น Drupal แล้วถือว่าการแสดงผลใน D8 และนี่คือเลิก คุณควรใช้\Drupal::service('renderer')->renderRoot()
แทน
มันหนักไปหน่อยมันจะดีกว่าถ้าใช้ระบบพื้นที่สูงสุดและไม่เพิ่ม load block จาก preprocess ในกรณีของการใช้คอนโทรลเลอร์ในโมดูลของคุณสิ่งนี้ดูเหมือนว่าเป็นการใช้ที่สมเหตุสมผล