在呈现表单时,Twig中的FormView会丢失提交的数据

时间:2015-11-07 16:19:53

标签: symfony twig

我使用symfony 2.7.6完整堆栈框架。

当我提交表单时,在控制器中我获得所有提交的数据,但在视图中没有任何内容,呈现空表单,出现问题,我应该显示提交的表单有错误。但树枝形式中没有显示数据和错误......

经过几个小时的symfony调试后,我无法解决问题。

以下是表格类型,它被称为服务:

<?php

namespace Skonsoft\ModelBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Doctrine\Common\Persistence\ObjectManager;
use Skonsoft\UserBundle\Entity\User;

class ConversationType extends AbstractType
{
    /**
     * @var \Doctrine\Common\Persistence\ObjectManager
     */
    private $om;

    /**
     * @var TokenStorageInterface
     */
    protected $tokenStorage;

    /**
     * Constructor
     * 
     * @param ObjectManager $om
     * @param TokenStorageInterface $tokenStorage
     */
    public function __construct(ObjectManager $om,
                                TokenStorageInterface $tokenStorage)
    {
        $this->om = $om;
        $this->tokenStorage = $tokenStorage;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('message')
                ->add('advert', 'entity_hidden',
                      array(
                    'class' => 'SkonsoftModelBundle:Advert',
                    'data_class' => null,
                    'data' => $options['data']->getAdvert()
                ))
        ;

        $addUser = function(FormBuilderInterface $builder, User $user, $call) {
            $builder->addEventListener(FormEvents::PRE_SET_DATA,
                                       function(FormEvent $event) use ($user, $call) {
                $entity = $event->getData();
                $entity->$call($user);
            });
        };

        $from = $options['data']->getFrom();
        if (!$from) {
            $from = $this->om->getRepository('SkonsoftUserBundle:User')->find($this->tokenStorage->getToken()->getUser()->getId());
        }

        $to = $options['data']->getTo();
        if (!$to) {

            $advert = $this->om->getRepository('SkonsoftModelBundle:Advert')->find($options['data']->getAdvert());
            $to = $advert->getUser();
        }

        $addUser($builder, $from, 'setFrom');
        $addUser($builder, $to, 'setTo');
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Skonsoft\ModelBundle\Entity\Conversation'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'ss_conversation';
    }

}

这是控制器动作:

/**
 * Creates a new Conversation entity.
 *
 * @Route("/{id}", name="conversation_create")
 * @Method("POST")
 * @ParamConverter("advert", class="SkonsoftModelBundle:Advert")
 * @Template("SkonsoftUserBundle:Conversation:new.html.twig")
 */
public function createAction(Request $request, Advert $advert)
{
    $entity = new Conversation();
    $entity->setAdvert($advert);
    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    $t = $this->get('translator');

    if ($form->isValid()) {
        $manager = $this->get('skonsoft_model.conversation_manager');
        $manager->persist($entity);

        $this->addFlash('success', $t->trans('message.send.success'));

        return $this->redirect($request->headers->get('referer'));
    }

    $this->addFlash('danger', $t->trans('message.send.error'));

    return array(
        'entity' => $entity,
        'form' => $form->createView(),
    );
}

 /**
 * Creates a form to create a Conversation entity.
 *
 * @param Conversation $entity The entity
 *
 * @return \Symfony\Component\Form\Form The form
 */
private function createCreateForm(Conversation $entity)
{
    $form = $this->createForm('ss_conversation', $entity);

    return $form;
}

这是树枝:

{{form_start(form, {'action': path('conversation_create', {'id': entity.advert.id}), 'method': 'POST', 'class':'form-horizontal', 'role':'form' } )}}

<div class="form-group row">
    <div class="col-sm-12 col-xs-12">
        {{ form_widget(form.message, {'attr': {'class': 'form-control pull-right', 'placeholder':"message.text_holder" | trans, 'rows':'6' } }) }}
    </div>

    <div class="widget_error  col-sm-12 col-xs-12">
        {{ form_errors(form.message) }}
    </div>
</div>

<div class="form-group row">
    <button type="submit" class="btn btn-success btn-lg {{'css.pull.right'|trans}}">{{ "Send" | trans }} </button>
</div>

{{form_end(form)}}

当我在控制器中转储FormView时,我得到提交的数据及其错误......但不在wiew中

任何团体都知道错误是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

对不起,这是我的错,与symfony无关。

所以,这是问题所在: 使用这个配置,一切正常,只是我使用 render_esi 帮助器来呈现表单,我忘记了render_esi是一个新的请求,所以当我提交表单时,第一个主请求获取并处理表单,但我在调用render_esi 帮助程序后丢失了所有表单的数据。