ฉันจะวางบล็อกโดยทางโปรแกรมได้อย่างไร


10

จาก UI คุณสามารถเพิ่มบล็อกในภูมิภาคด้วยวิธีดังกล่าว:

  1. ไปที่ผู้ดูแลระบบ -> โครงสร้าง -> เค้าโครงเลย์เอาต์ (/ admin / โครงสร้าง / บล็อก)
  2. คลิกที่ปุ่ม "บล็อกสถานที่" นอกเหนือจากชื่อภูมิภาค

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


หลังจากสร้างบล็อกคุณสามารถจัดเรียงตำแหน่งของบล็อกได้จาก: site_name / admin / โครงสร้าง / บล็อก
Crazyrubixfan

ฉันถือว่าคุณพิมพ์ผิด "กำหนดบล็อกให้กับภูมิภาค"
cilefen

@ ไอศครีมเจลลี่สิ่งที่ฉันพยายามทำคือการทำสิ่งนี้โดยทางโปรแกรม cilefen, ใช่ว่านั่นคือสิ่งที่ฉันหมายถึง% -)
jmzea

@ShawnConn ขอบคุณที่คล้ายกัน แต่ไม่เหมือนกันทั้งหมด ฉันพบคำตอบที่อื่น
jmzea

คำตอบ:


9

เพื่อให้บล็อกปลั๊กอินคุณสามารถสร้างอาร์เรย์ของการตั้งค่าและส่งออกไป\Drupal\block\Entity\Block::create()เพื่อสร้างวัตถุบล็อกและบันทึกอินสแตนซ์

ตัวอย่างเช่นหากคุณต้องการเพิ่มบล็อกDevel Execute PHPในธีม Seven:

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();

สวัสดีฉันต้องการความช่วยเหลือ ฉันสร้างบล็อกที่กำหนดเองโดยใช้ UI และต้องการวางในส่วนท้ายของโปรแกรมโดยมีวัตถุประสงค์เพื่อทดสอบ ฉันไม่ทราบวิธีรับปลั๊กอินจากบล็อกที่กำหนดเองที่สร้างโดย UI .. ขอบคุณ
Mudassar Ali

ถามคำถามนี้เป็นคำถามอื่น ความคิดเห็นไม่ใช่สำหรับการถามคำถาม
Shawn Conn

มันมีอยู่แล้ว drupal.stackexchange.com/questions/207042/…
Mudassar Ali

คืออะไร? idที่นี่? มันเหมือนกับชื่อบล็อกหรือไม่
Crazyrubixfan

@RubberDuckIsKing ฉันเชื่อว่าคุณสามารถตั้งชื่อidสิ่งที่คุณต้องการตราบใดที่มันไม่ซ้ำกัน ตัวอย่างเช่นคุณอาจต้องการที่จะเริ่มต้นด้วยชื่อของโมดูลในของตน.
Parag

7

คุณสามารถใช้Twig tweak module ได้:

โมดูล Twig Tweak มอบส่วนขยาย Twig พร้อมฟังก์ชั่นและตัวกรองที่มีประโยชน์ซึ่งสามารถปรับปรุงประสบการณ์ผู้พัฒนาได้

และจากนั้นในภูมิภาคแม่แบบกิ่งไม้ของคุณ:

{{ drupal_block('block_id') }}

ปัญหาเกี่ยวกับการแก้ปัญหานี้คือ tweaks twig ยังต้องการให้คุณวางบล็อกแล้วปิดการใช้งาน
ปรึกษา

6

ตัวอย่างของบล็อก (ซึ่งประเภท "บล็อก" การตั้งค่าและตำแหน่ง) \Drupal\block\Entity\Blockแต่ละคนเป็นนิติบุคคลการตั้งค่า: ดังนั้นสิ่งที่คุณต้องทำคือสร้างอินสแตนซ์ใหม่ของเอนทิตีนี้พร้อมรายละเอียดที่ถูกต้องและเสร็จสิ้น

สิ่งนี้สามารถทำได้ แต่ซับซ้อนมากคุณต้องเข้าใจระบบปลั๊กอินบล็อกระบบปลั๊กอินและอีกมากมาย

คุณสามารถดูที่จะได้รับความรู้สึกสำหรับนี้หรือ\Drupal\block\BlockForm::submitForm \Drupal\simpletest\BlockCreationTrait::placeBlockคุณอาจต้องการคิดว่านี่เป็นสิ่งที่คุณต้องการจริงๆการมองเห็นบล็อกนั้นค่อนข้างซับซ้อน


4
นอกเหนือจากสภาพการมองเห็นฉันไม่คิดว่ามันซับซ้อนขนาดนั้น \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () อาจเป็นตัวอย่างที่ดีกว่าในการดูคุณสามารถนำเข้าไฟล์การกำหนดค่าที่ส่งออกบางส่วนได้
Berdir

