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

问题描述 投票:0回答:1

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

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

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

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

使用ksm()我可以看到这个赋值有效,但HTML元素没有用我的HTML呈现:元素要么不可见,要么包含在表单编辑器中设置的初始值。

显然我错过了一些东西。我应该使用submitForm以外的东西吗?谁能帮我?

drupal-8 wizard drupal-webform multi-step
1个回答
1
投票

这是一个漫长的过程,但我终于找到了如何做我想做的事情。以下适用于我。

首先,我在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可能是一个更清洁的解决方案。

我希望这对某人有所帮助:我花了很长时间才想让这个工作起来。

© www.soinside.com 2019 - 2024. All rights reserved.