フォームAPIの'#ajax'
属性を使用するフォームを作成しています。AJAX対応ボタンが押されたときに$form_state
を変更する必要があります。ここに私が持っているものがあります:
私のフォームビルダー関数の内部:
...
$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',
),
);
そして今、それは機能します!
$form_state
を参照として渡す必要があります。 AJAX関数は、次の例のように定義する必要があります。
function mymodule_settings_ajax($form, &$form_state) { /* … */ }
それがあなたの質問への直接の答えであることはわかりませんが、あなたのユースケースでうまくいくかもしれません:$ form_stateを変更する代わりに$ formに値を追加してください。表示したくない場合は、#hidden
を使用してください。