Điểm:1

Drupal 8/9 Layout Builder và khối tùy chỉnh mặc định

lá cờ fr

Chúng tôi có một số khối tùy chỉnh mà chúng tôi đã tạo và sử dụng Trình tạo bố cục để tác giả của chúng tôi có thể kéo và thả khi cần. Chúng tôi có một khối Anh hùng cụ thể mà chúng tôi muốn thấy trên mọi trang (được tùy chỉnh trên mỗi trang) và rất muốn tự động chèn một khối đó khi tạo nút để dễ dàng tạo. Hầu như bạn có thể làm điều này thông qua các bố cục mặc định cho loại nội dung, nhưng khối mặc định hoạt động giống một khối có thể tái sử dụng hơn. Trang đầu tiên có khối trống, người dùng chỉnh sửa nó và lưu lại. Bất kỳ trang nào tiếp theo sau đó lấy phiên bản đã chỉnh sửa đó.

Tôi đang chạy như sau trong một hook_pre process_HOOK (hook_pre process_page đặc biệt):

$layoutBuilder = $node->get('layout_builder__layout');
$sections = $layoutBuilder->getSections();
if (isset($sections) && !empty($sections)) {
  $hasHero = FALSE;
  $heroSection = $sections[0];
  $components = $heroSection->getComponents();
  foreach ($thành phần là $component) {
    $blockPlugin = $component->getPlugin();
    if ($blockPlugin instanceof BlockBase) {
      $blockConfig = $blockPlugin->getConfiguration();
      if ($blockConfig['id'] === 'hero_cta') {
        $hasHero = TRUE;
        nghỉ;
      }
    }
  }
  nếu (!$hasHero) {
    $blockEntityManager = \Drupal::entityTypeManager()
      ->getStorage('block_content');

    $block = $blockEntityManager->tạo(
      [
        'thông tin' => 'CTA chính cho nút/' . $nid,
        'loại' => 'anh hùng_cta',
        'mã ngôn ngữ' => 'vi',
      ]
    );
    $block->save();

    $newBlockConfig = [
      'id' => 'hero_cta',
      'nhà cung cấp' => 'hero_cta',
      'nhãn_hiển thị' => ĐÚNG,
      'block_id' => $block->id(),
      'ánh xạ_bối cảnh' => [],
    ];
    $newComponent = New SectionComponent($node->uuid(), 'content', $newBlockConfig);
    $heroSection->appendComponent($newComponent);

    $node->save();
  }
}

Ở trên gần như hoạt động ...Khi tôi vào tab Xem, tôi có thể nhìn thấy nó. Nhưng, khi tôi chuyển đến tab bố cục, nó không có ở đó. Nếu bạn lưu ghi đè bố cục, và sau đó Làm tươi một lần nữa, nó đột nhiên xuất hiện.

Vì vậy, tôi đang làm gì sai?

apaderno avatar
lá cờ us
Trong đó `hook_pre process_HOOK()` mã đó được sử dụng chính xác? Tuy nhiên, `hook_pre process_HOOK()` có thể là vị trí sai để lưu một khối.
lá cờ fr
Rất tiếc, vâng, câu hỏi đã chỉnh sửa với thông tin bổ sung đó @apaderno - hiện đang sử dụng `hook_pre process_page`. Có vẻ như đó là nơi tốt nhất tiếp theo để thử và thực hiện tác vụ này sau khi loại nội dung được lưu lần đầu tiên. Khối thực sự đang được tạo, nhưng kết nối của nó với thành phần phần là nơi nó hơi thất bại đối với tôi. Vì vậy, có, thời gian chức năng thích hợp có thể là vấn đề của tôi.
Điểm:0
lá cờ fr

Được rồi, nhóm của chúng tôi cuối cùng đã tìm ra giải pháp mà chúng tôi đang theo đuổi, vì vậy hãy đăng ở đây phòng trường hợp có người khác đang cố gắng thực hiện việc này! Cuối cùng, như đã chỉ ra, ban đầu tôi làm điều này trong một hook tiền xử lý - mà sau đó đã bị ghi đè bởi bố cục mặc định. Đây là những gì đã làm việc:

chức năng được bảo vệ chuẩn bịLayout(SectionStorageInterface $section_storage) {
  cha mẹ::prepareLayout($section_storage);
  $storageContext = $section_storage->getContexts();
  $node = $storageContext['entity']->getContextData()->getValue();
  if (isset($node)) {
    if ($node->hasField(OverridesSectionStorage::FIELD_NAME)) {
      $nid = $node->id();
      $layoutBuilder = $node->get(OverridesSectionStorage::FIELD_NAME);
      $sections = $layoutBuilder->getSections();
      if (isset($sections) && !empty($sections)) {
        // Đặt cấu hình mặc định để so sánh để đảm bảo rằng trang đã được tạo.
        $defaultHeroSection = $section_storage->getDefaultSectionStorage()->getSection(0);
        $defaultHeroCount = đếm($defaultHeroSection->getComponents());

        // Phần đầu tiên là khu vực 'Hero CTA' của chúng tôi. Kiểm tra sự tồn tại.
        $hasHero = FALSE;
        $heroSection = $layoutBuilder->getSection(0);
        $heroComponents = $heroSection->getComponents();
        $currentHeroCount = đếm($heroComponents);
        nếu ($defaultHeroCount === $currentHeroCount) {
          foreach ($heroComponents dưới dạng $component) {
            $blockPlugin = $component->getPlugin();
            if ($blockPlugin instanceof BlockBase) {
              $blockConfig = $blockPlugin->getConfiguration();
              if ($blockConfig['id'] === 'hero_cta') {
                $hasHero = TRUE;
                nghỉ;
              }
            }
          }
          nếu (!$hasHero) {
            $blockEntityManager = \Drupal::entityTypeManager()->getStorage('block_content');

            // Tạo khối Hero CTA mới, trống.
            $block = $blockEntityManager->tạo(
              [
                'thông tin' => 'CTA chính cho nút/' . $nid,
                'loại' => 'anh hùng_cta',
                'mã ngôn ngữ' => 'vi',
              ]
            );
            $block->save();

            // Chèn khối Hero CTA mới vào phần thích hợp.
            $newBlockConfig = [
              'id' => 'hero_cta',
              'nhà cung cấp' => 'hero_cta',
              'nhãn_hiển thị' => ĐÚNG,
              'block_id' => $block->id(),
              'ánh xạ_bối cảnh' => [],
            ];
            $newComponent = New SectionComponent($node->uuid(), 'content', $newBlockConfig);
            $heroSection->appendComponent($newComponent);
          }
          // Xóa phần đầu tiên ban đầu và các khối không sử dụng.
          $section_storage->removeSection(0);
          // Chèn lại phần đầu tiên.
          $section_storage->insertSection(0, $heroSection);
          $this->layoutTempstoreRepository->set($section_storage);
          // Lưu các thay đổi.
          $node->save(); 
        }
      }
    }
  }
}
lá cờ fr
Và, nếu ai đó bắt gặp chủ đề này và cần giải pháp D9, bạn sẽ cần chuyển chức năng này thành người đăng ký sự kiện.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.