26

我有2个提交按钮,并希望为每个提交按钮执行不同的操作。在这里,我想设置只能在form_alter()中完成的表单字段。任何人都可以建议如何检查form_alter()函数中的多个提交按钮?

我用过

function myform_form_submit($formID, &$form_state) {
if($form_state['clicked_button']['#value'] == $form_state['values']['submit_one'])    //if button 1      is clicked
     $form_state['redirect'] = 'mypath/page_one';   //redirect to whatever page you want
 else if($form_state['clicked_button']['#value'] == $form_state['values']['submit_two'])  /if button      2 is clicked
    $form_state['redirect'] = 'mypath/page_two';
 }

但这不起作用

3答案 正确答案

51

如果表单上有两个提交按钮并希望它们执行不同的操作,最好的办法是为每个按钮创建一个不同的提交功能,然后将它们连接起来。FormAPI的一个好处是它会自动将表单与提交处理程序链接起来,但是如果你有两个提交按钮,你想要去一个新的地方。

所以你的表单代码可能包含:

$form['submit_one'] = array(
  '#type' => 'submit',
  '#value' => t('Submit One'),
  '#submit' => array('my_module_form_submit_one'),
);
$form['submit_two'] = array(
  '#type' => 'submit',
  '#value' => t('Submit Two'),
  '#submit' => array('my_module_form_submit_two'),
);

但是我不知道你的意思是form_alter() - 没有理由使用任何类型的表单。

编辑:正如在评论中想出了-如果你需要为两个按钮不同的验证功能,还可以包括'#validate' => array('my module_form_validate_one')'#validate' => array('my module_form_validate_two')在各自的按钮配置。但它不是必需的,如果标准表单验证功能正常工作,那就去吧。

  • 使用两个不同的提交函数听起来像一个非常好的解决方案,但验证功能会发生什么?你最后还有两个吗? -  肖恩于12年4月4日20:02
  • 要回答我自己的问题,两个提交按钮都会调用验证函数,不需要复制它(虽然如果需要可能有两个不同的验证函数,我不知道) -  Shawn 10年9月9日在19: 52
  • 如果您需要两个提交按钮的不同验证按钮怎么办?假设我们要在需要某些字段的表单上添加取消按钮。单击取消将引发错误,因为使用相同的验证功能来检查必填字段是否为空。 -  jjei 12月31日在7:59
  • 2
    如你所知,你可能还需要添加 - '#validate'=> array('my_module_form_validate_one'), - Toaster 2013年  2月27日13:49
  • 如果您的第二个提交按钮只是执行一些额外的处理(在主提交功能中完成处理之前或之后),您可以简单地在第二个按钮的提交数组前面或附加一个额外的提交功能,而不是复制您的公共代码。例如。$ form ['submit_two'] ['#submit'] = array_merge($ form ['submit_one'] ['#submit'],array('extra submit function')) - Giles B 2015年  10月7日19:57 
14

如果要在一个提交功能中处理不同的提交按钮 - 单击,您可以检查:

if($form_state['values']['op'] == BUTTON_ONE_VALUE){
} else if($form_state['values']['op'] == BUTTON_TWO_VALUE){
}

或者您可以先将某些属性分配给按钮,然后检查:

$form_state['triggering_element']['#attributes'][YOUR_PROPERTY] == VALUE

我正在使用Drupal 7 ...希望这会有所帮助

3

虽然接受的答案是正确的,但应注意您必须为每个提交按钮传递不同的值,或者使用的提交函数将是最后定义的提交按钮。

换句话说,如果两个提交按钮的值都是“提交”,则无论按下哪个按钮,都只会调用第二个提交功能。

来自 https://stackoverflow.com/questions/4501890/handle-multiple-submit-buttons-in-drupal-form-api