2

フォームに2つの送信ボタンがあります。1つは、「my_form_submit」を次のように呼び出す通常の送信ボタンです。

$form['fieldset']['submit'] = array(
  '#type' => 'submit',
  '#value' => 'Show Applications',
);

フォームを送信する別のボタンを追加したいのですが、別の送信ハンドラーを呼び出します。これを行う方法はありますか?#submit-ah-soのような要素にプロパティを追加することを検討しました。

$form['fieldset']['evil_plan'] = array(
  '#type' => 'submit',
  '#value' => 'Big Red Button',
  '#submit' => array('steal_formula_for_icantbeliveitsnotbutter'),
);

`steal_formula_for_icantbeliveitsnotbutter`関数を呼び出すことを望んでいますが、機能しません。大きな赤いボタンをクリックすると、通常の `my_form_submit`関数が呼び出されます。これにより、バターの代用品を何百万ドルも稼ぐという私の計画が後退します。誰がこの暗い混乱に光を当てることができますか?

4

2 に答える 2

4

Drupal 5 の場合、これが唯一の解決策です。

function my_form_submit($form_id, $form_values) {
  if ($form_values['op'] == 'Show Applications') {
    // handle 'Show Applications' submission
  }
  elseif ($form_values['op'] == 'Big Red Button') {
    // handle 'Big Red Button' submission
  }
}

についても同じですmy_form_validate

Drupal 6 では、新しく導入されたフォーム ボタン用のカスタム #submit および #validate ハンドラーを使用すると、これを簡単に行うことができます。

于 2009-09-11T16:55:42.883 に答える
3

編集:フォーム API ドキュメントの詳細なチェックにより、以下の私の最初の回答が Drupal 6 に対して有効であることが明らかになりましたが、Drupal 5 に対しては部分的にしか有効ではありませ。フォーム自体のコールバック関数 - ボタンの「#submit」プロパティは、ボタンが送信ボタンとして処理されることを示す単なるブール値です。したがって、「ボタンごと」のコールバックを追加するのは Drupal 6 のみの機能です。

指定された Questionの場合、これは ax によって提案された if/elseif オプション、またはフォームに 2 つの送信コールバックを登録するバリエーションのみが存在し、それぞれが正しいボタンに対して呼び出されているかどうかを確認することを意味します (基本的には if/elseif バージョン、ただし、2 つの別個のコールバックを使用します)。


(最初の答え)

ここでは、いくつかのメカニズムが働いています。

  1. 送信 (および検証) コールバックは、個々のボタンだけでなく、フォーム自体にも登録できます ( $form['#submit'])。フォームに登録されたものは送信ボタンごとに呼び出され、個々のボタンに登録されたものはそのボタンのみに呼び出されます。(注: Drupal 5/6 の重要な違いについては、以下の編集を参照してください。)
  2. デフォルトのフォーム処理 (フォームにちなんで名付けられた送信および検証関数) は、Drupal がそれらのコールバックをフォーム'#submit''#validate'配列に自動的に追加することによって機能します。
  3. 登録では配列を使用して、いくつかの送信/検証関数を次々に (配列に表示される順序で) 呼び出すことができるようにします。

したがって、あなたの場合、ax によって提案された if/elseif スイッチを実行するか、フォームの「グローバル」コールバックの設定を解除して、明示的にデフォルトの送信ボタンに移動する必要があります。

$form['fieldset']['submit']['#submit'] = $form['#submit'];
unset($form['#submit'];

(validate コールバックについても同じこと)

その後、邪悪な計画を実行する Big Red Button の投稿された例は、期待どおりに機能するはずです;)

于 2009-09-13T16:30:11.750 に答える