Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Formularz w kolekcji
Forum PHP.pl > Forum > PHP > Frameworki
athabus
Hej kolejny odcinek mojego cyklu "poznaję Symfony". Tym razem napotkałem problem z formualrzami. Problem w brzydki sposób rozwiązałem, ale zastanawiam się jak to zrobić "Symfony way".

Otóż mam formularza w w nim zagnieżdżona kolekcję. Dajmy na to
Auto i w nim kolekcję części, z jakich auto się składa.

Jako, że części do aut jest bardzo dużo, to musiałem zrezygnować z standardowego pola formularza "Entity" na rzecz ajaxowego autocomplete. U mnie działa to tak, że po wybrania w autocomplete danej części np. "sprzęgło marki xyz", id tej części ustawiane jest w ukrytym polu id_czesci.

Problem jaki napotykam, to że w takim wypadku po wysłaniu formularza, element kolekcji, który powstaje jest niepełny - tak na prawdę nie zawiera obiektu część, a samo id i zapis do bazy wyrzuca błąd. Obejście tego problemu jakie zastosowałem, to odczytanie id w kontrolerze i przypisanie obiektu do kolekcji. Ale to rozwiązanie jest raczej niezbyt eleganckie.

Pytanie zatem brzmi, czy mogę w jakiś sposób na poziomie formularza "wysłać" obiekt nie wyświetlając selecta typu "entity", tak żeby obiekt był kompletny i nie wymagał dodatkowy operacji bazodanowych w kontrolerze?

Na razie rozwiązanie jakie przychodzi mi do głowy, to wyświetlenie w ukrytym divie pola czesc (select typu entity) i za pomocą event listnerów wczytanie obiektu po wysyłce formularza - ale to w sumie równie brzydkie jak obsługa problemu w kontrolerze.
ziolo
Ja to mam tak:

  1. class EntityToIdTransformer implements DataTransformerInterface
  2. {
  3.  
  4.  
  5. /**
  6.   * @var ObjectManager
  7.   */
  8. protected $objectManager;
  9.  
  10. /**
  11.   * @var string
  12.   */
  13. protected $class;
  14.  
  15. public function __construct(ObjectManager $objectManager, $class)
  16. {
  17. $this->objectManager = $objectManager;
  18. $this->class = $class;
  19. }
  20.  
  21. public function transform($entity)
  22. {
  23. if (null === $entity) {
  24. return;
  25. }
  26. return $entity->getId();
  27. }
  28.  
  29.  
  30. public function reverseTransform($id)
  31. {
  32. if (!$id) {
  33. return null;
  34. }
  35. $entity = $this->objectManager
  36. ->getRepository($this->class)
  37. ->find($id);
  38. if (null === $entity) {
  39. throw new TransformationFailedException();
  40. }
  41. return $entity;
  42. }
  43.  
  44.  
  45. }


  1. $builder->get('czesc')->addModelTransformer(new EntityToIdTransformer($this->doctrine->getManager(), 'VenorBundle:Czesc'));
athabus
Dziękuję Ci bardzo - Data Transforers - muszę o tym poczytać, ale wygląda, że to dokładnie to co jest mi potrzebne.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.