Score:1

Drupal 8/9 Layout Builder และบล็อกเริ่มต้นที่กำหนดเอง

ธง fr

เรามีบล็อกแบบกำหนดเองจำนวนหนึ่งที่เราสร้างขึ้น และใช้ 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();
  }
}

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

แล้วฉันทำอะไรผิด?

apaderno avatar
us flag
`hook_preprocess_HOOK()` รหัสนั้นใช้ตรงส่วนใด `hook_preprocess_HOOK()` น่าจะเป็นตำแหน่งที่ไม่ถูกต้องในการบันทึกบล็อก
fr flag
อ๊ะ ใช่ คำถามที่แก้ไขแล้วพร้อมข้อมูลเพิ่มเติมนั้น @apaderno - กำลังใช้ `hook_preprocess_page` ดูเหมือนว่าจะเป็นที่ที่ดีที่สุดลำดับต่อไปในการลองและทำงานนี้ หลังจากที่บันทึกชนิดเนื้อหาในครั้งแรกแล้ว บล็อกกำลังถูกสร้างขึ้นจริง แต่การเชื่อมต่อกับส่วนประกอบของส่วนคือจุดที่มันล้มเหลวสำหรับฉัน ใช่ จังหวะการทำงานที่เหมาะสมอาจเป็นปัญหาของฉัน
Score:0
ธง fr

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

ฟังก์ชันที่มีการป้องกัน prepareLayout (SectionStorageInterface $section_storage) {
  parent::prepareLayout($section_storage);
  $storageContext = $section_storage->getContexts();
  $node = $storageContext['entity']->getContextData()->getValue();
  ถ้า (isset($node)) {
    ถ้า ($node->hasField(OverridesSectionStorage::FIELD_NAME)) {
      $nid = $node->id();
      $layoutBuilder = $node->get(OverridesSectionStorage::FIELD_NAME);
      $sections = $layoutBuilder->getSections();
      ถ้า (isset($sections) && !empty($sections)) {
        // กำหนดค่าเริ่มต้นเพื่อเปรียบเทียบเพื่อให้แน่ใจว่าเพจถูกสร้างขึ้นแล้ว
        $defaultHeroSection = $section_storage->getDefaultSectionStorage()->getSection(0);
        $defaultHeroCount = นับ($defaultHeroSection->getComponents());

        // ส่วนแรกคือภูมิภาค 'Hero CTA' ของเรา ตรวจสอบการมีอยู่
        $hasHero = เท็จ;
        $heroSection = $layoutBuilder->getSection(0);
        $heroComponents = $heroSection->getComponents();
        $currentHeroCount = จำนวน ($heroComponents);
        ถ้า ($defaultHeroCount === $currentHeroCount) {
          foreach ($heroComponents เป็น $component) {
            $blockPlugin = $component->getPlugin();
            ถ้า (อินสแตนซ์ $ blockPlugin ของ BlockBase) {
              $blockConfig = $blockPlugin->getConfiguration();
              ถ้า ($blockConfig['id'] === 'hero_cta') {
                $hasHero = จริง;
                หยุดพัก;
              }
            }
          }
          ถ้า (!$hasHero) {
            $blockEntityManager = \Drupal::entityTypeManager()->getStorage('block_content');

            // สร้างบล็อก Hero CTA ใหม่ที่ว่างเปล่า
            $block = $blockEntityManager->สร้าง(
              [
                'info' => 'Hero CTA สำหรับโหนด/' $ นิด,
                'type' => 'hero_cta',
                'langcode' => 'th',
              ]
            );
            $block->save();

            // ใส่บล็อก Hero CTA ใหม่ลงในส่วนที่เหมาะสม
            $newBlockConfig = [
              'id' => 'hero_cta',
              'provider' => 'hero_cta',
              'label_display' => จริง,
              'block_id' => $block->id(),
              'context_mapping' => [],
            ];
            $newComponent = ใหม่ SectionComponent($node->uuid(), 'เนื้อหา', $newBlockConfig);
            $heroSection->appendComponent($newComponent);
          }
          // ลบส่วนแรกดั้งเดิมและบล็อกที่ไม่ได้ใช้
          $section_storage->removeSection(0);
          // แทรกส่วนแรกอีกครั้ง
          $section_storage->insertSection(0, $heroSection);
          $this->layoutTempstoreRepository->set($section_storage);
          // บันทึกการเปลี่ยนแปลง
          $node->save(); 
        }
      }
    }
  }
}
fr flag
และหากมีคนเจอหัวข้อนี้และต้องการโซลูชัน D9 คุณจะต้องย้ายฟังก์ชันนี้ไปยังสมาชิกกิจกรรม

โพสต์คำตอบ

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