Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inny][Symfony2] Dodawanie danych do zasubmitowanego forma.
maziak
post
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 17
Dołączył: 9.07.2007

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


Witam,

Mam następujący problem. Próbuję umożliwić użytkownikowi dodawanie pewnych obiektów do swojego konta. Elementy te znajdują się w tabeli która zawiera w sobie miedzy innymi ID konta którego dotyczy wpis.
Generuję formularz standardowo na podstawie Entity - ale z wyłączeniem pola ID usera. Jasnym jest, że nie mogę załączyć id usera jako pola hidden formularza, bo ktoś mógłby za pomocą prostego tampera requestów edytować konta innych użytkowników.
I tutaj pojawia się problem.

  1.  
  2. <?php
  3. public function add_objectAction(Request $request)
  4. {
  5. $entity = new Object();
  6. $entity->setProfileId($this->getUser()->getProfile()->getId());
  7.  
  8. $form = $this->createForm(new ObjectType(), $entity);
  9. $form->bind($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('show_myprofile'));
  17. }
  18.  
  19. return $this->render('FunFunBundle:Object:new_object.html.twig', array(
  20. 'entity' => $entity,
  21. 'form' => $form->createView(),
  22. ));
  23. }


Myślałem, że $entity->setProfileId($this->getUser()->getProfile()->getId()); załatwi sprawę, a tu się okazuje, że podczas bindowania formularza wszystkie dane w entity są czyszczone.

Zatep pytanie wprost brzmi : jak dodać ID użytkownika do danych zasubmitowanego forma, tak aby przeszedł przez walidację?

Bardzo mnie dziwi brak obsługi takiej typowej sytuacji w Symfony2, zatem podejrzewam, że może popełniam tutaj jakiś błąd logiczny i zabieram się za sprawę od złej strony.

Będę wdzięczny za podpowiedź jak to zrobić lub jak Wy rozwiązalibyście taką sytuację w swoim projekcie(dodawanie obiektów do tabeli skojarzonych z kontem usera poprzez ID), jeżeli robię to źle.

Ten post edytował maziak 22.12.2012, 11:35:31
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Co to za dziwny pomysł, by do encji przekazywać ID zamiast obiektu, który tworzy relację?
2. Pokazany przez Ciebie mechanizm jest w poprawny (poza punktem pierwszym czy bezpośrednim wykorzystaniem Doctrine w kontrolerze), obiekt "początkowy" przekazany do formularza nigdy nie jest czyszczony.
Go to the top of the page
+Quote Post
maziak
post
Post #3





Grupa: Zarejestrowani
Postów: 155
Pomógł: 17
Dołączył: 9.07.2007

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


Tak jak pisałem, prawdopodobne jest, że popełniam jakies błędy logiczne, gdyż jak chodzi o Symfony2 to dopiero zaczynam. Dzięki naturalnie za wytknięcie. Poprawie to.

Jednak odnośnie punktu 2, to wręcz przeciwnie. Jest czyszczony podczas bindowania.
https://github.com/symfony/symfony/issues/1341
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Podlinkowany problem dotyczy chyba jakiejś wczesnej wersji (alfy/bety?) symfony2, ponieważ jest sprzed 2 lat. Sf2 zostało wydane półtora roku temu.

Bardzo prosty przykład:
  1. <?
  2.  
  3. class Author {
  4. public $name;
  5. public $email = 'default@email.com';
  6. }
  7.  
  8. class AuthorType extends \Symfony\Component\Form\AbstractType {
  9. public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options)
  10. {
  11. $builder->add('name', 'text');
  12. }
  13.  
  14. public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
  15. {
  16. $resolver->setDefaults(array(
  17. 'data_class' => 'Test\Author',
  18. ));
  19. }
  20.  
  21. public function getName() {
  22. return 'test_author';
  23. }
  24. }
  1. <?
  2.  
  3. $author = new Author();
  4. $form = $this->createForm(new AuthorType(), $author);
  5.  
  6. if ($this->getRequest()->getMethod() === 'POST') {
  7. $form->bind($this->getRequest());
  8.  
  9. if ($form->isValid()) {
  10. var_dump($form->getData());
  11. }
  12. }
Wynikiem działania jest (po wypełnieniu jednoelementowego formularza):
Kod
object(Test\Author)[716]
  public 'name' => string 'test name' (length=9)
  public 'email' => string 'default@email.com' (length=17)
Go to the top of the page
+Quote Post
maziak
post
Post #5





Grupa: Zarejestrowani
Postów: 155
Pomógł: 17
Dołączył: 9.07.2007

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


Faktycznie, stary topic. Zasugerowałem się tym "Milestone 2.2" (dlaczego to tam jest wpisane jest to nie wiem?)

Niemniej problem pozostaje. Gdy używam var dumpa do pokazania jak wyglądają dane w formie, otrzymuję, że profileId jest równe NULL, nawet, gdy (tylko dla testu) wpisuję tam dane "na sztywno", zgodnie z poniższym :
  1. public function add_objectAction(Request $request)
  2. {
  3. $entity = new Object();
  4. $entity->setProfileId(1234); //tutaj wrzucam ID do encji NA SZTYWNO
  5.  
  6. $form = $this->createForm(new ObjectType(), $entity);
  7. $form->bind($request);
  8.  
  9. var_dump($form->getData()); // a tutaj już go nie ma (NULL)
  10. die;
  11.  
  12. // pozostalosc
  13. }


Pozostałe dane, które przesyłam w formularzu, są obecne.

Czy problem może dotyczyć tego, że faktycznie wpycham tam ID zamiast obiektu? Choć wydaje mi się, że powinno działać.
Dodam, że używam SF w wersji 2.1.



-----
EDIT:
Ok, udało mi się. Rozwiązanie znajduje się w poniższym temacie, na samym dole.
http://stackoverflow.com/questions/1340105...oesnt-supply-it

Ten post edytował maziak 25.12.2012, 16:04:30
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: 29.09.2025 - 15:33