为什么$ form_state中的“触发元素”是表单上的最后一个按钮?

问题描述 投票:5回答:2

我有mymodule_field_widget_form(),它创建一个自动完成的文本字段,并为自定义字段提供3个按钮。在2个按钮上,我使用了调用自定义ajax命令的ajax回调函数。当函数执行进入两个按钮的回调函数时,$ form_state ['triggering_element']始终相同,即由上面的钩子创建的表单中的最后一个按钮(表单元素...?)。我想获取实际触发回调的元素。可能会多次将此自定义字段添加到内容类型,因此这很重要。自定义ajax命令创建了一个jQuery ui对话框,其中包含iframe或纯html内容,这取决于几个因素,因此我认为没有必要重新渲染触发按钮的整个表单。实际上,任何地方都没有重新渲染,也许是问题所在?

ajax forms drupal drupal-7
2个回答
9
投票

7
投票
当函数执行进入两个按钮的回调函数时,$ form_state ['triggering_element']始终相同,最后一个按钮
不幸的是,这是Drupal的表单API的工作方式。如果您在表单上有多个提交按钮,则有时无法确定单击了哪个按钮。

首先,请参阅this answer on Drupal.org,我认为它可能会对您有所帮助:

查看您的表单设置代码。在定义各种按钮的位置,将'#value'更改为'#default_value'。这将使Drupal能够识别字段值(即表单提交值)可以更改,因此,无论单击哪个按钮,它都不会固定为最后一个按钮的值。

如果那没有帮助,那么这里还有其他一些可能有用的解决方案:

    直接查看PHP的$_POST数组以找出单击了哪个按钮。这有效,但是与“ Drupal方式”背道而驰。 Drupal的表单API的全部目的是向您隐藏原始的PHP功能。但是在这种情况下,窥视一下可能会很有用。
  1. 将按钮放入单独的形式。仅当您不需要同时提交任何其他字段时,这显然才有效。

  2. 在提交表单之前,立即在表单上创建一个隐藏字段,并使用Javascript为其添加单击按钮的名称。

  • 希望有所帮助。
  • © www.soinside.com 2019 - 2024. All rights reserved.