Ich habe ein Formular mit einer Schaltfläche, die beim Drücken einen anderen Teil des Formulars über eine Ajax-Anfrage neu erstellt.
Wenn Sie auf die Schaltfläche klicken, wird das Formular neu erstellt. Anschließend wird mein Ajax-Rückruf aufgerufen, der die Werte aus dem Formular speichert und dann einen Teil des Formulars zurückgibt.
Das Problem ist, dass das Formular VOR meinem Rückruf neu erstellt wird, wodurch die Werte gespeichert werden und daher die Erstellung des Formulars geändert wird.
Wenn ich ein zweites Mal auf die Schaltfläche Ajax klicke, funktioniert dies ordnungsgemäß, ebenso wie die Werte aus der vorherigen Ajax-Anforderung beim Erstellen des Formulars.
Wie kann ich meine Rückruffunktion ausführen, bevor das Formular neu erstellt wird?
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'];
}
BEARBEITEN:
Als Problemumgehung habe ich festgestellt, dass es möglich ist, das Formular ein zweites Mal im Ajax-Rückruf mit manuell neu zu erstellen $form = drupal_rebuild_form('emtr_shift_plan_form', $form_state);
, aber es scheint ineffizient zu sein, das Formular zweimal zu erstellen. Kann ich die Reihenfolge dieser Ereignisse einfach vertauschen, anstatt das Formular zweimal pro Ajax-Anforderung erstellen zu lassen?
Antworten:
Ich weiß, dass diese Frage 3 Jahre alt ist, aber ich bin auf sie gestoßen, als ich nach einem ähnlichen Problem gesucht habe.
Sie müssen Ihren Ansatz ändern, damit dies funktioniert. Die Reihenfolge der Vorgänge beim Senden der AJAX-Anforderung lautet wie folgt:
$form_state
Variablen.Ich habe Ihren Code ein wenig überarbeitet, um dies zu demonstrieren.
Hoffe, das bringt etwas Licht für jemanden.
quelle
Sie könnten versuchen, so etwas anders zu machen und Rückruf anders zu machen und zu sehen, ob es hilft.
quelle