it-swarm.com.de

Verwenden von form_set_error im Submit-Handler

Ich habe ein mehrstufiges Formular und sende bei jeder Übermittlung ausgefüllte Felder an eine externe API, die Daten über den nächsten Schritt des Formulars zurückgibt.

Das Problem ist, wenn ich form_set_error im Submit-Handler verwende, wird form_storage gelöscht und das Formular auf die erste Seite zurückgesetzt.

Hier ist ein beliebiges Beispiel;

function example_form($form, &$form_state) {
  if(!isset($form_state['step'])){
    $form_state['step'] = 1;
  }
  $form['test'] = array('#markup' => '<p>Step: ' . $form_state['step'] . '</p>');

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'go'
  );
  return $form;
}

function example_form_submit($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
  if($form_state['step'] > 5){
    form_set_error('test', 'error');
    return;
  }
  $form_state['step']++;
}

Erstellen Sie also ein Formular mit nur einem Textblock, in dem die Schrittnummer angezeigt wird, und einer Schaltfläche zum Senden, mit der Sie zum nächsten Schritt gelangen. Bis Sie den 5. Schritt überschritten haben, sollte an diesem Punkt ein Fehler auftreten.

Aus irgendeinem Grund unterbricht dies bei meinen Tests die Schrittzahl und führt Sie bei einem Fehler zurück zu Schritt 2.

das Verschieben des form_set_error in den Formularrückruf oder in einen validierten Rückruf behebt das Problem, aber es wäre sauberer, wenn ich es im Submit-Handler aufrufen könnte.

6
Simon

Für den Fall, dass es für andere nützlich ist, habe ich eine unbefriedigende Arbeit;

Speichern Sie den Fehler in form_state und suchen Sie ihn im Formularrückruf.

function example_form($form, &$form_state) {
  // if we had an error in the submit handler, trigger it now
  if(isset($form_state['error']) && $form_state['error']){
    form_set_error('test', 'test');
  }
  if(!isset($form_state['step'])){
    $form_state['step'] = 1;
  }
  $form['test'] = array('#markup' => '<p>Step: ' . $form_state['step'] . '</p>');

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'go'
  );
  return $form;
}


function example_submit($form, &$form_state) {

  $form_state['rebuild'] = TRUE;
  if($form_state['step'] > 5){
    //store error and return before the step is increased
    $form_state['error'] = true;
    return;
  }


  $form_state['step']++;
}
5
Simon

form_set_error() darf nicht in einem Submit-Handler verwendet werden. Es ist Teil des Validierungsworkflows. Aus den Dokumenten:

Wenn ein Validierungsfehler erkannt wird, ruft der Validator form_set_error () auf, um anzugeben, welches Element geändert werden muss, und gibt eine Fehlermeldung aus. Dies führt dazu, dass die Formular-API die Formularübermittlungshandler nicht ausführt und stattdessen das Formular dem Benutzer mit den entsprechenden Elementen erneut anzeigt, die mit einer CSS-Klasse 'error' gerendert wurden (standardmäßig rot dargestellt). .

Hervorhebung von mir.

Der Punkt ist, form_set_error() zu verwenden, um zu verhindern, dass der Prozess jemals den Submit-Handler erreicht.

Vergessen Sie nicht, dass Sie überprüfen , ob der aktuelle Schritt größer als 5 ist oder nicht. Diese Logik muss in einem Validierungshandler ausgeführt werden. :) :)

3
Clive

der Formularsatzfehler löscht Ihre Eingabe. Verwenden Sie diese Funktion daher hier nicht. Verwenden Sie stattdessen die Datei drupal_set_message. Es ist nicht perfekt, aber es wird funktionieren.

0
function example_form_validate($form, &$form_state) {
}

Verwenden Sie diese Funktion, um Ihre Daten beim Absenden eines Formulars zu überprüfen

0
Sibiraj PR