2009-09-11 55 views
2

我的表单上有两个提交按钮。一个是正​​常的提交按钮调用`my_form_submit`喜欢啊,所以:如何将两个提交按钮添加到Drupal 5表单中?

$form['fieldset']['submit'] = array(
    '#type' => 'submit', 
    '#value' => 'Show Applications', 
); 

我想补充另一个按钮,将提交表单,而是调用不同的提交处理程序。有没有办法做到这一点?我已经看过添加#submit属性的元素一样啊,所以:

$form['fieldset']['evil_plan'] = array(
    '#type' => 'submit', 
    '#value' => 'Big Red Button', 
    '#submit' => array('steal_formula_for_icantbeliveitsnotbutter'), 
); 

希望调用`steal_formula_for_icantbeliveitsnotbutter`功能而不worky。当我点击大红色按钮时,会调用正常的`my_form_submit`函数,这使我的计划让数百万人无法使用黄油替代品。谁可以在这个黑暗的混乱中找到一些亮点?

回答

4

为Drupal 5,这是唯一的解决方案:

​​

相同为my_form_validate

在Drupal 6中,使用新引入的custom #submit and #validate handlers for form buttons可以轻松完成。

+0

我试图避免在同做提交功能。如果没有通过正常的提交函数,是否真的没有办法将其重定向到不同的提交函数? – jergason 2009-09-11 18:38:26

+0

+1,因为这是Drupal 5的最初正确答案! (现在如果你刚才提到你检查了5/6的差异,我就不会首先受到干扰;) – 2009-09-14 16:24:21

+0

总是尽可能简洁:) tnx为+1。 – 2009-09-14 16:58:11

3

编辑:窗体API文档的仔细检查发现,下面我最初的回答是有效的为Drupal 6,但只是部分有效的Drupal 5.比较Drupal 5 docsDrupal 6 docs显示,在Drupal 5,可以只在表单本身注册回调函数 - 按钮的#submit属性只是一个布尔值,表示该按钮将作为提交按钮来处理。因此,为每个按钮添加回调是Drupal 6的唯一功能!

对于给定的问题,这意味着仅存在如果/ ELSEIF选项由斧建议的,或登记2提交回调的形式中,每个检查,如果它们被称为为右按钮的(变化基本上是if/elseif版本,但使用两个单独的回调)。


(最初的回答)

有在这里工作的几个机制:

  1. 提交(和验证)的回调可以注册为单个按钮,也为形式本身($form['#submit'] )。注册表单的人员会为每个提交按钮进行调用,仅为那个按钮注册一个按钮。 (注意:Drupal 5/6的重要区别在这里,请参阅下面的编辑。)
  2. 默认表单处理(提交并验证函数以表单命名)由Drupal工作,自动为表单'#submit''#validate'数组添加回调。
  3. 注册使用数组以便允许多个提交/验证函数依次调用(按照它们在数组中出现的顺序)。

所以你的情况,你可以做斧头建议,如果/ ELSEIF开关,或者你需要取消设置窗体的“全球性”回调,明确地移动它的默认提交按钮:

$form['fieldset']['submit']['#submit'] = $form['#submit']; 
unset($form['#submit']; 

(用于验证回调同样的事情)

之后,你的大红按钮执行的邪恶计划应该按预期工作贴出的例子)

+0

这很有道理。所以$ form ['#submit'](和validate)回调覆盖了各个元素的回调。是否有我需要设置的#validate回调? – jergason 2009-09-13 19:34:50

+0

是的,验证遵循相同的机制,所以如果你需要/使用验证,你会做同样的验证回调。 – 2009-09-13 20:49:53

+0

Oups,在这种情况下,偶然发现了Drupal 5/6的差异,请参阅编辑了解详细信息。 – 2009-09-13 20:50:42

相关问题