Drupal 8 Webform: как отобразить ввод текста на одной странице на следующей? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь разработать многоступенчатую веб-форму в 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 Ответ

0 голосов
/ 13 февраля 2019

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

Во-первых, я обнаружил метод 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 может быть более чистым решением.

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

...