Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony]Formularz w kolekcji
athabus
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
ziolo
post
Post #2





Grupa: Zarejestrowani
Postów: 82
Pomógł: 20
Dołączył: 17.01.2009
Skąd: Kraków

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


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'));
Go to the top of the page
+Quote Post
athabus
post
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Dziękuję Ci bardzo - Data Transforers - muszę o tym poczytać, ale wygląda, że to dokładnie to co jest mi potrzebne.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 04:58