Utworzyłem formularz internetowy za pomocą interfejsu API formularza. Korzystam z #AJAX
opcji 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_submit
funkcji, aby sprawdzić poprawność, a następnie albo zwrócić wiadomość, albo przesłać formularz i zresetować pola?
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.
źródło
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:
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.źródło
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.
źródło
#ajax
funkcji wywołania zwrotnego w Drupal 7 zwracana jest tylko część formularza, którą chcesz zastąpić.Istnieją dwa sposoby
1)
2) Przykładowy moduł http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402
źródło
W moim przypadku użycie
submit
typu powoduje, że formularz zawsze się przesyła, więc zmieniłem go na „button
z”#ajax
określonym. Następnie musiałem przeprowadzić weryfikację w wywołaniu zwrotnym ajax.Zrobiłem okienko Ctools; Nie wiem, czy to ma znaczenie.
źródło