Программно создайте страницу панелей, включая варианты, и заблокируйте плагины внутри нее


Я хочу иметь возможность программно создавать страницу панелей, добавлять вариант и добавлять в нее блочные плагины с заданными настройками для каждого блочного плагина. Моя конечная цель - создать клон указанной страницы панелей. Мой текущий код

    $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
Author: Matt, 2018-03-06

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;

 1
Author: Matt, 2019-04-30 12:01:31