如何在Drupal 5表单中添加两个提交按钮?

时间:2009-09-11 16:14:47

标签: drupal drupal-fapi drupal-5

我的表单上有两个提交按钮。一个是正​​常的提交按钮,它调用`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`函数,这会使我的计划重新获得数百万的黄油替代品。谁能揭开这黑暗的混乱局面?

2 个答案:

答案 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

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

答案 1 :(得分:3)

编辑:仔细检查Forms API文档,发现我的初始答案对Drupal 6有效,但对Drupal 5只有部分有效。将Drupal 5 docs与{进行比较{3}}表明在Drupal 5中,你只能在表单本身上注册回调函数 - 按钮的'#submit'属性只是一个布尔值,表示该按钮将作为提交按钮处理。因此,添加'每个按钮'回调只是Drupal 6的一个功能!

对于给定的问题,这意味着只有ax建议的if / elseif选项,或者为表单注册两个提交回调的变体,每个都检查它们是否被调用右键(基本上是if / elseif版本,但使用两个单独的回调)。


(初步答复)

这里有几种机制可供使用:

  1. 提交(和验证)回调可以为单个按钮注册,也可以为表单本身注册($form['#submit'])。为每个提交按钮调用为表单注册的那些按钮,仅为该按钮注册单个按钮的按钮。 (注意:重要的Drupal 5/6不同,请参阅下面的编辑。)
  2. 默认表单处理(提交和验证以表单命名的函数)由Drupal自动为表单'#submit''#validate'数组添加回调。
  3. 注册使用数组,以允许一个接一个地调用多个提交/验证函数(按照它们在数组中出现的顺序)。
  4. 因此,在您的情况下,您可以执行ax建议的if / elseif开关,或者您需要取消设置表单的“全局”回调,将其显式移动到默认的提交按钮:

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

    (验证回调的内容相同)

    之后,您发布的执行恶意计划的Big Red Button的示例应按预期工作;)