Score:0

จะบันทึกเลย์เอาต์ของโหนดโดยทางโปรแกรมได้อย่างไร

ธง us

ไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดหรือไม่ แต่ใช้งานได้ดี .. เกือบ

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

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

ฉันจะบังคับให้บันทึกเค้าโครงของโหนดโดยทางโปรแกรมได้อย่างไร

Score:2
ธง bd

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

หากตัวเลือกนี้ไม่ใช่ตัวเลือกสำหรับคุณ โซลูชันแบบเป็นโปรแกรมอาจมีวิวัฒนาการดังนี้:

  1. เชื่อมต่อกับแบบฟอร์มส่ง
  2. เพิ่มตัวจัดการการส่งแบบกำหนดเองของคุณ
  3. คว้าการกำหนดค่าบล็อกอย่างใด
  4. อัปเดต OverridesSectionStorage สำหรับโหนด
  5. บันทึกโหนด
  6. ลบที่เก็บข้อมูลชั่วคราวสำหรับตัวสร้างเลย์เอาต์ของโหนดนั้น

อย่างน้อยนั่นคือสิ่งที่ฉันจำได้ ในขณะที่ทำงานกับ 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);
cn flag
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้[ย้ายไปที่แชท](https://chat.stackexchange.com/rooms/136485/discussion-on-answer-by-berliner-how-to-programmatically-save-a-nodes-layout)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา