2010-12-21 121 views
25

我有2個提交按鈕,並且想要爲每個提交按鈕執行不同的操作。在這裏我想設置只能在form_alter()中完成的表單域。任何人都可以建議如何檢查form_alter()函數中的多個提交按鈕?在Drupal表單中處理多個提交按鈕API

我用

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

但這不起作用

+0

你的表單中有提交鉤子嗎? $ form ['#submit'] [] ='myform_form_submit'; ? – Kevin 2010-12-21 18:20:06

+0

是的,但不是Drupal應該拿起提交功能,即使沒有上述掛鉤? – user550265 2010-12-22 15:02:43

回答

49

的最好的事情,如果你有兩個窗體上提交按鈕做,並希望他們做不同的事情,就是要創建一個不同的提交每個按鈕的功能,並連接起來。 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')。但它不是必需的,如果標準表單驗證功能正常工作,那就去做吧。

+0

使用兩個不同的提交函數聽起來像是一個很好的解決方案,但驗證函數會發生什麼?你最終還會得到其中兩個嗎? – Shawn 2012-09-04 20:02:00

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 ...希望這可以幫助

2

雖然接受的答案是正確的,但應該注意的是,您必須爲每個提交按鈕或子傳遞不同的值使用的mit函數將是最後一個提交按鈕的定義。換句話說,如果兩個提交按鈕的值都是'Submit',那麼無論按下哪個按鈕,只會調用第二個提交函數。

相關問題