Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF][SF2] SF2.2 Custom choice, formsy - województwo + miasta
untorched
post
Post #1





Grupa: Zarejestrowani
Postów: 318
Pomógł: 76
Dołączył: 27.12.2011
Skąd: Dąbrowa Górnicza

Ostrzeżenie: (0%)
-----


Witajcie,
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
  1. $states = [
  2. '1' => 'Śląskie',
  3. '2' => 'Mazowieckie',
  4. etc..
  5. ];


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


Wpadłem na pomysł, aby dobudować do formularza drugie pole typu choice w którym będę przechowywał tablicę miast
  1. $cities = [
  2. '1' => [
  3. '1' => 'Katowice',
  4. '2' => 'Dąbrowa Górnicza',
  5. '3' => 'Sosnowiec',
  6. '4' => 'Będzin'
  7. ], //Śląskie
  8. '2' => [
  9. '1' => 'Warszawa',
  10. '2' => 'Radom',
  11. '3' => 'Płock',
  12. '4' => 'Ostrołęka'
  13. ], //Mazowieckie
  14. etc..
  15. ];


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:
  1. // FORM //
  2.  
  3. $builder->add('states', 'choice', array(
  4. 'choices' => $states, // tablica powyżej..
  5. 'expanded' => true,
  6. 'multiple' => true
  7. ));
  8.  
  9. $builder->add('cities', 'choice', array(
  10. 'choices' => $cities, // tablica powyżej..
  11. 'expanded' => false,
  12. 'multiple' => true
  13. ));
  14.  
  15.  
  16. // TPL wyświetlana przez kontroler
  17.  
  18. ... inne pola ...
  19.  
  20. {% form_theme form.states 'states.html.twig' %}
  21. {% form_widget(form.states, {'cities': form.cities}) %}
  22.  
  23. ... inne pola ...
  24.  
  25. // TPL states.html.twig
  26.  
  27. {% block choice_widget %}
  28. {% for choice in form %}
  29. {% form_widget(choice) %}
  30. {% form_label(choice) %}
  31.  
  32. <div class="cities">
  33. {% form_theme cities 'states.html.twig' %}
  34. {% form_widget(cities, {'state': choice.vars.value}) %}
  35. </div>
  36.  
  37. {% endfor %}
  38. {% 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!
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:55