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
может быть более чистым решением.
Надеюсь, это кому-нибудь поможет: я потратил ужасно много времени, пытаясь заставить это работать.