2

我的表单上有两个提交按钮。一个是调用 `my_form_submit` 的普通提交按钮,例如:

$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` 函数但没有用。当我点击大红色按钮时,会调用正常的 `my_form_submit` 函数,这阻碍了我从黄油替代品中赚取数百万美元的计划。谁能解开这个黑暗的烂摊子?

4

2 回答 2

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 中,这可以通过新引入的自定义表单按钮的 #submit 和 #validate 处理程序来更轻松地完成。

于 2009-09-11T16:55:42.883 回答
3

编辑:对 Forms API 文档的仔细检查显示,我下面的初始答案对 Drupal 6 有效,但对 Drupal 5 仅部分有效。将Drupal 5 文档Drupal 6 文档进行比较表明,在 Drupal 5 中,您只能注册表单本身的回调函数 - 按钮的“#submit”属性只是一个布尔值,表示该按钮将作为提交按钮处理。所以添加“每个按钮”回调是 Drupal 6 独有的功能!

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


(初步回答)

这里有几种机制在起作用:

  1. 可以为单个按钮注册提交(和验证)回调,也可以为表单本身注册($form['#submit'])。为表单注册的那些会为每个提交按钮调用,为单个按钮注册的那些仅针对那个按钮。(注意:此处重要的 Drupal 5/6 差异,请参阅下面的编辑。)
  2. 默认的表单处理(以表单命名的提交和验证函数)由 Drupal 自动为表单'#submit''#validate'数组添加回调。
  3. 注册使用数组以便允许一个接一个地调用多个提交/验证函数(以它们在数组中出现的相同顺序)。

因此,在您的情况下,您可以执行 ax 建议的 if/elseif 切换,或者您需要取消设置表单的“全局”回调,将其显式移动到默认提交按钮:

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

(验证回调也是如此)

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

于 2009-09-13T16:30:11.750 回答