Drupal 8 Webform:如何在下一页的一页上显示文本输入?

时间:2019-02-07 21:12:54

标签: drupal-8 wizard drupal-webform multi-step

我正在尝试使用Webform 8.x-5.1在Drupal 8中开发一个多步骤Webform。我编写了一个扩展Drupal\webform\Plugin\WebformHandlerBase的WebformHandler,并将其提供给Webform。

在网络表单的第一步中,我收集了一个文本字段。经过一些计算之后,我想在第二页的HTML元素(Advanced HTML/TextBasic HTML)中显示该文本字段的值。

我已经在WebformHandler中覆盖了submitForm(),并在其中将我想要的值分配给HTML元素,如下所示:

$form['elements']['page_name']
     ['advanced_html_element']['#text'] = '...my HTML...';

使用ksm()可以看到此分配有效,但是HTML元素未随我的HTML呈现:该元素不可见或包含在表单编辑器中设置的初始值。

很明显,我缺少了一些东西。我应该使用submitForm以外的其他东西吗?谁能帮我吗?

1 个答案:

答案 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可能是一种更干净的解决方案。

我希望这对某人有帮助:我花了很长时间试图使它生效。