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/Text
或 Basic 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>);
<element name>
是您在表单编辑器(“构建”选项卡)中为元素指定的名称。当然,<data structure>
必须是正确的:我建议您首先手动填写下一页上的元素并查看$form_state
中出现的内容,从而找到合适的结构。
还有一个$form_state->getValue(<element name>)
,在我看来这意味着$form_state
也可以用于存储会话数据,比如在隐藏字段中。我最初使用Drupal::service('tempstore.private')->get('xxx')
来存储必须跨页面边界可用的数据,但$form_state
可能是更简洁的解决方案。
我希望这对某人有所帮助:我花了很长时间试图让它发挥作用。
【讨论】:
以上是关于Drupal 8 Webform:如何在下一页上显示文本输入?的主要内容,如果未能解决你的问题,请参考以下文章
使用javascript函数window.print()在下一页上写一些内容