Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF2][SF]Post w xxxTYpe jak odebrać?
basso
post 16.05.2013, 15:05:30
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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.  
Go to the top of the page
+Quote Post
destroyerr
post 16.05.2013, 15:52:01
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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.

Ten post edytował destroyerr 16.05.2013, 16:31:28
Go to the top of the page
+Quote Post
basso
post 17.05.2013, 08:27:32
Post #3





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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.

Ten post edytował basso 17.05.2013, 08:29:19
Go to the top of the page
+Quote Post
destroyerr
post 17.05.2013, 08:38:34
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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.
Go to the top of the page
+Quote Post
basso
post 17.05.2013, 09:32:18
Post #5





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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

Go to the top of the page
+Quote Post
destroyerr
post 17.05.2013, 11:53:56
Post #6





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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.
Go to the top of the page
+Quote Post
basso
post 17.05.2013, 13:13:07
Post #7





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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.  


Ten post edytował basso 17.05.2013, 13:24:10
Go to the top of the page
+Quote Post
destroyerr
post 17.05.2013, 13:52:21
Post #8





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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
Go to the top of the page
+Quote Post
basso
post 17.05.2013, 18:46:35
Post #9





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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
Go to the top of the page
+Quote Post
destroyerr
post 17.05.2013, 19:27:48
Post #10





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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ć.
Go to the top of the page
+Quote Post
basso
post 19.05.2013, 14:05:57
Post #11





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


Dzięki wielkie smile.gif
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 08:32