Symfony 2 передает переменную классу формы для динамического создания скрытого поля в форме - PullRequest
3 голосов
/ 30 сентября 2011

Я работаю над инструментом для ведения блогов на платформе Symfony 2, где пост может иметь много комментариев.У меня установлены отношения один-ко-многим между постами и комментариями в соответствующих организациях.Когда сообщение отображается на главной странице, я хочу, чтобы под ним была форма комментария, где пользователи могут оставлять комментарии.Чтобы оставить комментарий, я должен передать скрытое поле в форме для postID, но у меня возникают проблемы с этим.Ниже весь мой код ..

Контроллер:

<?php

namespace Issh\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Issh\MainBundle\Form\Post\CommentForm;
use Issh\MainBundle\Form\Post\PostForm;
use Issh\MainBundle\Entity\IsshPost;
use Issh\MainBundle\Entity\IsshComment;

class HomeController extends Controller
{

    public function indexAction()
    {
        return $this->render('IsshMainBundle:Home:index.html.php');
    }

    public function postAction()
    {
        $em = $this->get('doctrine')->getEntityManager();
        $request = $this->get('request');

        $post = new IsshPost();        
        $form = $this->createForm(new PostForm(), $post);

        if ('POST' == $request->getMethod()) 
        {        
            $form->bindRequest($request);           
            $post->setIsshUser($this->get('security.context')->getToken()->getUser());

            if ($form->isValid()) 
            {
                $em->persist($post);
                $em->flush();

                return $this->redirect($this->generateUrl('home'));
            }
            return $this->render('IsshMainBundle:Home:IsshPost.html.php', array(
                 'form'  =>  $form->createView()));   
        }
        else
        {
            $em = $this->getDoctrine()->getEntityManager();
            $posts = $em->getRepository('IsshMainBundle:IsshPost')->getLatestPosts();
            return $this->render('IsshMainBundle:Home:IsshPost.html.php', array(
                'form'  =>  $form->createView(), 'posts' => $posts));           
        }

    }

    public function commentAction($postID = null)
    {
        $em = $this->get('doctrine')->getEntityManager();
        $request = $this->get('request');

        $comment = new IsshComment();        
        $form = $this->createForm(new CommentForm($postID), $comment); // need to pass postID here so it can be set as hidden field

        if ('POST' == $request->getMethod()) 
        {        
            $form->bindRequest($request);           
            $comment->setIsshUser($this->get('security.context')->getToken()->getUser());  

            if ($form->isValid()) {
                $em->persist($comment);
                $em->flush();

                return $this->redirect($this->generateUrl('home'));
            }

        }
        else
        {
            return $this->render('IsshMainBundle:Home:IsshComment.html.php', array(
                'form'  =>  $form->createView()));
        }     
    }
}

Вот форма сообщения:

<?php

namespace Issh\MainBundle\Form\Post;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class PostForm extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('text','text');
    }

    public function getName()
    {
        return 'postForm';
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Issh\MainBundle\Entity\IsshPost'
        );
    }
}
?>

Форма комментария (пока не работает):

<?php

namespace Issh\MainBundle\Form\Post;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class CommentForm extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('text','text');
    }

    public function getName()
    {
        return 'commentForm';
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Issh\MainBundle\Entity\IsshComment'
        );
    }
}
?>

Шаблон поста:

<?php if(!empty($form)): ?>
<form action="<?php echo $view['router']->generate('post') ?>" method="post" <?php echo $view['form']->enctype($form) ?> >
    <?php echo $view['form']->errors($form) ?>
    <?php echo $view['form']->row($form['text']) ?>
    <?php echo $view['form']->rest($form) ?>
    <input type="submit" />
</form>
<?php endif; ?>
<?php if(!empty($posts)): ?>
    <?php foreach ($posts as $post): ?>
    <p><?php echo $post->getText();?></p>
    <?php 
    //embed comment controller in view
    echo $view['actions']->render('IsshMainBundle:Home:comment',array('postID' => $post->getId())); 
    ?>
    --------------------------------------
    <?php endforeach; ?>
<?php endif; ?>

Шаблон комментария:

<?php if(!empty($form)): ?>
<form action="<?php echo $view['router']->generate('comment') ?>" method="post" <?php echo $view['form']->enctype($form) ?> >
    <?php echo $view['form']->errors($form) ?>
    <?php echo $view['form']->row($form['text']) ?>
    <?php echo $view['form']->rest($form) ?>
    <input type="submit" />
</form>
<?php endif; ?>
<?php if(!empty($comments)): ?>
    <?php foreach ($comments as $comment): ?>
    <p><?php echo $comment->getText();?></p>
    --------------------------------------
    <?php endforeach; ?>
<?php endif; ?>

Ответы [ 2 ]

5 голосов
/ 07 октября 2011

Вы можете объявить конструктор в своем классе формы и передать postID в форму.

class CommentForm extends AbstractType
{
    private $postId;

    public function __construct($postId = null)
    {
        $this->postId = $postId;
    }

    public function buildForm(FormBuilder $builder, array $options)
    {
    ... 
}

Теперь вы можете получить доступ к postID как $ this-> postId в любом месте формы.

3 голосов
/ 22 ноября 2011

Вы можете просто добавить параметры в метод buildForm следующим образом:

$ form = $ this-> get ('form.factory') -> create (new FormType (), array ('key' => 'var'));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...