Drupal 8 Webform: как отобразить ввод текста на одной странице на следующей?

Я пытаюсь разработать многоступенчатую веб-форму в Drupal 8, используя Webform 8.x-5.1. Я написал WebformHandler, который расширяет Drupal\webform\Plugin\WebformHandlerBase и сделал его доступным для веб-формы.

На первом этапе веб-формы я собираю текстовое поле. Я хотел бы отобразить значение этого текстового поля в элементе HTML (Advanced HTML/Text или же Basic HTML) на второй странице после выполнения некоторых вычислений.

Я переписал submitForm() в WebformHandler и в нем назначьте значение, которое я хочу, к элементу HTML следующим образом:

$form['elements']['page_name']
     ['advanced_html_element']['#text'] = '...my HTML...';

С помощью ksm() Я вижу, что это назначение работает, но элемент HTML не отображается с моим HTML: элемент либо невидим, либо содержит начальное значение, установленное в редакторе форм.

Я явно что-то упускаю. Должен ли я использовать что-то кроме submitForm? Может кто-нибудь мне помочь?

1 ответ

Решение

Это был долгий путь, но я наконец-то понял, как делать то, что я хочу. Следующее работает для меня.

Во-первых, я обнаружил метод validateForm в WebformHandlerBase, На каждой странице в форме с несколькими страницами вы обнаружите, что следующие методы вызываются в указанном здесь порядке:

  • submitForm (звонил один раз)
  • alterForm(возможно, звонил несколько раз)
  • validateForm (звонил один раз)

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

В validateFormЯ инициализирую элементы, которые появляются на следующей странице, следующим образом:

$form_state->setValue(<element name>, <data structure>);

<element name> имя, которое вы даете элементу в редакторе форм (вкладка "Построить"). <data structure> конечно, должно быть правильно: я предлагаю вам найти подходящую структуру, предварительно заполнив элемент на следующей странице вручную и посмотрев, что получается $form_state,

Также есть $form_state->getValue(<element name>)что, мне кажется, означает, что $form_state также может использоваться для хранения данных сеанса, скажем, в скрытых полях. Я изначально использовал Drupal::service('tempstore.private')->get('xxx') для хранения данных, которые должны были быть доступны через границы страницы, но $form_state может быть более чистым решением.

Надеюсь, это кому-нибудь поможет: я потратил ужасно много времени, пытаясь заставить это работать.

Другие вопросы по тегам