26

I have 2 submit buttons and want to perform different actions for each submit button . Here I want to set the form fields which can be done only in form_alter(). Can anyone suggest how to check for multiple submit buttons in the form_alter() function?

I have used

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';
 }
                   

but this does not work

                   
improve this question                            
asked Dec 21 '10 at 17:05                                
                               
  • Do you have a submit hook in your form? $form['#submit'][] = 'myform_form_submit'; ? – Kevin Dec 21 '10 at 18:20                                
  • yes, but isn't drupal supposed to pick up the submit function even without the above hook? – user550265 Dec 22 '10 at 15:02                                
       

3 Answers  正确答案 1                 

activeoldestvotes                    
       
51

The best thing to do if you have two submit buttons on a form and want them to do different things, is to create a different submit function for each button, and connect them up. One of the nice things about the FormAPI is that it automatically links the form with the submit handler for you, but if you have two submit buttons you want to go somewhere new.

So your form code is likely to contain:

$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'),
);
                       

But I don't know what you mean by form_alter() - there's no reason to use a form alter of any sort.

Edit: As came up in the comments - if you need different validation functions for the two buttons, you can also include '#validate' => array('my module_form_validate_one') and '#validate' => array('my module_form_validate_two') in the respective button arrays. But it's not required, and if the standard form validation function works fine then go with that.                                                        

                     
14

If you want to handle different submit button-click within one submit function, you may check:

正确答案 2                         

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

Or you may assign certain property to the button first, then check:

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

I'm using Drupal 7... Hope this helps

improve this answer                            
edited Dec 8 '11 at 5:39                                
answered Dec 8 '11 at 5:28                                
                                   
                               
  • This is no good though... what if the string changes? WHat if it's in a different language? – pandaPowder May 23 '14 at 18:49                                    
  • @pandaPowder The string change doesn't matter as long as you have YOUR_PROPERTY set – songyy May 26 '14 at 14:30                                    
  • 1                                    
    Multiple submit buttons have #name as 'op'. You will have to override it manually and set a unique value to each button to get $form_state['triggering_element'] working properly – Varshith Dec 23 '14 at 9:56                                    
       
3

While the accepted answer is correct, it should be noted that you must pass different values with each of your submit buttons, or the submit function used will be the last submit button defined.

In other words, if the value of both submit buttons is 'Submit,' then only the second submit function will be called, regardless of which button is pressed.

improve this answer                            
answered Nov 23 '13 at 0:17                                
                                   
                               
       

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


           


           

  • [Drupal] [开发]具有多个提交按钮的表单




Nitin gupta                                                
2009年10月6日下午7:57                        

您好,
我在一个页面上有两个表单提交按钮,有些像这样:

$ form ['submit1'] = array(
'#type'=>'submit',
'#value'=> t('save') ,
'#submit'=> array('test_submit1'),

); 

[更多元素之间] 

$ form ['submit2'] = array(
'#type'=>'submit',
'#value'=> t('Save'),
'#submit'=> array(' test_submit2'),

); 


现在,无论我是否点击其中任何一个,
都会始终调用第二个按钮的提交回调但是,如果我改变第二个按钮的值或给它们
不同的'#name',一切都会恢复原状。
他们分别调用他们的提交函数。

我没想到这样的行为:

http://drupal.org/node/144132#buttons

虽然,它们都有相同的#value,但在
表单中会有不同的ID ,所以Drupal有充分的理由区分它们(或不是??)。
为什么会发生这样的事情?我错过了什么吗?


