我的表单上有两个提交按钮。一个是正常的提交按钮,它调用`my_form_submit`就像-ah-so:
$form['fieldset']['submit'] = array(
'#type' => 'submit',
'#value' => 'Show Applications',
);
我想添加另一个提交表单的按钮,但是调用另一个提交处理程序。有没有办法做到这一点?我已经考虑将#submit
属性添加到类似-ah-so的元素:
$form['fieldset']['evil_plan'] = array(
'#type' => 'submit',
'#value' => 'Big Red Button',
'#submit' => array('steal_formula_for_icantbeliveitsnotbutter'),
);
希望调用`steal_formula_for_icantbeliveitsnotbutter`函数,但没有用。当我点击Big Red Button时,会调用正常的`my_form_submit`函数,这会使我的计划重新获得数百万的黄油替代品。谁能揭开这黑暗的混乱局面?
答案 0 :(得分:4)
对于Drupal 5,这是唯一的解决方案:
function my_form_submit($form_id, $form_values) {
if ($form_values['op'] == 'Show Applications') {
// handle 'Show Applications' submission
}
elseif ($form_values['op'] == 'Big Red Button') {
// handle 'Big Red Button' submission
}
}
my_form_validate
。
答案 1 :(得分:3)
编辑:仔细检查Forms API文档,发现我的初始答案对Drupal 6有效,但对Drupal 5只有部分有效。将Drupal 5 docs与{进行比较{3}}表明在Drupal 5中,你只能在表单本身上注册回调函数 - 按钮的'#submit'属性只是一个布尔值,表示该按钮将作为提交按钮处理。因此,添加'每个按钮'回调只是Drupal 6的一个功能!
对于给定的问题,这意味着只有ax建议的if / elseif选项,或者为表单注册两个提交回调的变体,每个都检查它们是否被调用右键(基本上是if / elseif版本,但使用两个单独的回调)。
(初步答复)
这里有几种机制可供使用:
$form['#submit']
)。为每个提交按钮调用为表单注册的那些按钮,仅为该按钮注册单个按钮的按钮。 (注意:重要的Drupal 5/6不同,请参阅下面的编辑。)'#submit'
和'#validate'
数组添加回调。因此,在您的情况下,您可以执行ax建议的if / elseif开关,或者您需要取消设置表单的“全局”回调,将其显式移动到默认的提交按钮:
$form['fieldset']['submit']['#submit'] = $form['#submit'];
unset($form['#submit'];
(验证回调的内容相同)
之后,您发布的执行恶意计划的Big Red Button的示例应按预期工作;)