【问题标题】:Remove submitted state in submission handler在提交处理程序中删除提交状态
【发布时间】:2023-08-22 18:04:02
【问题描述】:

我正在尝试重置表单,以便 Drupal 8 显示它尚未提交。到目前为止,我一直无法做到这一点,因为我找不到任何可用的方法(setSubmitted() 在没有 FALSE 选项的情况下将其硬编码为 TRUE)。原因是这不是一个完整的提交,而是一个字段的提交,之后我希望用户被重定向到具有另一个表单的另一个页面,并且我希望这个辅助表单使用在第一个中获得的值一步。

在第一部分的提交处理程序中,我使用它来重定向:

$form_state->setRedirect('my.route', [], []);

这可行,但是当表单到达第二个表单(似乎)时,第二个表单认为它是一个提交。结果,我添加到第二个表单的任何提交按钮似乎都会使其自动提交,这会破坏我的用户旅程。

在我尝试过的第一部分的提交中:

$form_state->setRebuild(TRUE);
$form_state = new FormState();
unset($form_state);

在各种配置中尝试上述方法均无济于事。他们都阻止/忽略了我之后进行的 setRedirect 调用。我想要/需要这样做的原因是我想保留使用的 POST 方法。

【问题讨论】:

  • 您可能想尝试多步表单方法,看看这个answer 和这个tutorial
  • @EricLavault 是的,我见过类似的东西。问题是我需要一个块类型的表单和一个页面类型的表单。尽管这正确地是一个多步骤,但我相信您分享的示例(以及我见过的其他示例)本身会刷新表单(使用相同的 URL)。对于这个用例,我需要第二部分在不同的地址进行,将数据发布到它并收集

标签: forms drupal drupal-8


【解决方案1】:

您想获得与核心搜索模块类似的东西吗?它有简单的SearchBlockForm,可以将数据发送到更复杂的SearchPageForm

SearchBlockForm 使用GET 方法(尽管你可以使用POST):

$form['#method'] = 'get';

has no id and token fields:

function search_form_search_block_form_alter(&$form, FormStateInterface $form_state) {
  $form['form_build_id']['#access'] = FALSE;
  $form['form_token']['#access'] = FALSE;
  $form['form_id']['#access'] = FALSE;
}

顺便说一句,最后的更改允许您避免运行提交回调。

希望这会有所帮助。

【讨论】:

    最近更新 更多