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

Posted

技术标签:

【中文标题】Drupal 8 Webform:如何在下一页上显示文本输入?【英文标题】:Drupal 8 Webform: how to display text input on one page on the next page? 【发布时间】:2019-07-02 02:28:20 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

我已经通过解决眼前的问题取得了进展:我使用了computed Twig 元素并让Ajax 自动更新计算值。但是,对于如何在第 N-1 页收集的数据在第 N 页上显示的一般情况,我仍然没有解决方案。 在我看来,Webform 模块对联系表单(网络表单提交数据等,我明确不需要)和对向导的支持很少(例如会话数据)。也许只是前者的文档比较多。 我同时发现$form[...]的赋值应该在alterForm()中,尽管我还看不到表单显示的元素中的更改值。跨度> 【参考方案1】:

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

首先,我在WebformHandlerBase中发现了方法validateForm。在多页表单的每一页上,你会发现下面的方法是按照这里给出的顺序调用的:

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

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

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

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

&lt;element name&gt; 是您在表单编辑器(“构建”选项卡)中为元素指定的名称。当然,&lt;data structure&gt; 必须是正确的:我建议您首先手动填写下一页上的元素并查看$form_state 中出现的内容,从而找到合适的结构。

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

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

【讨论】:

以上是关于Drupal 8 Webform:如何在下一页上显示文本输入?的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7 多个视图显示在一页上

编辑使用Drupal 8和Webform创建的数据库条目

使用javascript函数window.print()在下一页上写一些内容

通过按钮选择 ag-grid-table 中的下一行(如果下一行在下一页上)?

如何 - 构建自定义 drupal 8 模块表单

如何在下一页的表格中列出信息