Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][SF]Post w xxxTYpe jak odebrać?
Forum PHP.pl > Forum > PHP > Frameworki
basso
Witam,
ostatnio męczę jedną rzecz w wątku obok. Zakładam ten wątek gdyż problem jak widać jest większy niż by się wydawało. Chciałem w FormType wyświetlić po prostu dane które wysłałem => wydawało by się to dziecinnie proste, bo przecież 99% programistów tworzy dynamiczne formularze czy to ajaxowe czy po przeładowaniu, a jednak takie proste nie jest.

W moim przykładzie poniżej używałem już wszystkiego chyba co posiada Internet. Od dokumentacji : http://symfony.com/doc/current/cookbook/fo...dification.html po przez blogi http://php-and-symfony.matthiasnoback.nl/ czy http://sf.khepin.com/2012/10/user-dependen...ms-in-symfony2/ i inne cuda na kiju.

Odnalazłem jednak jeden artykuł w którym jest mowa o błędzie Symfonii https://github.com/symfony/symfony/issues/6128 .

Pytanie zatem brzmi => czy ktoś wie w jaki sposób wyświetlić w buildForm dane wysłane z mojego formularza ? Ja to obszedłem, że w atrybuty html wrzuciłem requesta czy te dane i śmiga... ale tak to wyglądać nie może bo tak to się nie robi.



  1. lass PagesType extends AbstractType
  2. {
  3. public function buildForm(FormBuilderInterface $builder, array $options)
  4. {
  5.  
  6. $builder
  7.  
  8. ->add('title')
  9. ->add('lead');
  10. ...
  11.  
  12.  
  13. $builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event) {
  14. // respond to the event, modify data, or form elements
  15.  
  16. $data = $event->getData();
  17. $form = $event->getForm();
  18.  
  19. print_r($data);
  20.  
  21.  
  22.  
  23. });
  24.  
destroyerr
To jeszcze proszę dopowiedz czy Twój problem też dotyczy formularza zagnieżdżonego bo z poprzedniego wątku to wcale nie wynika.
Kolejna sprawa:
Cytat
Chciałem w FormType wyświetlić po prostu dane które wysłałem

Skoro chcesz odebrać dane to przede wszystkim nie jest za to odpowiedzialne zdarzenie POST_SET_DATA. Raczej któreś z *_BIND, a skoro chcesz modyfikować formularz to pozostaje Ci tylko PRE_BIND.
basso
No ten listener to jedno ze sposób próby odebrania danych i wyświetlenia...

Nie jest to zagnieżdżony formularz... całość wygląda tak:

Kontroler wygenerowany przez CRUD...

  1. /**
  2.   * Creates a new Pages entity.
  3.   *
  4.   */
  5. public function createAction(Request $request)
  6. {
  7. $entity = new Pages();
  8. $form = $this->createForm(new PagesType(), $entity );
  9. $form->bindRequest($request);
  10.  
  11. if ($form->isValid()) {
  12. $em = $this->getDoctrine()->getManager();
  13. $em->persist($entity);
  14. $em->flush();
  15.  
  16. return $this->redirect($this->generateUrl('pages_show', array('id' => $entity->getId())));
  17. }
  18.  
  19. return $this->render('BackendCmsBundle:Pages:new.html.twig', array(
  20. 'entity' => $entity,
  21. 'form' => $form->createView(),
  22. ));
  23. }
  24.  



