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/Text
或 Basic 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
可能是一个更干净的解决方案。
我希望这对某人有所帮助:我花了非常长的时间试图让它发挥作用。
我正在尝试使用 Webform 8.x-5.1 在 Drupal 8 中开发多步骤 Web 表单。我已经编写了一个 WebformHandler 扩展 Drupal\webform\Plugin\WebformHandlerBase
并使其可用于 webform。
在网络表单的第一步中,我收集了一个文本字段。我想在进行一些计算后在第二页的 HTML 元素(Advanced HTML/Text
或 Basic 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
可能是一个更干净的解决方案。
我希望这对某人有所帮助:我花了非常长的时间试图让它发挥作用。