Nic z tego nie działa na mnie. Funkcja ajax ajaxa formularza wciąż wywołuje bezpośrednio funkcję zwrotną, pomijając sprawdzanie poprawności, przesyłając, a także uniemożliwiając wielokrotne kliknięcie przycisku. Komunikaty sprawdzania poprawności NIE są wyświetlane. Dosłownie skopiowałem i wkleiłem kod Joshua Stewardsona i nie zadziałało.
Fakt, że ten przypadek użycia jest tak trudny i nieudokumentowany, jest bardzo denerwujący. Dla mnie wydaje się to najbardziej podstawowym żądaniem dla interfejsu API formularza AJAX. Okay, rozwiązałem moją frustrację, na rozwiązanie.
Oto, co zrobiłem, aby to zadziałało. Czuje się zjadliwy i opóźniony. Zerwie się również, jeśli na jednej stronie znajduje się wiele wystąpień formularza, ale było to najlepsze, co mogłem zrobić. Jeśli ktokolwiek może rzucić światło na to PROSZĘ, proszę!
Zasadniczo, musisz zamienić cały formularz na siebie wewnątrz swojego wywołania zwrotnego i ręcznie przedłożyć wszystkie ustawione komunikaty do obiektu formularza. Zrób to, deklarując, że opakowanie jest identyfikatorem twojego formularza (zostanie ono przerwane, jeśli na jednej stronie znajduje się wiele wystąpień formularza, ponieważ identyfikator zostanie zaktualizowany).
function productsearchbar_savesearch_form($form, &$form_state) {
$form["wrapper"] = array("#markup" => "<div class='inline-messages'></div>");
$form["name"] = array(
"#type" => "textfield",
"#required" => true,
"#title" => "Name"
);
$form["submit"] = array(
"#type" => "submit",
"#value" => "Send",
"#ajax" => array(
"callback" => "productsearchbar_savesearch_form_callback",
"wrapper" => "productsearchbar-savesearch-form",
"effect" => "fade"
)
);
return $form;
}
function productsearchbar_savesearch_form_callback($form, &$form_state) {
$messages = theme('status_messages');
if($messages){
$form["wrapper"] = array("#markup" => "<div class='inline-messages'>$messages</div>");
}
return $form;
}
function productsearchbar_savesearch_form_validate($form, &$form_state) {
if ($form_state['values']['name'] == '') {
form_set_error('', t('Name field is empty!'));
}
}
function productsearchbar_savesearch_form_submit($form, &$form_state) {
drupal_set_message(t('Your form has been saved.'));
}
Czy pozytywna walidacja jest ignorowana? Robiłem to dziesiątki razy, a walidacja nigdy, nigdy nie została zignorowana (chyba, że specjalnie powiedziałem Drupalowi, aby zignorował je za pomocą '# limit_validation_errors'). Również komunikaty o błędach są automatycznie ładowane do elementu 'wrapper', więc po pierwszym rozwiązaniu powinien on po prostu spaść na miejsce. Czy mógłbyś opublikować trochę swojego kodu? – Clive
@ Clive Właśnie zrobiłem kolejną próbną wersję, te same wyniki. Poniżej forma: funkcja dr_search_test_form (postać $, & $ fstate) { $ forma [ "owinięcie"] = tablica ( "#markup" => "
" ); $ form ["name"] = array ( "#type" => "textfield", "#required" => true, "#title" => "Name" ); $ form [ "submit"] = array ( "#type" => "submit", "#VALUE" => "Wyślij", "#ajax" => array ( "callback" => „dr_search_test_form_callback ", " opakowanie "=>" test-ajax ", " efekt "=>" zanikanie " ) ); return $ form; } –funkcja dr_search_test_form_callback ($ form, & $ fstate) { return "sadsadas"; } } funkcja dr_search_test_form_validate ($ form, & $ fstate) { form_set_error ("name", "Niektóre błędy do wyświetlenia."); } –