Przyszło mi pracować na gotowym projekcie w Symfony 2.2, bez możliwości aktualizacji.
Niestety nie mam żadnego doświadczenia w SF2, a zaistniała potrzeba, aby zmodyfikować formularz.
Aktualnie mam w formularzu pole typu choice w którym atrybut choices wypełniam płaską tablicą z województwami
$states = [ '1' => 'Śląskie', '2' => 'Mazowieckie', etc.. ];
Całość jest przechowywana w bazie danych(model doctrine), który automatycznie zaznacza elementy wybrane(podczas edycji), a lista województw jest wpisana na sztywno w configu.
Jako zadanie mam stworzyć możliwość wyboru miast dla każdego województwa. Miasta przechowywane będą w bazie danych i zawierać będą: ID(auto increment), ID_WOJEWÓDZTWA, ID_MIASTA(Numeracja od 1 dla każdego województwa), NAZWA_MIASTA.
Nie mogłem znaleźć gotowego rozwiązania w internecie(które nadawałoby się do moich potrzeb) do budowy "drzewa" checkboxów.
Wizualnie w mojej głowie prezentuje się następujący obraz(wizualny):
Kod
- [ ] Śląskie
-- [ ] Katowice
-- [ ] Dąbrowa Górnicza
-- [ ] Sosnowiec
-- [ ] Będzin
- [ ] Mazowieckie
-- [ ] Warszawa
-- [ ] Radom
-- [ ] Płock
-- [ ] Ostrołęka
-- [ ] Katowice
-- [ ] Dąbrowa Górnicza
-- [ ] Sosnowiec
-- [ ] Będzin
- [ ] Mazowieckie
-- [ ] Warszawa
-- [ ] Radom
-- [ ] Płock
-- [ ] Ostrołęka
Wpadłem na pomysł, aby dobudować do formularza drugie pole typu choice w którym będę przechowywał tablicę miast
$cities = [ '1' => [ '1' => 'Katowice', '2' => 'Dąbrowa Górnicza', '3' => 'Sosnowiec', '4' => 'Będzin' ], //Śląskie '2' => [ '1' => 'Warszawa', '2' => 'Radom', '3' => 'Płock', '4' => 'Ostrołęka' ], //Mazowieckie etc.. ];
W tpl, gdzie renderuje widok, przekazałem do generowania pola states, pole cities i nadpisałem tpl pola states. W nadpisanej tpl pola odtworzyłem strukturę generowania checkboxa dla województwa. Pod spodem wrzuciłem generowanie przekazanego pola cities, do którego przekazałem "id" województwa. Pole to również zostało nadpisane w tpl, tak aby obsłużyć grupowanie i wyświetlić miasta jedynie z grupy o danym "id" województwa. Do generowania pola używam funkcji form_widget i niestety w tym wypadku użycie dla każdego województwa jest niemożliwe, gdyż tej funkcji można użyć wyłącznie raz dla danego pola formularza.
Trochę psełdokodu:
// FORM // 'choices' => $states, // tablica powyżej.. 'expanded' => true, 'multiple' => true )); 'choices' => $cities, // tablica powyżej.. 'expanded' => false, 'multiple' => true )); // TPL wyświetlana przez kontroler ... inne pola ... {% form_theme form.states 'states.html.twig' %} {% form_widget(form.states, {'cities': form.cities}) %} ... inne pola ... // TPL states.html.twig {% block choice_widget %} {% for choice in form %} {% form_widget(choice) %} {% form_label(choice) %} <div class="cities"> {% form_theme cities 'states.html.twig' %} {% form_widget(cities, {'state': choice.vars.value}) %} </div> {% endfor %} {% endblock %}
Tak jak wspomniałem wyżej, użycie {% form_widget(cities, {'state': choice.vars.value}) %} w pętli for wykonuje się tylko raz. Czytając posty innych ludzi dowiedziałem się, iż przy pomocy tej funkcji można wygenerować "widget" tylko raz. Dokładnie tak też się dzieje u mnie, działa wyłącznie dla pierwszego województwa, dla kolejnych już nie.
Tak więc mój pomysł okazał się kompletnie nie trafiony. Mimo prób z różnymi "hot fixami" do resetowania formularza itd, nie udało się otrzymać oczekiwanego efektu.
Mam nadzieję, że ktoś dotrwał do końca i będzie w stanie poradzić mi jakieś rozwiązanie. Nie oczekuję gotowego kodu, potrzebuję jakiejś drogi, którą podążać. Być może istnieje już jakieś gotowe rozwiązanie dla tej wersji symfony(sic!). Za wszystkie informacje serdecznie dziękuję!
Pozdrawiam!