ボタンが付いたフォームがあり、これを押すとajaxリクエストを介してフォームの別の部分が再構築されます。
ボタンをクリックするとフォームが再構築され、フォームの値を保存してフォームの一部を返す私のajaxコールバックが呼び出されます。
問題は、値を保存するコールバックの前にフォームが再構築され、フォームの構築方法が変更されることです。
もう一度ajaxボタンをクリックすると、フォームがビルドされたときの前回のajaxリクエストの値と同じように正しく機能します。
フォームが再構築される前にコールバック関数を実行するにはどうすればよいですか?
function emtr_shift_plan_form($form, &$form_state) {
ddl('build'); // log that this function is being called
$form['save'] = array(
'#type' => 'button',
'#submit' => array('emtr_shift_plan_form_ajax_submit'),
'#value' => 'Save',
'#ajax' => array(
'callback' => 'emtr_shift_plan_form_ajax_submit',
'wrapper' => 'postions',
),
'#id' => 'ajax-save-form-values',
);
$form['postions'] = array(
'#type' => ' container',
'#prefix' => '<div id="postions">',
'#suffix' => '</div>',
);
// code here to populate the positions container
}
function emtr_shift_plan_form_ajax_submit($form, &$form_state) {
ddl('ajax submit'); // log the ajax callback is being called
$form_state['rebuild'] = TRUE; // As the form has already been rebuilt at this point what effect can this have?!?
emtr_shift_plan_form_save($form, $form_state); // save the values
// This is the point at which I want the form to be rebuilt
return $form['positions'];
}
編集:
回避策として、を使用してajaxコールバックで2回目に手動でフォームを再構築できることを発見しましたが$form = drupal_rebuild_form('emtr_shift_plan_form', $form_state);
、フォームを2回構築するのは非効率的です。Ajaxリクエストごとにフォームを2回ビルドするのではなく、これらのイベントの順序を入れ替えることはできますか?
2
送信機能で「保存」を行う必要があります。Ajaxコールバックは通常、フォーム要素を返すだけです。これで問題が解決する可能性もあります。
—
2pha、2014