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:
/*
* @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
}
//przekazanie formularza do template
'form' => $form->createView(),
'form2' => $form2->createView(),
);
}
Entity\Replies.php:
http://wklejto.pl/236566Entity\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
{
public function buildForm
(FormBuilderInterface
$builder, array $options) {
$builder
->add(
'replyContent', 'textarea', array( 'required' => true,
'label' => 'replies.article.add.textarea',
'translation_domain' => 'messages',
)
)
->add(
'addNewReply', 'submit', array( 'label' => 'replies.article.add.button',
'translation_domain' => 'messages',
'class' => ' success'
)
)
)->getForm()
;
}
public function getName()
{
return 'Replies';
}
public function setDefaultOptions (OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array( '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
{
public function buildForm
(FormBuilderInterface
$builder, array $options) {
$builder
->add(
'topicSubject', 'text', array( 'required' => true,
'label' => 'create.new.topic.text',
'translation_domain' => 'messages',
)
)->getForm()
;
}
public function getName()
{
return 'TopicCreate';
}
public function setDefaultOptions (OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array( '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
{
public function buildForm
(FormBuilderInterface
$builder, array $options) {
$builder
->add(
'topicSubject', 'collection', array( 'type' => new Topics(),
)
->getForm()
;
}
public function getName()
{
return 'createNewTopicList';
}
public function setDefaultOptions (OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array( '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?