我正在尝试使用Webform 8.x-5.1在Drupal 8中开发一个多步骤webform。我编写了一个扩展Drupal\webform\Plugin\WebformHandlerBase
并使其可用于webform的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
以外的东西吗?谁能帮我?
这是一个漫长的过程,但我终于找到了如何做我想做的事情。以下适用于我。
首先,我在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
可能是一个更清洁的解决方案。
我希望这对某人有所帮助:我花了很长时间才想让这个工作起来。