Рейтинг:2

Блокировать настройки внутри формы

флаг in

Пожалуйста, мне нужна помощь с моим кодом. У меня есть форма и блок, созданный программно. Блок встраивает форму, чтобы показать ее во внешнем интерфейсе.Блок также имеет некоторые настройки (текст преффикса формы). Я хочу загрузить настройки блока внутри моей buildForm в моем Form.php, чтобы получить текст префикса и показать его в поле разметки формы. Но я не могу найти способ передать $block_id в buildForm(), чтобы он мог загрузить блок.

У меня есть сценарий, в котором на одной странице могут быть два таких блока, в которых Drupal уникален блоком, добавляя некоторый идентификатор к идентификатору блока. Так, например, на моей странице есть два таких блока, один из которых будет выглядеть так: блокировка обратной связи другой был бы блок отзывов_2 следовательно, я не могу жестко закодировать идентификатор блока, чтобы загрузить его в мою функцию buildForm.

Я хочу, чтобы он динамически передавал идентификатор блока в форму.

build() из моего Block.php:

  общедоступная функция сборки () {
    $block_id // получить идентификатор блока текущего экземпляра блока
    $feedback_form = $this->formBuilder->getForm(FeedbackForm::class, $block_id);

    $сборка = [];
    $build['#theme'] = 'feedback_block';
    $build['feedback_block']['#markup'] = render($feedback_form);

    вернуть $сборку;
  }

buildForm из моего FeedbackForm.php:

  общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state, строка $ block_id) {
      // Получите идентификатор блока здесь.
  }

Есть ли способ добиться этого?

Kevin avatar
флаг in
$feedback_form уже является массивом рендеринга, вам не нужно его рендерить. Просто установите его в переменную, пусть Drupal сделает всю работу.
Kevin avatar
флаг in
Также: https://drupal.stackexchange.com/a/199929/57
New To 'C' avatar
флаг in
Спасибо за ссылку, но я это уже просмотрел, и в моем случае это не сработает, так как у меня нет routing.yml, и он мне не нужен. Я просто создаю блок, и блок формы показывает эту форму, и блок может отображаться в любом месте на сайте независимо от маршрута.
Kevin avatar
флаг in
Вам не нужен маршрутный yaml. Прочитайте ответ. "при использовании параметров в формах вы должны установить нулевое значение в списке параметров"
New To 'C' avatar
флаг in
О спасибо приятель! Это сработало, я хотел бы проголосовать за ваш комментарий, но у меня нет возможности. Теперь я могу передать дополнительный аргумент в buildForm(). Но как я могу динамически получить идентификатор блока текущего экземпляра блока?
Kevin avatar
флаг in
Я не понимаю, что вы имеете в виду под динамическим получением?
New To 'C' avatar
флаг in
Например, на моей странице есть два таких блока, поэтому Drupal присваивает им уникальные идентификаторы (имена машин). Один будет похож на блок обратной связи, а другой будет похож на блок обратной связи_2, это поведение Drupal по умолчанию, а не то, что я делаю. Drupal уникален для блоков, если их два на одной странице. Итак, как я могу получить это уникальное имя машины для каждого из них и передать его в buildForm()?
Рейтинг:2
флаг cn

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

используйте Drupal\block\BlockInterface;

/**
 * Реализует hook_ENTITY_TYPE_presave() для блочных сущностей.
 */
функция mymodule_block_presave (BlockInterface $ block) {
  если ($block->isNew()) {
    $settings = $block->get('settings');
    $settings['block_id'] = $block->get('id');
    $block->set('настройки', $настройки);
  }
}

Затем вы можете получить имя машины в build():

  общедоступная функция сборки () {
    // получаем идентификатор блока текущего экземпляра блока
    $block_id = !пусто($this->configuration['block_id']) ? $this->configuration['block_id'] : '';

В качестве примечания. Я не думаю, что остальная часть кода в вопросе работает. Вам необходимо добавить уникальный идентификатор в экземпляр формы перед вызовом formBuilder->getForm(), а затем использовать его для создания уникального идентификатора формы. После этого buildForm() может получить идентификатор из свойства класса. Видеть Использование одной и той же формы более одного раза на странице с обратными вызовами AJAX

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

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