複数の送信ボタン:どれが押されましたか?


7

これは、以下の重複している可能性があり、複数のフォームを提出したが、私は答えは私の状況に適用する方法を見つけ出すことができません。だからここに私がこれ(私は認めます)と非常によく似た質問をするのが私の挑戦です:

データの行を持つテーブルがあり、各行に送信ボタンがあります。次のようになります。

$form['f'] = array();
foreach ($rows as $row) {
  $form['f'][$row['nid']] = array();
  $form['f'][$row['nid']]['nid'] = array(
    '#markup' => $row['nid'],
  );
  $form['f'][$row['nid']]['submit'] = array(
    '#type' => 'submit',
    '#value' => t('sumbit'),
    '#submit' =>  array('f_submit'),
  );
}

つまり、フォームはデータベースから抽出された一連の行で構成され、対応するnidフィールドの値を取得してその値を出力する送信コールバックを作成します。下のコメントがあるところに何を付けたらいいのかと思っています。

function f_submit($form, &$form_state) {
  // Here I want to print the value of the relevant nid field
}

1
関連するDrupal.orgの問題。最後の2つのコメントは特に興味深い
Clive

回答:


6

クリックされたボタンに関するデータはに保存され$form_state['triggering_element']ます。を見て、ノードIDを取得できます$form_state['triggering_element']['#parents']。あなたの場合、ノードIDはparents配列の2番目の項目になります。フィールド定義の名前属性は定義され、一意である必要があることに注意してください。それ以外の場合、トリガー要素はフォームの最後の送信ボタンを指します。私はあなたのコードを次のように変更します:

$form['f'] = array();
foreach ($rows as $row) {
  $form['f'][$row['nid']] = array();
  $form['f'][$row['nid']]['nid'] = array(
    '#markup' => $row['nid'],
  );
  $form['f'][$row['nid']]['submit'] = array(
    '#type' => 'submit',
    '#value' => t('sumbit'),
    '#name' => 'submit-' . $row['nid'],
    '#submit' =>  array('f_submit'),
  );
}

表示する良い方法$form_stateは、Develモジュール(のkrumo())をインストールしてkrumo($form_state);drupal_exit();から、送信ハンドラの上部に配置することです。これにより、データの構造化されたツリーが表示されます。


1
Develを使用する上で良い呼びかけですが$form_state['clicked_button']、クリックされたボタンに関連する要素ではなく、常に2番目の親要素として最後のnidが含まれています(試してみました)。同じことは$form_state['triggering_element']、Drupal 7で推奨されると思います(ただし、現時点でそれをバックアップするための参照を見つけることができません)
Clive

2
#nameを定義し、送信ボタンで一意にする必要があることを言うのを忘れていました。それ以外の場合は、説明したとおりに動作します。triggering_elementの使用についてはあなたが正しい、clicked_buttonは非推奨です。これに関する情報はapi.drupal.org/api/drupal/includes%21form.inc/function/…にあります。答えを更新しました。
ラウリ

1

設定し#name、それぞれの特性は、あなたのようなユニークな値に要素を提出します$row['nid']。この一意の値には、送信機能からを介してアクセスできます$form_state['clicked_button']['#name']


0

私はしばらくこれに苦労していて、この回避策を考え出しました。動作が少し異なる2つの個別の送信ボタンが必要でした。また、jQueryを使用してそれらを追加および削除したいと考えていました。

だから、私はこれをやった。

一意の名前を持つ2つのボタンを作成します。

    $form['edit-submit'] = array(
        '#type' => 'submit',
        '#value' => t('Reclassify Selected'),
        '#name' => 'default-submit'
    );

    $form['classify-submit'] = array(
        '#type' => 'submit',
        '#value' => t('Re-classify'),
        '#name' => 'classify-submit'
    );

動的に使用したいボタンを非表示にします。

    $(document).ready(function() {
        // Hide the classify button
        $('#edit-classify-submit').css('display', 'none');
    });

必要に応じて、ボタンをフォームとページの他の場所に複製します。

    $('#edit-classify-submit').clone().appendTo('.my-form').css('display', 'inline-block')

drupalフォーム宣言でボタン定義を追加しないと、$ form ['triggering_element']に含まれないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.