@Berdir ขอบคุณสำหรับลิงก์ไปยังคุณลักษณะการทดสอบให้เพิ่มเข้าไป เนื่องจาก Drupal 8 ยังเด็กมากผู้คนจำนวนมากไม่รู้มากเกี่ยวกับระบบปลั๊กอินและเอกสารสามารถใช้กรณีการใช้งานอื่น ๆ ได้มากขึ้นซึ่งทำให้ผู้ใช้จำนวนมากต้องทำงานหนัก
googletorp

Felix Eve มีคำตอบที่ดีที่สุด มันไม่ซับซ้อนอย่างบ้าคลั่ง
kratos

@kratos คำตอบที่เฟลิกซ์ให้ไว้ไม่ได้แก้ปัญหาการวางบล็อก "โดยทางโปรแกรม" แต่ใช้ไฟล์ปรับแต่งแทน การกำหนดค่าสามารถนำเข้าผ่านทาง drush อินเตอร์เฟสการซิงโครไนซ์หรือการติดตั้งโมดูล ถ้ามันต้องเกิดขึ้นในระหว่างการรันไทม์โพสต์ของ fx บันทึกของส่วน FrontPage ชนิดของโหน ฯลฯ ก็จะไม่มีประโยชน์ที่จะใช้กลยุทธ์นี้ :)
googletorp

4

ฉันเพิ่งจะเรียนรู้ D8 แต่ดูเหมือนว่าฉันจะพบวิธีที่ง่ายกว่ามากในการวางบล็อกโดยทางโปรแกรม (มันดูน่ากลัวมากหลังจากอ่านคำตอบของ googletorp!)

เมื่อฉันเปิดใช้งานโมดูลที่กำหนดเองที่กำหนดบล็อกฉันต้องการให้บล็อกถูกวางในพื้นที่ที่ถูกต้องโดยอัตโนมัติ ขั้นตอนที่ฉันใช้เพื่อให้บรรลุนี้คือ:

  1. เปิดใช้งานโมดูลและวางบล็อกโดยใช้ UI ที่ /admin/structure/block
  2. ไปที่หน้าส่งออกการกำหนดค่ารายการเดียวที่ admin/config/development/configuration/single/export
  3. เลือกบล็อกประเภทการกำหนดค่าและสำหรับชื่อการกำหนดค่าให้เลือกบล็อกที่คุณเพิ่งวางโดยใช้ UI แล้วคัดลอกรหัสที่สร้างขึ้น
  4. ในโมดูลของคุณสร้างโฟลเดอร์ /config/install/
  5. ภายใต้ textarea โค้ดที่สร้างขึ้นมันจะบอกชื่อไฟล์ที่คุณต้องใช้ สร้างไฟล์นี้ใน/config/installไดเรกทอรีและคัดลอกรหัสในนั้น
  6. ตอนนี้เมื่อคุณถอนการติดตั้งโมดูลของคุณแล้วเปิดใช้งานอีกครั้งบล็อกจะถูกวางโดยอัตโนมัติ

คุณไม่ต้องลบ UUID เพื่อให้ทำงานได้กับนักพัฒนาหรือสภาพแวดล้อมอื่น ๆ
powpow12

ใช่ - ลบ UUID จะเป็นความคิดที่ดี
เฟลิกซ์อีฟ

นอกจากนี้คุณยังสามารถใช้ Drupal คอนโซลซึ่งดูแลการทำงานอัตโนมัติบางส่วนของงานเหล่านี้: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/...
Beau


2

ตัวอย่างข้างต้นอยู่ใกล้พอ แต่ก็ยังไม่ถูกต้อง แนวคิดคือคุณต้องสร้าง ID ของตัวเองของอินสแตนซ์บล็อก (ในกรณีของฉัน devel_execute_php_1112 (อาจเป็นเพราะฉันพยายามทำให้มันใช้งานได้ 1112 ครั้งมันจะยังคงเป็นปริศนา)) และไอเท็มบล็อกจริง (อันที่ ถูกประกาศสำหรับบล็อกที่กำหนดเองในหมายเหตุประกอบ) และธีม จากนั้นเพียงแค่ตั้งค่าภูมิภาคแล้วคุณก็พร้อมที่จะไป สร้างตัวอย่างของบล็อกภายใต้ภูมิภาคที่ต้องการ

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

แก้ไข 1: ฉันตรวจสอบความคิดเห็นด้านบนจริง ๆ แล้ว - และมันถูกต้อง ไม่ชัดเจนว่า id เป็นสิ่งที่คุณต้องเกิดขึ้น ในฐานะที่เป็นการไถ่ถอนสำหรับความคิดเห็นง่อยของฉันฉันจะโพสต์โซลูชันเกี่ยวกับวิธีสร้างอินสแตนซ์บล็อกของเอนทิตีบล็อกที่กำหนดเอง:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

โดยพื้นฐานแล้วจะเหมือนกัน แต่สำหรับปลั๊กอินที่คุณเขียน block_content: uuid_of_custom_block_entity_instance

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