Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF][SF2] SF2.2 Custom choice, formsy - województwo + miasta
untorched
post 10.11.2016, 00:39:12
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
Pilsener
post 10.11.2016, 09:06:59
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Formularze to słaba strona symfony, jak trzeba zrobić coś niestandardowego to szkoda czasu na kombinowanie.
1. Nie powinny to być pola typu choice, tylko entity - chyba, że lista miast jest nie w bazie, tylko "z palca" w jakimś .csv etc. - ale tu znów pytanie, po co używac ORMa i formularzy, skoro wszystko robimy ręcznie?
2. Jeśli województwo nie ma być zapisywane, to nie ma sensu dodawać go do formularza (z tego co zrozumiałem tylko wybrane miasta mają być zapisane)
3. Listę czekboksów polecam wyrenderować ręcznie, pobrać dane z formularza lub encji i mniej lub bardziej używać widżetów (w zależności od potrzeb w zakresie HTML)

Renderować dane z forma można na wiele stron i sposobów, pierwszy lepszy:

Kod
{% for item in form.items %}
{{ form_row(item) }}
//...


Można też już w kontrolerze "obrobić" dane z forma i połączyć je z listą województw.

Czyli reasumując:
1. Najpierw spróbuj zrobić sam formularz, wyświetlić go w najprostszej postaci i sprawdzić, czy się wszystko zapisuje.
2. Potem customowo wyrenderować czekboksy, grupując je wg miast.

Ten post edytował Pilsener 10.11.2016, 09:09:45
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 28.04.2024 - 01:35