Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][Symfony2] Dodawanie danych do zasubmitowanego forma.
Forum PHP.pl > Forum > PHP > Frameworki
maziak
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.
Crozin
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.
maziak
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
Crozin
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)
maziak
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
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.