เรามีบล็อกแบบกำหนดเองจำนวนหนึ่งที่เราสร้างขึ้น และใช้ Layout Builder เพื่อให้ผู้เขียนของเราสามารถลากและวางได้ตามต้องการ เรามีบล็อก Hero หนึ่งบล็อกโดยเฉพาะที่เราต้องการเห็นในทุกหน้า (กำหนดเองต่อหน้า) และชอบที่จะแทรกบล็อกหนึ่งโดยอัตโนมัติในการสร้างโหนดเพื่อความสะดวกในการเขียน คุณเกือบจะทำได้ผ่านเลย์เอาต์เริ่มต้นสำหรับประเภทเนื้อหา แต่บล็อกเริ่มต้นจะทำหน้าที่เหมือนบล็อกที่ใช้ซ้ำได้มากกว่า หน้าแรกได้รับบล็อกว่าง ผู้ใช้แก้ไขและบันทึก หน้าถัดไปจะได้รับเวอร์ชันที่แก้ไขแล้ว
ฉันกำลังเรียกใช้สิ่งต่อไปนี้ในไฟล์ hook_preprocess_HOOK
(hook_preprocess_page
โดยเฉพาะ):
$layoutBuilder = $node->get('layout_builder__layout');
$sections = $layoutBuilder->getSections();
ถ้า (isset($sections) && !empty($sections)) {
$hasHero = เท็จ;
$heroSection = $sections[0];
$components = $heroSection->getComponents();
foreach ($ ส่วนประกอบเป็น $ ส่วนประกอบ) {
$blockPlugin = $component->getPlugin();
ถ้า (อินสแตนซ์ $ blockPlugin ของ BlockBase) {
$blockConfig = $blockPlugin->getConfiguration();
ถ้า ($blockConfig['id'] === 'hero_cta') {
$hasHero = จริง;
หยุดพัก;
}
}
}
ถ้า (!$hasHero) {
$blockEntityManager = \Drupal::entityTypeManager()
->getStorage('block_content');
$block = $blockEntityManager->สร้าง(
[
'info' => 'Hero CTA สำหรับโหนด/' $ นิด,
'type' => 'hero_cta',
'langcode' => 'th',
]
);
$block->save();
$newBlockConfig = [
'id' => 'hero_cta',
'provider' => 'hero_cta',
'label_display' => จริง,
'block_id' => $block->id(),
'context_mapping' => [],
];
$newComponent = ใหม่ SectionComponent($node->uuid(), 'เนื้อหา', $newBlockConfig);
$heroSection->appendComponent($newComponent);
$node->save();
}
}
ด้านบนเกือบจะใช้งานได้ ...เมื่อฉันไปที่แท็บมุมมอง ฉันสามารถดูได้ แต่เมื่อฉันไปที่แท็บเค้าโครง มันไม่อยู่ที่นั่น หากคุณบันทึกการแทนที่เค้าโครงแล้ว รีเฟรช อีกครั้งก็ปรากฏขึ้น
แล้วฉันทำอะไรผิด?