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

时间:2011-06-29 12:41:01

标签: ajax forms drupal drupal-7

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

干杯

2 个答案:

答案 0 :(得分:8)

#default_value设置为推荐的Spudley,并将#name属性设置为唯一的属性(使用$delta参数)。

答案 1 :(得分:5)

  

当函数执行进入任一按钮的回调函数时,$ form_state ['triggering_element']总是相同的,最后一个按钮

不幸的是,Drupal的表单API如何工作。如果表单上有多个提交按钮,有时您无法分辨哪个按钮被单击。

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

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


如果这没有帮助,这里有一些其他解决方案可能有所帮助:

  1. 直接查看PHP的$_POST数组,找出点击了哪个按钮。这有效,但违背了“Drupal Way”。 Drupal的表单API的重点是隐藏原始的PHP功能。但有时候这样做可能会有用。窥探它。

  2. 将按钮分成不同的形式。这显然只有在您不需要同时提交任何其他字段时才有效。

  3. 在表单上创建一个隐藏字段,并在提交表单之前使用Javascript将其与所单击按钮的名称一起填充。

  4. 希望有所帮助。