问候,
Nitin Kumar Gupta 
http://publicmind.in/blog/
--------------下一部分-------------- 
一个HTML附件擦洗... 
URL:http//lists.drupal.org/pipermail/development/attachments/20091007/8dd54784/attachment.html答复            


           


       
  • 嵌套


  • 如果你查看HTML源代码,提交按钮的名称是“op” - 在
    评论表单中,这可以让你切换是否预览或发布,
    例如。评论模块也可能是查看代码的好地方


    - 肯温特斯
    在2009年10月6日下午3:57,nitin gupta写道:

    您好,

    我在一个页面上有两个表单提交按钮,有些
    像这样:

    $ form ['submit1'] = array(
    '#type'=> 'submit',
    '#value'=> t('save'),
    '#submit'=> array('test_submit1'),

    ); 

    [更多元素之间] 

    $ form ['submit2'] = array(
    '#type'=>'submit',
    '#value'=> t('Save'),
    '#submit'=> array(' test_submit2'),

    ); 


    现在,无论我是否点击其中任何一个,
    都会始终调用第二个按钮的提交回调
    但是,如果我改变第二个按钮的值或给它们不同的'#name',一切都会恢复原状。他们
    分别调用他们的提交函数。

    我没想到会出现这样的行为:

    http//drupal.org/node/144132#buttons

    虽然它们都有相同的#value,但在
    表单中会有不同的ID ,所以Drupal有充分的理由区分它们
    (或不??)。为什么会发生这样的事情?我错过了什么吗?


    此致,
    Nitin Kumar Gupta 
    http://publicmind.in/blog/--------------下一部分-------------- 
    一个HTML附件被擦除... 
    URL:http//lists.drupal.org/ pipermail /开发/附件/ 20091006 / eb7f645b / attachment.html回复 永久链接                    


  • 嗨,

    当浏览器将表单发布回Web服务器时,它只会
    根据各自的名称发送表单元素的值。也就是说
    ,以下输入

    <input type =“sometype”value =“value”id =“some-id”name =“some-name”/> 

    将作为
    some-name = value 发回服务器

    由于按钮也以相同的方式回发,因此
    如果Drupal共享相同的名称
    和值,则无法知道按下了哪个按钮


    Steven Jones 
    ComputerMinds有限公司 - Perfect Drupal网站

    电话:024 7666 7277 
    手机:07702 131 576 
    推特:darthsteven 
    http://www.computerminds.co.uk



    2009/10/6 nitin gupta <nitingupta.iitg at gmail.com>:
    你好,
    我在一个页面上有两个表单提交按钮,有些像这样:
    $ form ['submit1'] = array(
    ???'#type'=>'submit',
    ?? ??'#value'=> t('save'),
    ?? ??'#submit'=> array('test_submit1'),

    ??); 

    [在之间的一些更多的元件] 
    ??$form['submit2'] = array(
    ?? ?'#type' => 'submit',
    ?? ?'#value' => t('Save'),
    ?? ?'#submit' => array('test_submit2'),

    ??);

    现在,无论我是否点击其中任何一个,
    都会始终调用第二个按钮的提交回调但是,如果我更改第二个按钮的值或给它们
    不同的'#name',一切都恢复原状。
    他们分别调用他们的提交函数。
    我没想到会出现这样的行为:
    http//drupal.org/node/144132#buttons
    虽然它们都有相同的#value,但在
    表单中会有不同的ID ,所以Drupal有充分的理由区分它们(或不??)。
    为什么会发生这样的事情?我错过了什么吗?

    此致,
    Nitin Kumar Gupta 
    http://publicmind.in/blog/回复 永久链接                    


  • 哦,那就是抓住..谢谢史蒂文

    此致,
    Nitin Kumar Gupta 
    http://publicmind.in/blog/

    在2009年10月7日星期三上午2:36,Steven Jones写道:

    嗨,

    当浏览器将表单发布回Web服务器时,它只会
    根据各自的名称发送表单元素的值。也就是说
    ,以下输入

    <input type =“sometype”value =“value”id =“some-id”name =“some-name”/> 

    将作为
    some-name = value 发回服务器

    由于按钮也以相同的方式回发,因此
    如果Drupal共享相同的名称
    和值,则无法知道按下了哪个按钮

    关于
    Steven Jones 
    ComputerMinds有限公司 - 完美Drupal网站

    电话:024 7666 7277 
    手机:07702 131 576 
    Twitter:darthsteven
    http://www.computerminds.co.uk



    2009/10/6 nitin gupta <nitingupta.iitg at gmail.com>:
    您好,
    我在一个页面上有两个表单提交按钮,有些像这样:
    $ form ['submit1'] = array(
    '#type'=>'submit',
    '#value'=> t('save') ,
    '#submit'=> array('test_submit1'),

    ); 

    [更多元素之间] 
    $ form ['submit2'] = array(
    '#type'=>'submit',
    '#value'=> t('Save'),
    '#submit'=> array(' test_submit2'),

    ); 

    现在,无论我是否点击其中任何一个,
    都会始终调用第二个按钮的提交回调但是,如果我改变第二个按钮的值或给它们
    不同的'#name',一切都会恢复原状。
    他们分别调用他们的提交函数。
    我没想到这样的行为:
    http://drupal.org/node/144132#buttons
    虽然,它们都有相同的#value,但在
    表单中会有不同的ID ,所以Drupal有充分的理由区分它们(或不是??)。
    为什么会发生这样的事情?我错过了什么吗?

    此致,
    Nitin Kumar Gupta 
    http://publicmind.in/blog/--------------下一部分-------------- 
    一个HTML附件被擦除... 
    URL:http//lists.drupal.org/ pipermail /开发/附件/ 20091007 / 04f82a7b / attachment.html回复 永久链接                    

  •  

    请注意,如果按钮上的标签(#value属性)相同,则FAPI将始终返回最后一个按钮:您需要在提交时使用不同的#value,以便以不同方式返回op。
    ________________________________________ 
    De:drupal.org的发展反弹[drupal.org的发展 - 反弹] de Win de Ken Winters [煤矿商网的kwinters]发表
    日期:2009年8月6日mardi 6月22日
    :drupal.org开发
    Objet:Re:[开发]具有多个提交按钮的表单

    如果查看HTML源代码,提交按钮的名称为“op” - 在注释表单中,这可以让您切换是预览还是发布,例如。评论模块也可能是查看代码的好地方。

    - 肯温特斯

    在2009年10月6日下午3:57,nitin gupta写道:

    您好,

    我在一个页面上有两个表单提交按钮,有些像这样:

    $ form ['submit1'] = array(
    '#type'=> 'submit',
    '#value'=> t('save'),
    '#submit'=> array('test_submit1'),

    ); 

    [更多元素之间] 

    $ form ['submit2'] = array(
    '#type'=>'submit',
    '#value'=> t('Save'),
    '#submit'=> array(' test_submit2'),

    ); 


    现在,无论我是否点击其中任何一个,都会始终调用第二个按钮的提交回调。但是,如果我更改第二个按钮的值或给它们不同的'#name',一切都恢复原状。他们分别调用他们的提交函数。

    我没想到会出现这样的行为:

    http//drupal.org/node/144132#buttons

    虽然它们都有相同的#value,但在表单中会有不同的ID,所以Drupal有充分的理由区分它们(或不??)。为什么会发生这样的事情?我错过了什么吗?


    此致,
    Nitin Kumar Gupta 
    http://publicmind.in/blog/回复 永久链接                    

           


           


           

来自  https://grokbase.com/t/drupal/development/09a61tqf88/form-with-multiple-submit-buttons/oldest