我正在尝试使用Webform 8.x-5.1在Drupal 8中开发一个多步骤Webform。我编写了一个扩展Drupal\webform\Plugin\WebformHandlerBase
的WebformHandler,并将其提供给Webform。
在网络表单的第一步中,我收集了一个文本字段。经过一些计算之后,我想在第二页的HTML元素(Advanced HTML/Text
或Basic HTML
)中显示该文本字段的值。
我已经在WebformHandler中覆盖了submitForm()
,并在其中将我想要的值分配给HTML元素,如下所示:
$form['elements']['page_name']
['advanced_html_element']['#text'] = '...my HTML...';
使用ksm()
可以看到此分配有效,但是HTML元素未随我的HTML呈现:该元素不可见或包含在表单编辑器中设置的初始值。
很明显,我缺少了一些东西。我应该使用submitForm
以外的其他东西吗?谁能帮我吗?
答案 0 :(得分:0)
这是一个漫长的过程,但是我终于确定了如何做自己想做的事情。以下对我有用。
首先,我在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
可能是一种更干净的解决方案。
我希望这对某人有帮助:我花了很长时间试图使它生效。