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:
/* * @Route("/createNewTopic/{catId}", name="topic_create", defaults={"_locale" = "en"})) * @Template() */ public function createNewTopicAction(Request $request, $catId) { //przygotowanie formularzy $form = $this->createForm(new CreateNewTopicType(), new Topics); $form2 = $this->createForm(new CommentArticleType(), new Replies); // po kliknięciu button'a if ('POST' === $request->getMethod()) { dump($form->getData()); // zwraca null dump($form2->getData()); //zwraca poprawnie dane die; } //przekazanie formularza do template 'form' => $form->createView(), 'form2' => $form2->createView(), ); }
Entity\Replies.php:
http://wklejto.pl/236566
Entity\Topics.php
http://wklejto.pl/236567
\Form\Type\CommentArticleType.pgp
<?php namespace CoreBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class CommentArticleType extends AbstractType { { $builder ->add( 'required' => true, 'label' => 'replies.article.add.textarea', 'translation_domain' => 'messages', ) ) ->add( 'label' => 'replies.article.add.button', 'translation_domain' => 'messages', 'class' => ' success' ) ) )->getForm() ; } public function getName() { return 'Replies'; } public function setDefaultOptions (OptionsResolverInterface $resolver) { 'data_class' => 'CoreBundle\Entity\Replies', )); } }
\Form\Type\CreateNewTopicType.php
<?php namespace CoreBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use CoreBundle\Form\Type\CommentArticleType; use CoreBundle\Entity\Topics; class CreateNewTopicType extends AbstractType { { $builder ->add( 'required' => true, 'label' => 'create.new.topic.text', 'translation_domain' => 'messages', ) )->getForm() ; } public function getName() { return 'TopicCreate'; } public function setDefaultOptions (OptionsResolverInterface $resolver) { 'data_class' => 'CoreBundle\Entity\Topics', )); } }
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:
public function createNewTopicAction(Request $request, $catId) { $form = $this->createForm(new CreateNewTopicType(), new CreateNewTopicList()); 'form' => $form->createView(), ); }
\Fomr\Type\CreateNewTopicType.php
class CreateNewTopicType extends CommentArticleType { { $builder ->add( 'type' => new Topics(), ) ->getForm() ; } public function getName() { return 'createNewTopicList'; } public function setDefaultOptions (OptionsResolverInterface $resolver) { 'data_class' => 'CoreBundle\Model\CreateNewTopicList', )); } }
\Model\CreateNewTopicList.php
namespace CoreBundle\Model; use CoreBundle\Entity\Topics; use CoreBundle\Entity\Replies; class CreateNewTopicList { /** * * @var obj */ private $topics; /** * * @var obj */ private $replies; public function getTopics() { return $this->topics; } public function setTopics() { $this->topics = new Topics; } public function getReplies() { return $this->replies; } public function setReplies() { $this->topics = new Topics; } }
Jeszcze trzecie pytanie, którą wersję preferowalibyście?