W mojej aplikacji mam kilka pól formularza z wieloma opcjami. Problem, którego doświadczyłem, jest podobny do this question: pobieranie i analizowanie wszystkich opcji przy każdym ładowaniu strony jest drogie (Twig renderuje wszystkie opcje w kółko, bez możliwości buforowania po stronie klienta). Ten problem spowodował, że utworzyłem sposób na przesłanie opcji przez AJAX do przeglądarki. Dość proste podejście:Tworzenie "Ajaxified" Typ pola formularza
- Uzyskaj wszystkie opcje (klucz-wartość) za pośrednictwem AJAX (na przykład pobierając /countries.json) i pamięć podręczną, jeśli to możliwe. (w tym przypadku nie jest bardzo prawdopodobne, że nazwy krajów zmieniają się bardzo często).
- Użyj selectize, select2 lub podobnej wtyczki do wstawienia opcji do DOM.
- Zapraszamy na szybszą Formularza :-)
Aby zapobiec Symfony z kwerend wszystkie opcje (nie jest to konieczne: oni ładowanie za pośrednictwem AJAX) Dodałem setMaxResults(0)
do QueryBuilder
gdy formularz jest ładowany (dodając opcję przez kontroler). Tak, to kludge. Wysyłając formularz, nadal będzie wykonywał zapytanie, ponieważ musi sprawdzić, czy wybrana opcja istnieje (i sprawdzić ograniczenia).
Chciałbym utworzyć custom Form Field Type, który dodaje tę funkcję do bieżącego EntityType
: nie ładuj opcji podczas renderowania formularza, ale wciąż sprawdź, czy wybrana opcja istnieje. Znalazłem manyexamples powiązane z dynamically modifying a form, ale nie znalazłem przykłady związane z modyfikowaniem tylko jednego pola formularza, niezależnie od jego rodzica formularza.
Jak utworzyć typ pola formularza? Jaki jest dobry punkt wyjścia? Przedłużyć EntityType
, ChoiceType
lub inne podejście?
Używam już Symfony 3.1, więc używanie lazy loading of form choices (Nowości w Symfony 3.2) nie będzie problemem. Nie jestem pewien, czy ta nowa funkcja jest powiązana z moim problemem.
Prawdopodobny duplikat [Przedłużanie EntityType, aby umożliwić dodatkowe wybory zestaw z połączeń AJAX] (http://stackoverflow.com/questions/30178424/extending-entitytype-to-allow-extra-choices-set-with-ajax-calls) – Alsatian