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?

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ę.


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;
}

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.


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.


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


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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.