Рейтинг:3

Запретить визуализацию областей Layout Builder, не имеющих содержимого

флаг in

Используя Layout Builder, когда вы добавляете блок в макет с элементами управления доступом, а пользователь посещает страницу без доступа, макет оказывается пустым.

Как вообще предотвратить отображение макета, если его содержимое пусто? В то время как {% if content.foo|рендеринг|стриптэги|обрезка %} трюк работает для шаблонов блоков, я не могу понять, как добиться такого же эффекта с шаблонами макета.

Конечным результатом является дополнительная разметка на странице, которая классифицируется и создает дополнительные отступы и вертикальное пространство между заполненными областями макета.

редактировать:

Теперь я обновил событие, которое нужно Layout Builder:

класс MyModuleEventSubscriber реализует EventSubscriberInterface {

  /**
   * Обработчик событий ответа Layout Builder.
   *
   * @param SectionComponentBuildRenderArrayEvent $event
   * Построить событие рендеринга.
   */
  общедоступная функция onBuildRender (SectionComponentBuildRenderArrayEvent $event) {
    $id = $event->getPlugin()->getPluginDefinition()['id'];

    если ($id == 'inline_block' && !$event->inPreview()) {
      $build = $event->getBuild();
      $build['#create_placeholder'] = ЛОЖЬ;
      $event->setBuild($build);
    }
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция getSubscribedEvents(): массив {
    $events[LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY] = ['onBuildRender', 110];
    вернуть $события;
  }

}

xdebug

введите описание изображения здесь

Рейтинг:1
флаг cn

Это может быть вызвано заполнителем. Drupal форматирует заполнители как HTML-теги. В вашем тесте рендеринга стриптеги удаляет такие заполнители, даже если позже, когда происходит реальный рендеринг, он заполняется лениво построенным блоком.

Вы можете избежать этого за счет производительности кеша, отказавшись от замещающего блока:

/**
 * Реализует hook_block_build_BASE_BLOCK_ID_alter().
 */
function mymodule_block_build_example_block_alter(массив &$build, \Drupal\Core\Block\BlockPluginInterface $block) {
  // Отключить заполнение этого блока.
  $build['#create_placeholder'] = ЛОЖЬ;
}

Видеть Может ли BigPipe исключить определенные блоки? Это не зависит от того, включен BigPipe или нет, но я думаю, что для обеих проблем решение одинаковое.

флаг cn
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (https://chat.stackexchange.com/rooms/129156/discussion-on-answer-by-4k4-prevent-rendering-of-layout-builder-regions-that-hav) .

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.