Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][SF2] Problem z walidacją daty
Forum PHP.pl > Forum > PHP > Frameworki
ssstrz
Staram się dodać pole z datą do encji. Mój formularz:
  1. class ProgressType extends AbstractType
  2. {
  3. /**
  4.   * @param FormBuilderInterface $builder
  5.   * @param array $options
  6.   */
  7. public function buildForm(FormBuilderInterface $builder, array $options)
  8. {
  9. $builder
  10. ->add('title')
  11. ->add('description')
  12. ->add('started', 'datetime')
  13. ->add('ended', 'datetime')
  14. ;
  15. }
  16.  
  17. /**
  18.   * @param OptionsResolverInterface $resolver
  19.   */
  20. public function setDefaultOptions(OptionsResolverInterface $resolver)
  21. {
  22.  
  23. $resolver->setDefaults(array(
  24. 'csrf_protection' => false,
  25. 'csrf_field_name' => '_dc',
  26. 'data_class' => 'CodeCats\PanelBundle\Entity\Progress'
  27. ));
  28. }
  29.  
  30. /**
  31.   * @return string
  32.   */
  33. public function getName()
  34. {
  35. return 'codecats_panelbundle_progress';
  36. }
  37. }


w encji pola daty i czasu opisane są:
  1. /**
  2.   * @var DateTime
  3.   *
  4.   * @ORM\Column(name="started", type="datetime")
  5.   */
  6. private $started;
  7.  
  8. /**
  9.   * @var DateTime
  10.   *
  11.   * @ORM\Column(name="ended", type="datetime")
  12.   */
  13. private $ended;


Akcja w kontrolerze:

  1. $progress = new Progress();
  2. $form = $this->createForm(new ProgressType(), $progress);
  3.  
  4. $store = array(
  5. 'title' => 'aa',
  6. 'ended' => new DateTime()
  7. );
  8. $form->submit($store);
  9.  
  10. if ($form->isValid()) {
  11. //$progress->setStarted(new DateTime());
  12. // $em->flush();
  13.  
  14. return new JsonResponse(array('success' => true));
  15. }


Jednak walidacja nie przechodzi ponieważ:
  1. 'ended' =>
  2. 0 => 'This value is not valid.',
  3. 'date' =>
  4. 'year' =>
  5. ),
  6. 'month' =>
  7. ),
  8. 'day' =>
  9. ),
  10. ),
  11. 'time' =>
  12. 'hour' =>
  13. ),
  14. 'minute' =>
  15. ),
  16. ),
  17. ),
  18. )

Jak zasymulować wprowadzene daty tak aby walidacja działała poprawnie?
toffiak
Pokaż reguły walidacji encji.
ssstrz
Nie dodawałem walidacji do encji.

Odświeżam temat, z tego co udało mi się dowiedzieć powinienem użyć Data Transformers http://symfony.com/doc/current/cookbook/fo...ansformers.html
Nie wiem co robię źle, dane dane pochodzące z PUT:
  1. {"id":5,"title":"aa","description":"44","started":"2014-03-18"}


  1. class StringToDateTimeTransformer implements DataTransformerInterface{
  2.  
  3. public function transform($value)
  4. {
  5.  
  6. if ( ! $value) {
  7. return null;
  8. }
  9.  
  10. $string = date_parse(date_format($value, "Y-m-d H:i:s"));
  11. if ( ! $string) {
  12. throw new TransformationFailedException(sprintf(
  13. 'Cant transform date to string!',
  14. $value
  15. ));
  16. }
  17.  
  18. return $string;
  19. }
  20.  
  21. public function reverseTransform($value)
  22. {
  23. if ( ! $value) {
  24. return new \DateTime("now");
  25. }
  26. $date = new \DateTime((string)$value["started"]);
  27.  
  28. return $date;
  29. }
  30. }


  1. $builder
  2. ->add('title')
  3. ->add('description')
  4. ->add(
  5. $builder->create('started', 'text')->addViewTransformer(new StringToDateTimeTransformer())
  6. )
  7. ;


akcja w kontrolerze:
  1. public function updateAction(Request $request, $id)
  2. {
  3. $fb = $this->get('fire_php');
  4.  
  5. $em = $this->getDoctrine()->getManager();
  6.  
  7. $progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find($id);
  8. $form = $this->createForm(new ProgressType(), $progress);
  9.  
  10. $form->handleRequest($request);
  11.  
  12. if ($form->isValid()) {
  13. $em->flush();
  14.  
  15. return new JsonResponse(array('success' => true));
  16. }
  17. $fb->log($this->getErrorMessages($form));
  18.  
  19.  
  20. return new JsonResponse(array('success' => false, 'errors' => $this->getErrorMessages($form)));
  21. }
pyro
Masz taki typ formularza jak datetime i tam masz nawet możliwośc wyboru widgeta jakiego użyć, łącznie z jego formatem. Nie ma potrzeby używać transformerów.

