Jak zweryfikować i przesłać formularz za pomocą AJAX?

12

Utworzyłem formularz internetowy za pomocą interfejsu API formularza. Korzystam z #AJAXopcji pola, aby dodać sprawdzanie poprawności AJAX do każdego pola.

Czy można zweryfikować i przesłać formularz za pomocą AJAX bez ponownego ładowania strony. Jeśli sprawdzanie poprawności się nie powiedzie, chcę wyświetlić komunikat o błędzie, a jeśli sprawdzanie poprawności się powiedzie, chcę pokazać komunikat (najlepiej w lightbox) i zresetować pola formularza.

Mój kod do tej pory:

$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',
    ),
);

funkcje zwrotne wyglądają następująco:

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) {
}

Ale nie jestem pewien, co powinno być w _handle_form_submitfunkcji, aby sprawdzić poprawność, a następnie albo zwrócić wiadomość, albo przesłać formularz i zresetować pola?

Camsoft
źródło

Odpowiedzi:

-2

Moduł przykłady ma ajax formularz, który można odnieść do jak wielu innych. Oto link do przykładu formularza ajax w repozytorium kodu, ale proponuję pobrać, aby i tak sprawdzić implementację.

rocketeerbkw
źródło
1
przepraszam - nie mogę znaleźć żadnych przykładów walidacji ajaxy w module przykładowym
ErichBSchulz
Tak, to jest nadęta odpowiedź. Właściwie nie widzę też żadnego potwierdzenia. Każde wywołanie zwrotne po prostu zwraca formularz.
AlxVallejo
2
Jak to jest akceptowana odpowiedź? Nie podaje nawet, gdzie szukać w podanym linku (a link i tak nie ma przykładu sprawdzania poprawności).
robinmitra
Nowy link do przykładu formularza ajax: cgit.drupalcode.org/examples/tree/ajax_example/…
Brentg
Uczyniłem moją odpowiedź wiki, ponieważ jest akceptowana, ale złej jakości
rocketeerbkw
11

Wiem, że to pytanie leży już od kilku lat, ale nie wydaje mi się, aby żadna inna odpowiedź naprawdę miała sens w przesłaniu formularza Drupal 7, więc postaram się to wyjaśnić.

Sinve twój formularz powinien również działać bez ajax, zgodnie z dobrą praktyką, twój handler przedkładania ajax nie powinien nic robić, tylko zwrócić formularz. Cała reszta powinna być w twojej walidacji i przesyłać funkcje.

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
źródło
prawdopodobnie Najlepsza odpowiedź
Andrew Kozoriz
Czy mówisz, że metody sprawdzania poprawności i przesyłania będą automatycznie wywoływane w celu wywołania zwrotnego AJAX na przycisku przesyłania? W jakiej kolejności są wywoływane metody?
Jeff
3

Myślę, że post autorstwa maxtorete z 17 października 2011 r. Wydaje się dawać pełniejszy przykład, używając obu form_validate()iform_submit()

(Jeszcze tego nie testowałem.)

Również odpowiedź Joshua Stewardsona na temat przepełnienia stosu ma dobry przykład działania:

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 zwraca uwagę, że komunikaty o błędach sprawdzania poprawności #ajax['wrapper']całkowicie zastępują element, dlatego oddzwonienie musi ponownie uzupełnić ten element podczas jego zastępowania.

ErichBSchulz
źródło
gdy ten link unieważnia, oznacza to, że pytanie nie jest już istotne!
ErichBSchulz
2
głosowanie w dół jest nieco surowe - nawet jeśli był to tylko link - był to link do odpowiedzi - nie tylko link do modułu, który nie ma odpowiedzi - w przeciwieństwie do przyjętej odpowiedzi !! w każdym razie podałem jakiś działający kod, gdy byłem przegłosowany.
ErichBSchulz
dzięki @ mbomb007 - naprawione teraz
ErichBSchulz
2

Zasadniczo sprawdzanie poprawności i obsługa przesyłania formularzy powinny odbywać się w zwykłych wywołaniach zwrotnych _validate () i _submit (). Chodzi o to, że formularze powinny nadal działać bez ajax.

Prawie jedyne, co powinny zrobić wywołania zwrotne #ajax, to zwrócić część formularza, która powinna zostać zastąpiona, zgodnie ze zdefiniowanym opakowaniem.

Berdir
źródło
2
Uważaj na swoje sformułowania. Oddzwonienie powinno zwrócić CAŁY FORMULARZ, przebudowany z form_state. Zwracająca się część formularza jest największym błędnym przekonaniem Drupala / AHAH. Zobacz katbailey.net/blog/ahah-drupal-may-it-one-day-live-its-acronym .
7
To pytanie dotyczy Drupala 7 ... AHAH już nie istnieje w Drupalu. W #ajaxfunkcji wywołania zwrotnego w Drupal 7 zwracana jest tylko część formularza, którą chcesz zastąpić.
Clive
1
@ChrisD. Jak wspomniał Clive, to jest Drupal 7 i mamy teraz całkiem niezłą platformę ajaxową, która pozwala robić różne fantazyjne rzeczy, takie jak zwracanie wielu oddzielnych części formularza i tak dalej.
Berdir
@Clive Natknąłem się na inny problem związany z ajaxem drupal.stackexchange.com/a/142316/19205, w którym autor wspomniał, że „formularz musi zostać skompilowany ponownie po zmianie item_count”, również dla d7. Mylę się z tym, które stwierdzenie jest prawidłowe (bez kłótni, kto ma rację :-)). Czy możesz podać jakieś informacje na ten temat?
Kiringing
0

Istnieją dwa sposoby

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) Przykładowy moduł http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402

Drock
źródło
Nie wiem, jak dokładna jest twoja odpowiedź, ale jej formatowanie zdecydowanie wymaga ulepszenia (jeśli nie chcesz, aby moderatorzy ją usunęli). W razie potrzeby sprawdź stronę pomocy lub po prostu użyj niektórych przycisków edytora wysiwyg, aby przynajmniej oznaczyć kod jako ... kod.
Pierre.Vriens,
Niepoprawnie sformatowany kod nie jest powodem do usunięcia odpowiedzi. To wymaga tylko użytkownika z uprawnieniami do edycji, aby to naprawić.
kiamlaluno
Nadchodzę, zdesperowany, szukając rozwiązania, zaledwie 2 lata po tej odpowiedzi kliknąłem link prowadzący do nieistniejącego drzewa / gałęzi. Proszę nie używać linków w odpowiedziach ani wklejać treści w momencie pisania.
MacK
0

W moim przypadku użycie submittypu powoduje, że formularz zawsze się przesyła, więc zmieniłem go na „ buttonz” #ajaxokreślonym. Następnie musiałem przeprowadzić weryfikację w wywołaniu zwrotnym ajax.

Zrobiłem okienko Ctools; Nie wiem, czy to ma znaczenie.

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;
}
użytkownik1359
źródło