แม้ว่านี่จะไม่ใช่คำตอบที่แท้จริงสำหรับคำถามของคุณ "ฉันจะบังคับให้บันทึกเลย์เอาต์ของโหนดทางโปรแกรมได้อย่างไร" แต่ฉันต้องการชี้ให้คุณเห็น ตัวสร้างเค้าโครง IPE โมดูลที่ฉันสร้างขึ้นเพื่อแก้ไขกรณีการใช้งานที่คล้ายกันกับของคุณ: ให้ความเป็นไปได้ในการแก้ไขโดยตรงจากหน้ามุมมองของโหนด
หากตัวเลือกนี้ไม่ใช่ตัวเลือกสำหรับคุณ โซลูชันแบบเป็นโปรแกรมอาจมีวิวัฒนาการดังนี้:
- เชื่อมต่อกับแบบฟอร์มส่ง
- เพิ่มตัวจัดการการส่งแบบกำหนดเองของคุณ
- คว้าการกำหนดค่าบล็อกอย่างใด
- อัปเดต OverridesSectionStorage สำหรับโหนด
- บันทึกโหนด
- ลบที่เก็บข้อมูลชั่วคราวสำหรับตัวสร้างเลย์เอาต์ของโหนดนั้น
อย่างน้อยนั่นคือสิ่งที่ฉันจำได้ ในขณะที่ทำงานกับ Layout Builder IPE ฉันพบว่าโครงสร้างทั้งหมดนั้นค่อนข้างซับซ้อนพูดตามตรง ซึ่งเป็นเหตุผลหลักในการพยายามทำสิ่งนี้ให้สำเร็จด้วยวิธีทั่วไปมากขึ้น
อัปเดต
รายละเอียดเพิ่มเติมบางอย่างที่ฉันค้นหาซึ่งอาจช่วยได้:
หากต้องการรับส่วนสำหรับโหนดที่เปิดใช้งานตัวสร้างเลย์เอาต์คุณสามารถใช้ LayoutEntityHelperTrait::getSectionStorageForEntity, เช่น.:
$section_storage = $this->getSectionStorageForEntity($โหนด);
$sections = $section_storage->getSections();
นี้ $ส่วน
ตัวแปรคืออาร์เรย์ของส่วน แต่ละส่วนมีส่วนประกอบของส่วน คุณสามารถทำซ้ำได้จนกว่าคุณจะพบบล็อกที่คุณต้องการและทำสิ่งที่คุณต้องทำเพื่ออัปเดตการกำหนดค่า (รหัสที่ยังไม่ทดสอบ):
foreach ($ ส่วนเป็น $ delta => $ ส่วน) {
foreach ($section->getComponents() เป็น $component) {
// แต่ละส่วนประกอบเป็นวัตถุประเภท \Drupal\layout_builder\SectionComponent
// ในการระบุบล็อกคุณสามารถใช้รหัสปลั๊กอิน (หรือ UUID ถ้า
// มีบล็อกประเภทเดียวกันหลายบล็อก)
$plugin_id = $component->getPluginId();
ถ้า ($plugin_id == 'BLOCK_PLUGIN_ID') {
$configuration = $component->get('การกำหนดค่า');
// อัปเดตการกำหนดค่า จากนั้นอัปเดตส่วนประกอบ
$component->setConfiguration($configuration);
}
}
}
เมื่อทำการเปลี่ยนแปลงที่จำเป็นแล้ว สามารถบันทึกส่วนต่างๆ กลับไปที่โหนดได้โดยใช้สิ่งนี้:
$node->get(OverridesSectionStorage::FIELD_NAME)->setValue($sections);
และเพื่อล้าง tempstore สิ่งนี้ควรใช้งานได้แม้ว่าสิ่งนี้ควรใช้ DI อย่างชัดเจน:
\Drupal::service('layout_builder.tempstore_repository')->ลบ($section_storage);