Программно создайте страницу панелей, включая варианты, и заблокируйте плагины внутри нее
Я хочу иметь возможность программно создавать страницу панелей, добавлять вариант и добавлять в нее блочные плагины с заданными настройками для каждого блочного плагина. Моя конечная цель - создать клон указанной страницы панелей. Мой текущий код
$page_storage = \Drupal::entityTypeManager()->getStorage('page');
$variant_storage = \Drupal::entityTypeManager()->getStorage('page_variant');
$page = $page_storage->load($page_id);
$variants = $page->getVariants();
foreach ($variants as $variant) {
$blocks = $variant->getPluginCollections()['variant_settings']->getConfiguration()['blocks'];
foreach ($blocks as $block) {
//Here I have block data. Not sure how to take advantage of it though
}
}
$newPage = $page_storage->create([
'id' => $new_page_id,
'label' => $new_page_id,
'description' => $new_page_id . ' description',
'path' => '/' . $path,
]);
$newPage->save();
$newVariant = $variant_storage->create([
'id' => 'test',
'label' => 'test',
'page' => $newPage->id(),
]);
$newVariant->save();
Страница создается просто отлично, но вариант не присваивается странице. Так что я не уверен, чего мне не хватает. Кроме того, даже если бы задание варианта сработало, я не уверен, как бы я смог добавить и установить конфигурация всех пользовательских блоков, которые я добавил в регионах. Кроме того, я только что понял, что мне также придется выяснить, как настроить макет.
Как программно создать вариант страницы и назначить его программно созданной странице, а затем программно добавить плагины блоков в вариант на основе конфигурации другой страницы панелей?
ОБНОВЛЕНИЕ: Я пытался использовать
$newVariant->setPageEntity($newPage);
Чтобы задать вариант, но он по-прежнему не отображается как вариант на странице менеджер. Думал, когда я
var_dump($newVariant->getPage());
Похоже, что правильная страница отображается так
Объект (Drupal\page_manager\Сущность\Страница)#1959 (28) {["идентификатор": защищен]=> строка(4) "тест" ["метка": защищена]=>строка(4) "тест"
(это всего лишь часть) Именно тогда $new_page_id был установлен для тестирования.
ОБНОВЛЕНИЕ 2: Вместо этого я пытаюсь воспользоваться функцией createDuplicate, и на данный момент просто пытаюсь показать вариант вверх. Пока не беспокоюсь о блоках. Это мой новый код.
$variant_storage = \Drupal::entityTypeManager()->getStorage('page_variant');
$page = $page_storage->load($page_id);
$id = $page->id();
$label = $page->label();
$clone = $page->createDuplicate();
$clone->set('id', $new_page_id);
$clone->set('path', $path);
$clone->set('label', 'Test Page ' . $new_page_id);
$clone->save();
$variants = $page->getVariants();
foreach ($variants as $variant) {
$var_clone = $variant->createDuplicate();
$var_clone->set('page', $clone->id());
}
$var_clone->save();
Однако, как и раньше, страница создается, но вариант не применяется.
Я попытался удвоить и попробовать несколько таких методов
$var_clone = $variant->createDuplicate();
$var_clone->set('page', $clone->id());
$var_clone->setPageEntity($clone);
$var_clone->save();
Но это также не возымело никакого эффекта.
ОБНОВЛЕНИЕ 3: Мне удалось заставить вариант отображаться, установив идентификатор клона варианта следующим образом
$hash = bin2hex(random_bytes(8));
$var_clone = $variant->createDuplicate();
$var_clone->set('page', $clone->id());
$var_clone->setPageEntity($clone);
$var_clone->set('id', $hash);
$var_clone->save();
Похоже, что это не было сохранено, потому что идентификатор не был установлен для вариант. Однако теперь появляются новые ошибки, которые я получаю всякий раз, когда пытаюсь отредактировать или сохранить вариант страницы.
Исключение Drupal\Core\Config\configduplicateuidexception: Попытка сохранить объект конфигурации "тест" с идентификатором UUID '5d091883-6667-4aab-9fd8-c8ef77c871f4', когда эта сущность уже существует с UUID '11066a36-ca97-428f-aa78-f17b034421d8' в Drupal\Ядро\Конфигурация\Сущность\База конфигураций->Предварительное сохранение() (строка 339 из /mnt/www/html/mysite/docroot/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php ).
ОБНОВЛЕНИЕ 4: Сейчас я пытаюсь скопировать блоки, но, похоже, не могу загрузить блоки из конфигурации варианта.
$conf = $var_clone->getVariantPlugin()->getConfiguration();
$blocks_config = $conf['blocks'];
foreach ($blocks_config as $uuid => $block_data) {
var_dump($uuid);
var_dump($block_data);
}
Дает мне идентификатор UUID, но я хочу на самом деле иметь объект вместо массива, чтобы я мог сделать
$block_clone = $block->createDuplicateBlock();
Но, похоже, я не могу получить объект блока из UUID. Я даже пробовал загружать с помощью Uuid, указывающего каждый тип сущности возможно, вот так.
$conf = $var_clone->getVariantPlugin()->getConfiguration();
$blocks_config = $conf['blocks'];
foreach ($blocks_config as $uuid => $bdata) {
foreach (array_keys(\Drupal::entityTypeManager()->getDefinitions()) as $etype) {
$block = \Drupal::service('entity.repository')->loadEntityByUuid($etype, $uuid);
var_dump($block);
}
}
Но я не получаю ничего, кроме НУЛЯ, при попытке распечатать каждую попытку загрузки сущности по идентификатору UUID, который я получил из конфигурации блока вариантов. Загружаются ли объекты конфигурации другим способом? Или предоставленный UUID не относится к чему-то, что может быть загружено?
1 answers
Мне удалось сделать это с помощью следующего кода:
$path = '/' . $path;
$page_storage = \Drupal::entityTypeManager()->getStorage('page');
$variant_storage = \Drupal::entityTypeManager()->getStorage('page_variant');
$page = $page_storage->load($page_id);
$id = $page->id();
$clone = $page->createDuplicate();
$clone->set('id', $new_page_id);
$clone->set('path', $path);
$clone->set('label', $label);
$clone->save();
$variants = $page->getVariants();
foreach ($variants as $variant) {
$hash = bin2hex(random_bytes(8));
$var_clone = $variant->createDuplicate();
$var_clone->set('page', $clone->id());
$var_clone->setPageEntity($clone);
$var_clone->set('id', 'variant_id_' . $hash);
$var_clone->save();
$conf = $var_clone->getVariantPlugin()->getConfiguration();
$blocks_config = $conf['blocks'];
unset($conf['blocks']);
foreach ($blocks_config as $uuid => $bdata) {
$hash = bin2hex(random_bytes(8));
$bdata['uuid'] = $hash;
$conf['blocks'][$bdata['uuid']] = $bdata;
}
$var_clone->getVariantPlugin()->setConfiguration($conf);
$var_clone->save();
}
Редактировать $conf['blocks'][$bdata['uuid']] = $bdata;