У нас есть несколько пользовательских блоков, которые мы создали, и мы используем Layout Builder, чтобы наши авторы могли просто перетаскивать их по мере необходимости. В частности, у нас есть один блок Hero, который мы хотели бы видеть на каждой странице (настраиваемый для каждой страницы), и хотели бы автоматически вставлять его при создании узла для простоты разработки. Вы почти можете сделать это с помощью макетов по умолчанию для типа контента, но блок по умолчанию больше похож на повторно используемый блок. Первая страница получает пустой блок, пользователь редактирует его и сохраняет. Любая последующая страница получит эту отредактированную версию.
Я запускаю следующее в hook_preprocess_HOOK
(hook_preprocess_page
конкретно):
$layoutBuilder = $node->get('layout_builder__layout');
$sections = $layoutBuilder->getSections();
если (isset($sections) && !пусто($sections)) {
$hasHero = ЛОЖЬ;
$heroSection = $sections[0];
$components = $heroSection->getComponents();
foreach ($components as $component) {
$blockPlugin = $component->getPlugin();
если ($blockPlugin instanceof BlockBase) {
$blockConfig = $blockPlugin->getConfiguration();
если ($blockConfig['id'] === 'hero_cta') {
$hasHero = ИСТИНА;
сломать;
}
}
}
если (!$hasHero) {
$blockEntityManager = \Drupal::entityTypeManager()
->getStorage('block_content');
$block = $blockEntityManager->создать(
[
'info' => 'Главный призыв к действию для узла/' . $нид,
'тип' => 'hero_cta',
'langcode' => 'en',
]
);
$блок->сохранить();
$newBlockConfig = [
'id' => 'hero_cta',
'поставщик' => 'hero_cta',
'label_display' => ИСТИНА,
'block_id' => $block->id(),
'context_mapping' => [],
];
$newComponent = новый SectionComponent($node->uuid(), 'content', $newBlockConfig);
$heroSection->appendComponent($newComponent);
$узел->сохранить();
}
}
Вышеупомянутое почти работает...Когда я перехожу на вкладку «Вид», я вижу это. Но, когда я перехожу на вкладку макета, его там нет. Если вы сохраните переопределение макета, а затем обновить опять вдруг появляется.
Итак, что я делаю неправильно?