wiedz, czy przebudowujesz cały formularz, czy tylko jego część, i odpowiednio zawiń formularz elementem div , który ma atrybut ID , którego użyjesz w definicji #ajax elementu wyzwalającego jako „opakowanie”. W tym celu użyj atrybutów #prefix i #suffix $form['#prefix'] = '<div id="myform-ajax-wrapper">'; $form['#suffix'] = '</div>';
. Należy również pamiętać, że jeśli masz niestandardowy szablon formularza, aby NIE renderował prefiksu i sufiksu w tym przypadku ( {{ form|without('#prefix', '#suffix') }}
), w przeciwnym razie zostaną one renderowane dwukrotnie - przez szablon, a także przez opakowanie motywu formularza. Nie można temu zapobiec, ustawiając #theme_wrappers na pustą tablicę, ponieważ szablon formularza zawiera rzeczywisty element HTML formularza.
w swoim handlerze ajax prześlij, zwróć całą formę lub jej część, którą zapakowałeś i chcesz ją odbudować ( return $form
lub return $form['myelement']
). Możesz dodatkowo użyć komend ajax zamiast po prostu zwracać strukturę formularza, ale jest to bardziej zaawansowana funkcja.
przechowuj każdą wartość w pamięci stanu formularza do momentu przesłania formularza. Zrób to w handlerach wysyłających ( $form_state->set('somevalue', $form_state->getValue('somevalue'))
) i zawsze wywołuj, $form_state->setRebuild()
jeśli nie przesyłasz ostatecznego formularza. Wolę mieć niestandardowe procedury obsługi przesyłania, ale posiadanie większej logiki w podstawowej procedurze przesyłania jest również w porządku.
zawsze używaj #name
atrybutu na przycisku, który wykonuje przesyłanie, a jeśli masz tylko jeden formularz, użyj obsługi $for_state->getTriggeringElement()['#name']
modułu obsługi do wykrycia, który element przesłał formularz.
jeśli używasz „trigger_as” w definicji #ajax, na przykład, jeśli chcesz przesłać formularz z elementem select, zawsze używaj tej samej definicji #ajax jak na przycisku. Z mojego doświadczenia wynika, że jest to wymagane - choć nie zostało to określone w dokumentacji.
używanie #limit_validation_errors
może być czasem bardzo trudne i ustalenie, dlaczego formularz nie działa, może zająć sporo czasu, więc używaj go ostrożnie (jest to dobre do izolowania błędów formularza tylko na elementach, które faktycznie przebudowujesz, tak aby Twój kod nie wpływa na inne części formularza).
zawsze używaj przycisków do przesłania formularza, a jeśli chcesz mieć coś wymyślnego, np. wybierz element wyzwalający, użyj opcji „trigger_as” w konfiguracji #ajax i ukryj prawdziwy przycisk za pomocą klasy „js-hide”, aby uzyskać dobry interfejs użytkownika.
w definicji formularza pobierz wartości domyślne z pamięci stanu formularza, jeśli istnieją, lub przypisz je do pamięci, jeśli nie istnieją. W przeciwnym razie formularz nie będzie działał poprawnie.
nie używaj $ this ani czegokolwiek innego, do czego nie masz dostępu z zewnątrz, w przeciwnym razie spowoduje to uszkodzenie ajax. zawsze używaj statycznych programów obsługi ajax.
kiedy w końcu przesyłasz formularz, w zależności od tego, czy masz (nie) niestandardową procedurę obsługi przesyłania formularza dla ajax, wyłącz przebudowywanie formularza przez wywołanie $form_state->setRebuild(FALSE)
.
możesz użyć wywołań :: shorthand w elemencie ajax ajax ( $element['#ajax']['callback'] = '::ajaxFormRebuild';
i $element['#submit'] = [['::ajaxFormSubmitHandler'];
).
wywołanie zwrotne ajax służy wyłącznie do zwrócenia przebudowanej formy lub poleceń ajax. Nigdy nie zwracaj zmienionej formy (tj. Nie zmieniaj tablicy formularzy w tym wywołaniu zwrotnym).