Witam,
uczę się aktualnie symfony, stąd postanowiłem napisać aplikację, oczywiście napotkałem na problem:
podejrzewam, że gdzieś coś źle założyłem, dlatego nie działa, stąd proszę o pomoc:
Chcę stworzyć formularz składający się z dwóch nie zależnych entity:
Replies
Topics

Dane z formularza powinny zostać pobrane po czym zapisane do bazy danych (form -> topics -> zapis do bazy, form2 -> replies -> zapis do bazy)
Wersja 1, która obecnie pobiera dane tylko z drugiego formularza (nie mam pomysłu jak zmienić by pobierało z obydwu):
controller:
  1. /*
  2.   * @Route("/createNewTopic/{catId}", name="topic_create", defaults={"_locale" = "en"}))
  3.   * @Template()
  4.   */
  5. public function createNewTopicAction(Request $request, $catId)
  6. {
  7. //przygotowanie formularzy
  8. $form = $this->createForm(new CreateNewTopicType(), new Topics);
  9. $form2 = $this->createForm(new CommentArticleType(), new Replies);
  10.  
  11. // po kliknięciu button'a
  12. if ('POST' === $request->getMethod()) {
  13. dump($form->getData()); // zwraca null
  14. dump($form2->getData()); //zwraca poprawnie dane
  15. die;
  16. }
  17.  
  18. //przekazanie formularza do template
  19. return array(
  20. 'form' => $form->createView(),
  21. 'form2' => $form2->createView(),
  22. );
  23. }
  24.  

Entity\Replies.php:
http://wklejto.pl/236566

Entity\Topics.php
http://wklejto.pl/236567

\Form\Type\CommentArticleType.pgp
  1. <?php
  2.  
  3. namespace CoreBundle\Form\Type;
  4.  
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  8.  
  9. class CommentArticleType extends AbstractType
  10. {
  11. public function buildForm(FormBuilderInterface $builder, array $options)
  12. {
  13. $builder
  14. ->add(
  15. 'replyContent', 'textarea', array(
  16. 'required' => true,
  17. 'label' => 'replies.article.add.textarea',
  18. 'translation_domain' => 'messages',
  19. )
  20. )
  21. ->add(
  22. 'addNewReply', 'submit', array(
  23. 'label' => 'replies.article.add.button',
  24. 'translation_domain' => 'messages',
  25. 'attr' => array(
  26. 'class' => ' success'
  27. )
  28. )
  29. )->getForm()
  30. ;
  31.  
  32. }
  33.  
  34. public function getName()
  35. {
  36. return 'Replies';
  37. }
  38.  
  39. public function setDefaultOptions (OptionsResolverInterface $resolver)
  40. {
  41. $resolver->setDefaults(array(
  42. 'data_class' => 'CoreBundle\Entity\Replies',
  43. ));
  44. }
  45. }

\Form\Type\CreateNewTopicType.php
  1. <?php
  2.  
  3. namespace CoreBundle\Form\Type;
  4.  
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  8. use CoreBundle\Form\Type\CommentArticleType;
  9. use CoreBundle\Entity\Topics;
  10.  
  11. class CreateNewTopicType extends AbstractType
  12. {
  13. public function buildForm(FormBuilderInterface $builder, array $options)
  14. {
  15. $builder
  16. ->add(
  17. 'topicSubject', 'text', array(
  18. 'required' => true,
  19. 'label' => 'create.new.topic.text',
  20. 'translation_domain' => 'messages',
  21. )
  22. )->getForm()
  23. ;
  24.  
  25. }
  26.  
  27. public function getName()
  28. {
  29. return 'TopicCreate';
  30. }
  31.  
  32. public function setDefaultOptions (OptionsResolverInterface $resolver)
  33. {
  34. $resolver->setDefaults(array(
  35. 'data_class' => 'CoreBundle\Entity\Topics',
  36. ));
  37. }
  38. }


Wersja 2:
Polega ona na stworzeniu dodatkowego modelu, który będzie łączył ze sobą Replies oraz Topics:

Tutaj oczywiście błąd nierozpoznawania funkcji (nie zbyt wiem jak zadeklarować poprawnie, gdyż dziedziczyć dwóch klas nie jestem w stanie):
Neither the property "X" nor one of the methods "getX()", "X()", "isXt()", "hasXt()", "__get()" exist and have public access in class "CoreBundle\Model\CreateNewTopicList".
X to kolejno funkcje do których nie może się odwołać

controller:

  1. public function createNewTopicAction(Request $request, $catId)
  2. {
  3. $form = $this->createForm(new CreateNewTopicType(), new CreateNewTopicList());
  4.  
  5. return array(
  6. 'form' => $form->createView(),
  7. );
  8. }

\Fomr\Type\CreateNewTopicType.php
  1. class CreateNewTopicType extends CommentArticleType
  2. {
  3. public function buildForm(FormBuilderInterface $builder, array $options)
  4. {
  5. $builder
  6. ->add(
  7. 'topicSubject', 'collection', array(
  8. 'type' => new Topics(),
  9. )
  10. ->getForm()
  11. ;
  12. }
  13.  
  14. public function getName()
  15. {
  16. return 'createNewTopicList';
  17. }
  18.  
  19. public function setDefaultOptions (OptionsResolverInterface $resolver)
  20. {
  21. $resolver->setDefaults(array(
  22. 'data_class' => 'CoreBundle\Model\CreateNewTopicList',
  23. ));
  24. }
  25. }


\Model\CreateNewTopicList.php
  1.  
  2. namespace CoreBundle\Model;
  3.  
  4. use CoreBundle\Entity\Topics;
  5. use CoreBundle\Entity\Replies;
  6.  
  7.  
  8. class CreateNewTopicList
  9. {
  10. /**
  11.   *
  12.   * @var obj
  13.   */
  14. private $topics;
  15.  
  16. /**
  17.   *
  18.   * @var obj
  19.   */
  20. private $replies;
  21.  
  22. public function getTopics()
  23. {
  24. return $this->topics;
  25. }
  26.  
  27. public function setTopics()
  28. {
  29. $this->topics = new Topics;
  30. }
  31.  
  32. public function getReplies()
  33. {
  34. return $this->replies;
  35. }
  36.  
  37. public function setReplies()
  38. {
  39. $this->topics = new Topics;
  40. }
  41. }


Jeszcze trzecie pytanie, którą wersję preferowalibyście?