I nieszczęsny PagesType()

  1. class PagesType extends AbstractType
  2. {
  3. public function buildForm(FormBuilderInterface $builder, array $options)
  4. {
  5.  
  6. $builder
  7.  
  8. ->add('title')
  9. ->add('lead')
  10. ->add('description')
  11. ->add('showDate')
  12. ->add('createdAt')
  13. ->add('slug')
  14. ->add('status')
  15. ->add('subcategory') ==> to też będzie jako zapytanie, tylko najpierw muszę wydrzeć wysłane id category które jest poniżej.
  16.  
  17. ->add('category', 'entity',array(
  18. 'class' => 'Backend\CmsBundle\Entity\PagesCategory',
  19. 'multiple' => false,
  20. 'expanded' => false,
  21.  
  22. 'query_builder' => function(EntityRepository $er) use ($category)
  23. {
  24. return $er->createQueryBuilder('c')
  25. ->where('c.id > :category')
  26. ->setParameter('category', $category);
  27. }));
  28.  
  29. }
  30.  
  31.  



No i zatrzymałem się na tym, że chciałem zbudować zapytanie dla subcategory przy użyciu wysłanej category, ale sobie myślę, a najpierw wyświetlę id category co wysłał formularz... i się zaczęło.

Także w ten sposób mam formularz. Nic nie zagnieżdżam cokolwiek masz przez to na myśli (wrzucanie nowych pól?) . Dzięki za pomoc.
destroyerr
Cytat
Nic nie zagnieżdżam cokolwiek masz przez to na myśli (wrzucanie nowych pól?) .

Link do githuba który wrzuciłeś opisywał problem zagnieżdżonych formularzy. Skoro takich nie masz to Ciebie ten bug (o ile faktycznie jest) nie dotyczy.
basso
No nie wiem co to jest zagnieżdżony formularz... mogę to sobie tylko wyobrazić jako dodawanie pól formularza do istniejącego już formularza w strukturę DHTML przez js (czy to ajax czy poprzez listenera po przeładowaniu).
A kojarzysz jak tu odebrać to ID? Mogę zrobić to po swojemu... chociaż wolałbym zrobić to prawidłowo, dlatego męczę smile.gif

destroyerr
Cytat
No nie wiem co to jest zagnieżdżony formularz

Nie odczuwam przyjemności w przepisywaniu dokumentacji więc musisz tam sam zajrzeć.

Cytat
A kojarzysz jak tu odebrać to ID?

Nie napisałem tego przypadkiem w drugim poście tego tematu? Zamiast zdarzenia POST_SET_DATA skorzystaj z PRE_BIND i wtedy w $event->getData() masz tablicę z danymi wysłanymi do formularza. Włącznie z id, które jest Tobie potrzebne.
basso
ZROBIŁEM... dzięki.

Ale... metody z dokumentacji:
PRE_SET_DATA
POST_SET_DATA
PRE_BIND
BIND
POST_BIND

, nie działają tak jak to jest opisane. I uważajcie na to exclamation.gif!
Szczególnie POST_BIND co po ludzku wydaje się, dołączenie po ;/ to nie jest w ogóle ono wywoływane ;/
Tak samo PRE_BIND => no przecież ona powinna zadziałać przed wrzuceniem danych do formularza => działa PO smile.gif Bo ja w swoim formularzu tez mam ->add('subcategory',"choice",array("empty_value"=>"Najpierw wybierz kategorię") , i nadpisuje mi te pole... no ale nie powinno => no ale działa jakby to powiedzieć "Jak Żyd, na lewą stronę" smile.gif


  1.  
  2. <?php
  3.  
  4. namespace Backend\CmsBundle\Form;
  5.  
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\FormBuilderInterface;
  8. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  9.  
  10.  
  11. use Backend\CmsBundle\Form\EventListener\AddNameFieldSubscriber;
  12. use Symfony\Component\Form\FormEvents;
  13. use Symfony\Component\Form\FormEvent;
  14. use Symfony\Component\Form\FormBuilder;
  15. use Doctrine\ORM\EntityRepository;
  16.  
  17. use Symfony\Component\HttpFoundation\Request;
  18.  
  19. class PagesType extends AbstractType
  20. {
  21. public function buildForm(FormBuilderInterface $builder, array $options)
  22. {
  23.  
  24. $builder
  25. ->add('title')
  26. ->add('lead')
  27. ->add('description')
  28. ->add('showDate')
  29. ->add('createdAt')
  30. ->add('slug')
  31. ->add('status')
  32. ->add('gallery')
  33. ->add('category', 'entity',array(
  34. 'class' => 'Backend\CmsBundle\Entity\Pagescategory',
  35. 'multiple' => false,
  36. 'expanded' => false,
  37. 'empty_value' => 'Wybierz kategorię',
  38.  
  39. 'query_builder' => function(EntityRepository $er)
  40. {
  41. return $er->createQueryBuilder('c')
  42. ->orderBy('c.id', 'ASC');
  43. }))
  44.  
  45. ->add('subcategory',"choice",array("empty_value"=>"Najpierw wybierz kategorię") );
  46.  
  47.  
  48.  
  49. $builder->addEventListener(FormEvents::PRE_BIND, function(FormEvent $event)
  50. {
  51. $data = $event->getData();
  52. $form = $event->getForm();
  53. $category=$data['category'];
  54. $form->add('subcategory', 'entity',array(
  55. 'class' => 'Backend\CmsBundle\Entity\PagesSubcategory',
  56. 'multiple' => false,
  57. 'expanded' => false,
  58.  
  59. 'query_builder' => function(EntityRepository $er) use ($category)
  60. {
  61. return $er->createQueryBuilder('c')
  62. ->where('c.id = :category')
  63. ->setParameter('category', $category);
  64. }));
  65. });
  66.  
  67. }
  68.  
  69. public function setDefaultOptions(OptionsResolverInterface $resolver)
  70. {
  71. $resolver->setDefaults(array(
  72. 'data_class' => 'Backend\CmsBundle\Entity\Pages'
  73. ));
  74. }
  75.  
  76. public function getName()
  77. {
  78. return 'backend_cmsbundle_pagestype';
  79. }
  80. }
  81.  
destroyerr
Nie zgodzę się. U mnie wszystkie zdarzenia działają poprawnie. Mały przykład jak wygląda przepływ:
Kod
[Controller] Create Form
[Form] Pre set data event
[Form] Post set data event
[Controller] Bind form
[Form] Pre bind event
[Form] Bind event
[Form] Post bind event
basso
A no to tak to ja sobie też mogę smile.gif... weź proszę zrób sobie przykład post_bind => zobaczymy czy CI się wywoła.... też tak myślałem jak Ty.
Z twojego przepływu wynika, że post bin event powinien działać zawsze, bynajmniej po zbudowaniu formularza... nie powinno być problemu ze zmianą czegoś w formularzu ... a jednak , nie działa smile.gif
destroyerr
Cytat
A no to tak to ja sobie też mogę ... weź proszę zrób sobie przykład post_bind => zobaczymy czy CI się wywoła.... też tak myślałem jak Ty.

Ale ja sobie tego nie wypisałem ot tak. To są wyświetlone poszczególne kroki. Minimalny kod na potrzeby tego przykładu.

Cytat
Z twojego przepływu wynika, że post bin event powinien działać zawsze, bynajmniej po zbudowaniu formularza... nie powinno być problemu ze zmianą czegoś w formularzu ... a jednak , nie działa

Działa zawsze po zbindowaniu. W drugim poście tego wątku napisałem, że w zdarzeniu POST_BIND za późno jest już na modyfikacje (to samo jest w dokumentacji).

Jeśli chcesz rozwiązania problemu, to wrzuć minimalny kod, który łatwo da się uruchomić.
basso
Dzięki wielkie smile.gif
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.