// EDIT

A Twój kod nie działa, bo używasz view transformera i starasz się zrobić ze stringa obiekt (dlatego pokazuje że nieprawidłowy typ), powinieneś użyć model transformera.
ssstrz
Tylko że ja nie mam wpływ na wygląd formularza (nie mam wpływu na frontend bo to robi ktoś inny przy pomocy frameworka do JS) Dane otrzymuję w postaci JSON i chcę zapisać je w bazie danych, mogę uzupełniać każde pole osobno ale chciałbym robić tak jak się powinno robić czyli na wzór $form->handleRequest, jak to wykonać w sf2?
pyro
A jak to się odnosi do mojej odpowiedzi? Przecież ja Ci nie mówię, żeby użyć choćby skrawka html/css/js. Przeczytaj jeszcze raz.
ssstrz
Chodzi o to?

  1. $builder
  2. ->add('title')
  3. ->add('description')
  4. ->add('started', 'datetime')
  5. ;
pyro
Tak
ssstrz
to teraz wrócilismy do 1 posta z tematu z tą różnicą że zamiast $form->submit używam $form->handleRequest .... validacja false

  1. public function updateAction(Request $request, $id)
  2. {
  3. $fb = $this->get('fire_php');
  4.  
  5. $em = $this->getDoctrine()->getManager();
  6.  
  7. $progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find($id);
  8. $fb->log($progress);
  9. $form = $this->createForm(new ProgressType(), $progress);
  10.  
  11. $form->handleRequest($request);
  12.  
  13. if ($form->isValid()) {
  14. $em->flush();
  15.  
  16. return new JsonResponse(array('success' => true));
  17. }
  18.  
  19. return new JsonResponse(array('success' => false, 'errors' => $this->getErrorMessages($form)));
  20. }
pyro
Niech zgadnę... zostawiłeś transformera?
ssstrz
Cytat(pyro @ 11.04.2014, 14:32:30 ) *
Niech zgadnę... zostawiłeś transformera?

tak... zakomentowanego.
  1. $builder
  2. ->add('title')
  3. ->add('description')
  4. // ->add('id')
  5. ->add('started', 'date')//datetime też sprawdzałem
  6. // ->add('ended', 'datetime')
  7. // ->add('started', 'text')
  8. // ->addViewTransformer(new StringToDateTimeTransformer())
  9. // ->add(
  10. // $builder->create('started', 'text')->addModelTransformer(new StringToDateTimeTransformer())
  11. // )
  12. ;
pyro
Ok a jak renderujesz to pole i jakie dane wprowadzasz?
ssstrz
Pisałem że dane otrzymuję z frameworka JS (extJS) więc ja tego nie renderuje - w assetsach mam pliki js które renderują formularz ale wypływ na formatowanie pola mam niewielki. Dostęp mam do danych np z firebuga metoda Put:
Kod
Source
{"id":5,"title":"aa","description":"aa","started":"2014-03-18"}


pyro
Aha... to wyrenederuj u siebie testowo i porównaj z polami z layoutu. To, że pole ma name="abc", nie znaczy, że będzie $form->add('abc'...)
ssstrz
Wyrenderowany formularz ma pola typu
  1. name="title"
i walidacja w ten sposób przechodz przechodzi. Po zmianie metody na put teść błędu walidacji to:
Kod
This form should not contain extra fields.
, Sf2 zgodnie z cookbook dodaje ukryte pole _method, i teraz walidacja (po wysłaniu formularza po wygenerowaniu) nie przechodzi z powodu w/w błędu
skowron-line
Jeżeli dodajesz extra pole to musisz dać
  1. 'mapped'=> false
  2. )

w ProcessType
ssstrz
ok było kilka błedów po drodze, ale rozwiązanie problemu sprowadza się do zmapowania pól z formularza ExtJS do pól formularza Symfony 2 czyli chciałbym aby pole:
nadesłane z ExtJS
Kod
title


formularz bindował jako:
Kod
progress[title]
skowron-line
W Propelu masz metode fromArray
  1. $sample->fromArray(array(
  2. 'Name' => 'skowron-line'
  3. )); // tu oczywiści podstawisz sobie dane które Ci przylecą

wiec przekazując obiekt do formularza masz dane.
  1. $this->createForm(new SampleType(), $sample);
ssstrz
a czy jest sposób aby form builder automatycznie mapował pole title na progress[title] czy muszę odbierać te parametry ręcznie?

.... update

wygląda na to że createNamed to rozwiązenie mojego problemu.

  1. $factory = Forms::createFormFactory();
  2.  
  3. $progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find($id);
  4.  
  5. $form = $factory->createNamed(null, new ProgressType(), $progress, array('method'=>'PUT'));
  6. $form->submit(json_decode($request->getContent(), true));
  7.  
  8. if ($form->isValid()) {
  9. $em->flush();
  10.  
  11. return new JsonResponse(array('success' => true));
  12. }
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.