Wie kann ich ein Formular mit AJAX validieren und abschicken?

11

Ich habe ein Webformular mit der Formular-API erstellt. Ich verwende die #AJAXFeldoption, um jedem Feld eine AJAX-Validierung hinzuzufügen.

Ist es möglich, das Formular mit AJAX zu validieren und zu senden, ohne die Seite neu zu laden? Wenn die Validierung fehlschlägt, möchte ich eine Fehlermeldung anzeigen. Wenn die Validierung erfolgreich ist, möchte ich eine Meldung anzeigen (idealerweise in einem Leuchtkasten) und die Formularfelder zurücksetzen.

Mein Code bisher:

$form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#default_value' => '',
    '#maxlength' => '128',
    '#required' => TRUE,
    '#ajax' => array(
        'callback' => '_validate_name',
        'wrapper' => 'name-error-icon-container',
        'method' => 'html',
        'effect' => 'none',
        'progress' => array(
            'message' => NULL,
        ),
    ),
);

$form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
    '#ajax' => array(
        'callback' => '_handle_form_submit',
        'effect' => 'fade',
    ),
);

Rückruffunktionen sehen folgendermaßen aus:

function _validate_name($form, $form_state) {

    if ($form_state['values']['name'] != '') {
    $output = 'OK';
    }
    else {
      $output = 'Enter a value';
    }

   return $output;

}

function _handle_form_submit($form, $form_state) {
}

Ich bin mir jedoch nicht sicher, was in der _handle_form_submitFunktion zum Überprüfen und anschließenden Zurückgeben einer Nachricht oder zum Senden eines Formulars und zum Zurücksetzen von Feldern enthalten sein soll.

Camsoft
quelle

Antworten:

-2

Das Beispielmodul verfügt über ein Ajax-Formular, auf das Sie und viele andere verweisen können. Hier ist ein Link zum Ajax-Formularbeispiel im Code-Repository, aber ich empfehle das Herunterladen, um die Implementierung trotzdem selbst anzusehen.

rocketeerbkw
quelle
1
Entschuldigung - Ich kann keine Beispiele für Ajaxy-Validierung im Beispielmodul finden
ErichBSchulz
Ja, das ist genau dort eine aufgeblähte Antwort. Ich sehe dort auch keine Validierung. Jeder Rückruf gibt einfach das Formular zurück.
AlxVallejo
2
Wie ist das die akzeptierte Antwort? In dem bereitgestellten Link wird nicht einmal angegeben, wo gesucht werden soll (und der Link enthält ohnehin kein Validierungsbeispiel).
Robinmitra
Neuer Link für das Ajax-Formularbeispiel: cgit.drupalcode.org/examples/tree/ajax_example/…
Brentg
Ich habe meine Antwort zu einem Wiki gemacht, da es akzeptiert wird, aber von schlechter Qualität
rocketeerbkw
11

Ich weiß, dass diese Frage schon seit ein paar Jahren herumliegt, aber ich glaube nicht, dass eine der anderen Antworten wirklich den Sinn der Einreichung des Drupal 7 Ajax-Formulars hat, also werde ich versuchen, es zu erklären.

Da Ihr Formular auch ohne den Ajax funktionieren sollte, sollte Ihr Ajax-Submit-Handler nichts anderes tun, als das Formular zurückzugeben. Alles andere sollte in Ihrer Validierungs- und Übermittlungsfunktion enthalten sein.

function ex_form($form, $form_state) {
  $form['name'] = array(
    '#type' => 'textfield',
     '#title' => t('Name'),
     '#default_value' => '',
     '#maxlength' => '128',
     '#required' => TRUE,
  );

  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => 'Submit',
   '#ajax' => array(
     'callback' => 'ex_form_ajax_handler',
     'effect' => 'fade',
   ),
  );
}

function ex_form_submit(&$form, &$form_state) {
  // Submit logic - runs when validation is ok
  // You can alter the form here to be just a markup field if you want.
}

function ex_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function ex_form_ajax_handler(&$form, &$form_state) {
  return $form;
}
OWast
quelle
wahrscheinlich beste Antwort
Andrew Kozoriz
Wollen Sie damit sagen, dass die Validierungs- und Übermittlungsmethoden automatisch für einen AJAX-Rückruf auf einer Übermittlungsschaltfläche aufgerufen werden? In welcher Reihenfolge werden die Methoden aufgerufen?
Jeff
3

Ich denke, der Beitrag von maxtorete am 17. Oktober 2011 scheint ein vollständigeres Beispiel zu geben, wenn sowohl form_validate()als auch verwendet werdenform_submit()

(Ich habe es noch nicht getestet.)

Auch Joshua Stewardsons Antwort beim Stapelüberlauf hat ein gutes Beispiel:

function dr_search_test_form($form, &$fstate) {

  $form['wrapper'] = [
    '#markup' => '<div id="test-ajax"></div>',
  ];

  $form['name'] = [
    '#type'     => 'textfield',
    '#required' => TRUE,
    '#title'    => 'Name',
  ];

  $form['submit'] = [
    '#type'  => 'submit',
    '#value' => 'Send',
    '#ajax'  => [
      'callback' => 'dr_search_test_form_callback',
      'wrapper'  => 'test-ajax',
      'effect'   => 'fade',
    ],
  ];

  return $form;
}

