Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][SF2][Symfony2] Formularz z data_class
Forum PHP.pl > Forum > PHP > Frameworki
c3zi
Witam,

Mam problem z formularzem w Symfony2, do którego "podpiętą" mam encję. Dodam, iż moja aplikacja jest serwerem RESTowym, także nie zawsze są przesyłane wszystkie pola formularza.

  1. $form = $this->formFactory->create(new MessageType(), $message, array('method' => $method));
  2. $form->submit($parameters);


Dziwne jest to, że obiekt $message (moja encja) posiada pole active i jest ono ustawione na true przed submit(), natomiast na false po submit(). $parameters w tym wypadku nie zawiera pola $active, natomiast ja oczekuję, iż wartość domyślna będzie brana z Entity (w tym wypadku jest to obiekt $message). Wiem, że można użyć w submit() drugiego parametru i ustawić go na false, aczkolwiek niewiele mi to daje, gdyż pojawiają się inne problemy.
Poniżej zamieszczę klasę formularza, Entity oraz kod walidujący (oczywiście wszystko w wersji skróconej).


  1. Entity\Message.php
  2.  
  3. class MessateType
  4.  
  5. ......
  6. /**
  7.   *
  8.   * @var type boolean
  9.   * @ORM\Column(name="cancelFlag", type="boolean")
  10.   */
  11. private $active = true;
  12. ......
  13.  
  14. Form\MessageType.php
  15.  
  16. class MessageType extends AbstractType
  17. ....
  18.  
  19. public function buildForm(FormBuilderInterface $builder, array $options)
  20. {
  21. $builder
  22. ....................
  23. ->add('active')
  24. ;
  25. }
  26.  
  27.  
  28. public function setDefaultOptions(OptionsResolverInterface $resolver)
  29. {
  30. $resolver->setDefaults(array(
  31. 'data_class' => 'IRT\MyBundle\Entity\Message',
  32. 'csrf_protection' => false,
  33. ));
  34. }
  35.  
  36. public function getName()
  37. {
  38. return 'message';
  39. }
  40.  
  41.  
  42. // Controller/Service
  43. // $message->getActive() == true
  44. $form = $this->formFactory->create(new MessageType(), $message);
  45. $form->submit($parameters);
  46. // $message->getActive() == false
  47. // $form->getData()->getActive() == false


Oczekuję tego, iż jeżeli nie podam pola active (a jest to możliwe) to formularz zwróci mi wartość domyślną z entity.
semafor1985
wrzuć w formularz domyślną wartość dla pola active

  1. ->add('active','typ_pola',array('data'=>true))


ustawienie wartości domyślnej w entity raczej nic nie daje, bo to wypełniony formularz zapełnia encje danymi które dostał
a w tym przypadku jeżeli pola nie ma to pewnie dostaje false
c3zi
  1. ->add('active', 'checkbox', array('data' => true))


Niestety to nie pomaga. Znalazłem inne rozwiązanie, dodanie listener'a (https://github.com/adrienbrault/symfony-hateoas-sandbox/blob/master/src/AdrienBrault/ApiBundle/Form/EventListener/ReplaceNotSubmittedValuesByDefaultsListener.php).
Aby to zadziałało tak jak chcę muszę ustawić flagę: $ignoreRequiredFields na false. Czy to jest optymalne rozwiązanie dla tego przypadku? smile.gif

Dodanie:
  1. ->add('active', 'checkbox', array('required' => false))

Rozwiązuje również mój problem. Oczywiście cały czas bazuje na implementacji eventa preBind.
semafor1985
dość dziwne, że nie działa, skoro wysyłasz pole active z domyślną wartością true, entity powinno zapisać tą wartość
jeżeli Twój sposób działa to tylko się cieszyć, mam jeszcze inne rozwiązanie. W klasie formularza możesz dodać:

  1. use Symfony\Component\Form\FormEvents;
  2. use Symfony\Component\Form\FormEvent;
  3.  
  4. class ...
  5. {
  6. public function buildForm(FormBuilderInterface $builder, array $options)
  7. {
  8. $builder->addEventListener(FormEvents::POST_SUBMIT,
  9. function (FormEvent $event)
  10. {
  11. $data = $event->getData();
  12. $data->setAvtive(true);
  13. $event->setData($data);
  14. },
  15. 255);
  16.  
  17. $builder
  18. ->add...
  19. }


wtedy jeszcze przed validacją formularza pole active ustawione będzie na true

(rozwiązania które podaje są dla s2 > 2.3)
c3zi
Z tym, że ja chcę, aby domyślnie (jeżeli ktoś nie poda "active") było brane z Entity i tak mój przykład działa. U Ciebie widzę, że "twardo" ustawiasz true.
Jeżeli required ustawię na "false" to widzę, że faktycznie przy niepodaniu wartości jest ona brana z domyślnych ustawień w entity ;-)

Anyway thx!!
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.