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

Drupal 8 Webform: how to display text input on one page on the next page?

我正在尝试使用 Webform 8.x-5.1 在 Drupal 8 中开发多步骤 Web 表单。我已经编写了一个 WebformHandler 扩展 Drupal\webform\Plugin\WebformHandlerBase 并使其可用于 webform。

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

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

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

使用 ksm() 我可以看到这个赋值有效,但是 HTML 元素没有用我的 HTML 渲染:元素不可见或包含初始值集在表单编辑器中。

显然我遗漏了什么。我应该使用 submitForm 以外的东西吗?谁能帮帮我?

这是一个漫长的过程,但我终于想出了如何做我想做的事。以下对我有用。

首先,我在WebformHandlerBase中发现了方法validateForm。在具有多个页面的表单中的每个页面上,您会发现按照此处给出的顺序调用以下方法:

  • submitForm(调用一次)
  • alterForm(可能调用不止一次)
  • validateForm(调用一次)

validateForm 这个名字让我相信我可能误用了这个方法,但这就是我在下一页上设置我希望以编程方式初始化的元素的地方。好用,嘿嘿!

validateForm中,我初始化如下页面出现的元素:

$form_state->setValue(<element name>, <data structure>);

<element name> 是您在表单编辑器("Build" 选项卡)中为元素指定的名称。当然,<data structure> 必须是正确的:我建议您首先手动填写下一页的元素,然后查看 $form_state.

中出现的内容,从而找到合适的结构

还有一个$form_state->getValue(<element name>),在我看来这意味着$form_state也可以用于存储会话数据,比如在隐藏字段中。我最初使用 Drupal::service('tempstore.private')->get('xxx') 来存储必须跨页面边界可用的数据,但 $form_state 可能是一个更干净的解决方案。

我希望这对某人有所帮助:我花了非常长的时间试图让它发挥作用。