Рейтинг:0

Как программно сохранить макет узла?

флаг us

Не уверен, что это лучший подход, но он работает хорошо... почти.

Я использую модальный модуль Layout Builder, который в построителе макетов открывает конфигурацию блока в модальном режиме. Это здорово, но я хотел бы расширить эту возможность на внешний интерфейс, чтобы я мог настроить блок макета, не заходя в макет узла.

Если я просто размещу контекстную ссылку, созданную этим модулем, на моей странице узла; конечно же, он открывает требуемый модальный режим и позволяет мне изменить конфигурацию конкретного блока.При отправке конфигурация блока изменяется, и модальное окно закрывается, но макет не сохраняется для использования этой новой конфигурации блока. Это можно увидеть, когда я перехожу к макету узла, и в нем говорится, что ожидаются изменения. Если я сейчас сохраню макет, я увижу изменения конфигурации моего блока.

Как я могу программно принудительно сохранить макет узла?

Рейтинг:2
флаг bd

Хотя это не является фактическим ответом на ваш вопрос «Как я могу программно принудительно сохранить макет узла?», я хотел указать вам на Конструктор макетов IPE модуль, который я создал для решения задачи, аналогичной вашей: предоставить возможности редактирования непосредственно со страницы просмотра узла.

Если это не вариант для вас, то программное решение, вероятно, развивается вокруг:

  1. подключение к форме submit
  2. добавление вашего пользовательского обработчика отправки
  3. возьми конфиг блока как-нибудь
  4. обновить OverridesSectionStorage для узла
  5. сохранить узел
  6. удалить временное хранилище для построителя компоновки этого узла

По крайней мере, это то, что я помню. Работая над IPE Layout Builder, я обнаружил, что вся эта структура немного сложна, если честно, что было основной причиной, по которой я попытался сделать это один раз более общим способом.

Обновлять Еще некоторые детали, которые я искал, которые могут помочь с этим:

Чтобы получить разделы для узла с включенным компоновщиком, вы можете использовать LayoutEntityHelperTrait::getSectionStorageForEntity, например:

$section_storage = $this->getSectionStorageForEntity($node);
$sections = $section_storage->getSections();

Этот $ разделы переменная представляет собой массив разделов, каждый раздел содержит компоненты раздела. Вы можете перебирать их, пока не найдете искомый блок, и сделать то, что вам нужно сделать, чтобы обновить конфигурацию (непроверенный код):

foreach ($sections как $delta => $section) {
  foreach ($section->getComponents() как $component) {
    // Каждый компонент является объектом типа \Drupal\layout_builder\SectionComponent.
    // Чтобы идентифицировать блок, вы можете использовать идентификатор плагина (или UUID, если
    // существует несколько блоков одного типа). 
    $plugin_id = $component->getPluginId();
    если ($plugin_id == 'BLOCK_PLUGIN_ID') {
      $configuration = $component->get('configuration');
      // Обновите конфигурацию, а затем обновите компонент.
      $component->setConfiguration($configuration);
    }
  }
}

После внесения необходимых изменений разделы можно сохранить обратно в узел, используя это:

$node->get(OverridesSectionStorage::FIELD_NAME)->setValue($sections);

И чтобы очистить временное хранилище, должно работать что-то вроде этого, хотя это, очевидно, должно использовать DI:

\Drupal::service('layout_builder.tempstore_repository')->delete($section_storage);
флаг cn
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (https://chat.stackexchange.com/rooms/136485/discussion-on-answer-by-berliner-how-to-programmatically-save-a-nodes-layout).

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

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