AJAXコールバックで$ form_stateを変更します


16

フォームAPI '#ajax'属性を使用するフォームを作成してい$form_stateますが、AJAX対応ボタンが押されたときを変更する必要があります。ここに私が持っているものがあります:

フォームビルダー関数内:

...
$form['some_fieldset']['add_more'] = array(
      '#type' => 'button',
      '#value' => t('Add more rows'),
      '#ajax' => array(
        'wrapper' => 'some-fieldset',
        'callback' => 'my_module_settings_ajax',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );

...

そして、これがコールバック関数です:

function my_module_settings_ajax($form, $form_state) { 
  // Make a change to $form_state
  if ($form_state['some_fieldset']['add_more']) {
    $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
  }

  return $form['some_fieldset'];
}

$form_stateコールバックが終了すると、変更は失われたように見えます。$form_stateこの関数に変更を加える方法はありますか、または代わりにこれに使用する他の関数がありますか?

編集

結局のところ、コールバックはこのロジックを実行するのに間違った場所です。代わりに、フォームビルダー関数の上部に、これを追加しました。

// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
  $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
}

もちろん、ボタンに名前を付ける必要がありました。

$form['some_fieldset']['add_more'] = array(
  '#type' => 'button',
  '#name' => 'add_more', // <-- Right here
  '#value' => t('Add more rows'),
  '#ajax' => array(
    'wrapper' => 'some-fieldset',
    'callback' => 'my_module_settings_ajax',
    'method' => 'replace',
    'effect' => 'fade',
  ),
);

そして今、それは動作します!

回答:


3

$form_state参照として渡す必要があります。AJAX関数は、次の例のように定義する必要があります。

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

明確にするために、値ではなく参照で渡す&が必要です。それなしでは、$ form_stateのコピーを変更するだけです。
マルクス

はい、これを行わない場合は、ローカル変数のみを変更します。
栄養

1
もちろん、それは考えていませんでした。残念ながら、それは何の効果もありませんでした-$ form_stateに加えられた変更はフォームビルダーで無視され、AJAX呼び出しが次に行われたときに$ form_stateが元に戻ります。コールバックが実行されるまでにフォームが既に生成されている可能性がありますか?代わりにこのボタンのカスタム送信ハンドラを実行する方法はありますか?
MW。

提出するボタンから種類を変更しよう
nourcy

0

それがあなたの質問に対する直接的な答えであるかどうかはわかりませんが、ユースケースでうまくいくかもしれません:$ form_stateを変更する代わりに、$ formに値を追加します。表示したくない場合は、useのみを使用します#hidden

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