处理Drupal表单API中的多个提交按钮

时间:2010-12-21 17:05:05

标签: drupal

我有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 个答案:

答案 0 :(得分: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')。但这不是必需的,如果标准表格验证功能正常工作,那就去吧。

答案 1 :(得分:15)

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

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 ...希望这有帮助

答案 2 :(得分:3)

虽然接受的答案是正确的,但应注意您必须为每个提交按钮传递不同的值,否则使用的提交功能将是定义​​的最后一个提交按钮。

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