web-dev-qa-db-ja.com

DrupalフォームAPIで複数の送信ボタンを処理する

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

これは機能しません

27
user550265

フォームに2つの送信ボタンがあり、それらに異なる処理を実行させる場合は、ボタンごとに異なる送信関数を作成し、それらを接続するのが最善の方法です。 FormAPIの良い点の1つは、フォームを送信ハンドラに自動的にリンクすることですが、送信ボタンが2つある場合は、どこか新しい場所に移動する必要があります。

したがって、フォームコードには次のものが含まれる可能性があります。

_$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()が何を意味するのかはわかりません。フォームの変更を使用する理由はありません。

編集:コメントで述べたように-2つのボタンに異なる検証関数が必要な場合は、それぞれのボタン配列に'#validate' => array('my module_form_validate_one')および'#validate' => array('my module_form_validate_two')を含めることもできます。しかし、これは必須ではありません。標準のフォーム検証関数が適切に機能する場合は、それで問題ありません。

51
John Fiala

1つの送信関数内で異なる送信ボタンクリックを処理する場合は、次のことを確認できます。

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を使用しています...これが役に立てば幸いです

15
songyy

受け入れられた答えは正しいですが、送信ボタンのそれぞれで異なる値を渡す必要があることに注意してください。そうしないと、使用される送信関数が最後に定義された送信ボタンになります。

つまり、両方の送信ボタンの値が「送信」の場合、どのボタンが押されたかに関係なく、2番目の送信関数のみが呼び出されます。

3
Jeremy Rimpo