Это был долгий путь, но я наконец-то понял, как делать то, что я хочу.Следующее работает для меня.
Во-первых, я обнаружил метод 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
может быть более чистым решением.
Я надеюсь, что это кому-то поможет: я потратил ужасно много времени, пытаясь получить этона работу.