function dr_search_test_form_callback($form, &$fstate) {

  return '<div id="test-ajax">Wrapper Div</div>';
}

function dr_search_test_form_validate($form, &$fstate) {

  form_set_error('name', 'Some error to display.');
}

Joshua weist darauf hin, dass Validierungsfehlermeldungen das #ajax['wrapper']Element vollständig ersetzen, sodass Ihr Rückruf dieses Element erneut ersetzen muss, wenn Sie es ersetzen.

ErichBSchulz
quelle
Wenn dieser Link ungültig wird, ist dies ein Zeichen, dass die Frage nicht mehr relevant ist!
ErichBSchulz
2
Down Vote ist ein bisschen hart - auch wenn es nur ein Link war - es war ein Link zur Antwort - nicht nur ein Link zu einem Modul, das die Antwort nicht hat - im Gegensatz zur akzeptierten Antwort !! Trotzdem habe ich während des Downvotes einen funktionierenden Code bereitgestellt.
ErichBSchulz
danke @ mbomb007 - jetzt behoben
ErichBSchulz
2

Im Allgemeinen sollten Validierung und Formularübermittlung in den üblichen Rückrufen _validate () und _submit () erfolgen. Die Idee ist, dass Formulare immer noch ohne Ajax funktionieren sollten.

Das einzige, was die #ajax-Rückrufe tun sollten, ist, den Teil des Formulars zurückzugeben, der gemäß dem definierten Wrapper ersetzt werden soll.

Berdir
quelle
2
Seien Sie vorsichtig mit Ihrer Formulierung. Der Rückruf sollte THE WHOLE FORM zurückgeben, das aus form_state neu erstellt wurde. Die Rückgabe eines Teils des Formulars ist das größte Missverständnis von Drupal / AHAH. Siehe katbailey.net/blog/ahah-drupal-may-it-one-day-live-its-acronym .
7
Diese Frage bezieht sich auf Drupal 7 ... AHAH existiert in Drupal nicht mehr. In einer #ajaxRückruffunktion in Drupal 7 geben Sie nur den Teil des Formulars zurück, den Sie ersetzen möchten.
Clive
1
@ ChrisD. Wie Clive erwähnte, ist dies Drupal 7 und wir haben jetzt ein ziemlich schönes Ajax-Framework, das es ermöglicht, alle Arten von ausgefallenen Dingen wie die Rückgabe mehrerer separater Formteile usw. zu erledigen.
Berdir
@Clive Ich bin auf ein anderes Ajax- Problem gestoßen , drupal.stackexchange.com/a/142316/19205, bei dem der Autor erwähnte, dass "das Formular erneut erstellt werden muss, nachdem items_count geändert wurde", was auch für d7 gilt. Ich bin verwirrt, welche Aussage richtig ist (ohne zu streiten, wer Recht hat :-)). Könnten Sie bitte einige Informationen dazu teilen?
Kiranking
0

Es gibt zwei Möglichkeiten

1)

function abc_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function abc_form_ajax_handler(&$form, &$form_state) {
  return $form;
}

2) Beispielmodul http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402

Drock
quelle
Ich weiß jetzt nicht, wie genau Ihre Antwort ist, aber die Formatierung muss definitiv verbessert werden (wenn Sie nicht möchten, dass sie von Moderatoren gelöscht wird). Überprüfen Sie bei Bedarf die Hilfeseite oder verwenden Sie einfach einige der Schaltflächen des Wysiwyg-Editors, um Ihren Code zumindest als ... Code zu markieren.
Pierre.Vriens
Nicht korrekt formatierter Code ist kein Grund, eine Antwort zu löschen. Es ist lediglich ein Benutzer mit Bearbeitungsberechtigung erforderlich, um das Problem zu beheben.
Kiamlaluno
Hier komme ich, verzweifelt, auf der Suche nach einer Lösung, nur 2 Jahre nach dieser Antwort, klickte ich auf einen Link, der mich zu einem nicht existierenden Baum / Ast führt. Bitte verwenden Sie keine Links zu den Antworten oder fügen Sie den Inhalt zum Zeitpunkt des Schreibens ein.
MacK
0

In meinem Fall führte die Verwendung eines submitTyps dazu, dass das Formular immer gesendet wurde, und ich änderte es in ein buttonmit #ajaxangegebenem. Dann musste ich meine Validierung im Ajax-Rückruf durchführen.

Ich machte eine Werkzeugscheibe; Ich weiß nicht, ob das dazu beiträgt.

function mymodule_form($form, &$form_state) {
  ...
  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Subscribe'),
    '#ajax' => array(
      'callback' => '_mymodule_ajax',
    ),
  );
  return $form;
}

function _mymodule_ajax($form, &$form_state) {
  if ( ! valid_email_address($form_state['values']['email']) ) {
    form_set_error($form, t('Please enter a valid email address.'));
  } else {
    $form = array(
      '#markup' => t('You have subscribed.'),
    );
  }
  return $form;
}
user1359
quelle