Symfony2渲染表单并重定向以处理它

时间:2015-01-16 11:09:27

标签: forms symfony templates redirect blogs

我想在我的网站上实现一个表单来创建博客。在控制器中,我有两个功能用于此目的,第一个用于呈现表单,第二个用于处理数据并进行设置。显示表单但是我无法将其设置为重定向到第二个函数以实际处理它并将数据添加到数据库。我不知道我的问题是在控制器还是模板中。你能帮助我吗?

我在formtype中定义了提交按钮。

这是控制器:

/**
 * Display a form for a new Post
 *
 * @return array
 *
 * @Route("/new/_post", name="_blog_backend_post_new")
 * @Template("BlogBundle:Backend/Post:new.html.twig")
 */
public function newPostAction()
{
    $post = new Post();
    $post -> setAuthor($this->getUserManager()->getloggedUser());

    $form_post = $this->createForm(new PostType(), $post);

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

/**
 * Creates a new Post entity.
 *
 * @param Request $request
 *
 * @Route("/create", name="_blog_backend_post_create")
 * @Method("POST")
 * @Template("BlogBundle:Backend/Post:new.html.twig")
 *
 * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
 */
public function createAction(Request $request)
{
    $post = new Post();
    $post -> setAuthor($this->getUserManager()->getloggedUser());

    $form_post = $this->createForm(new PostType(), $post);



    $this->$form_post->submit($this->$request);

    if ($this->$form_post->isValid())
    {
        $em = $this->getDoctrine()->getManager();
        $em->persist($post);
        $em->flush();

        return $this->redirect($this->generateUrl('blog_blog_post_show', array('slug' => $slug_post = $post->getSlug()) ));
    }

    return $this->render('Blog:Post:show.html.twig', array('form_post' => $form_post->createView(),'slug' => $slug_post = $post->getSlug() ));
}

以下是模板:

{% extends "::base.html.twig" %}

{% block body %}
<h2>Post a Post</h2>

<form>
    {% include 'BlogBundle:Backend/Post:edit.form.html.twig' with {'form_post': form_post, route: '_blog_backend_post_create' } %}
</form>
{% endblock %}

--- BlogBu​​ndle:Backend / Post:edit.form.html.twig:

{% if form_errors(form_post) %}
<div class="alert alert-block alert-error fade in form-errors">
    {{ form_errors(form_post) }}
</div>
{% endif %}
<form class="well"  method="post" {{ form_enctype(form_post) }}>
<p>
    <label for="">Title</label>
    {% if form_errors(form_post.title) %}
    <div class="alert alert-block alert-error fade in form-errors">
        {{ form_errors(form_post.title) }}
    </div>
{% endif %}
    {{ form_widget(form_post.title, { 'attr': {'class': 'w100'} }) }}
</p>
<p>
    <label for="">Body</label>
    {% if form_errors(form_post.body) %}
    <div class="alert alert-block alert-error fade in form-errors">
        {{ form_errors(form_post.body) }}
    </div>
{% endif %}
    {{ form_widget(form_post.body, { 'attr': {'class': 'w100'} }) }}
</p>
<p>
    <button class="btn" type="submit">Save</button>
</p>
{{ form_rest(form_post) }}
</form>

解决

纠正控制器代码:

$form_post = $this->createForm(new PostType(), $post);
$form_post->handleRequest($request);
if ($form_post->isValid())

从BlogBu​​ndle中删除了双标签:后端/帖子:edit.form.html.twig

在表单中添加了操作:

<form class="well"  action="{{path("_blog_backend_post_create")}}" method="post" {{ form_enctype(form_post) }}>

1 个答案:

答案 0 :(得分:2)

您必须确保发布(而不是“重定向”)表单到第二个控制器。为此,您需要指定form-tag的action属性。

<form class="well" action="{{path("_blog_backend_post_create")}}" method="post" {{ form_enctype(form_post) }}>

当您提交from时,您的createAction中的代码将被执行。

(另外,删除BlogBu​​ndle中的额外表单标签:Backend / Post:new.html.twig)


更优选的方法是使用form()枝条功能。所以在你的twig文件中,你写道:

{% extends "::base.html.twig" %}

{% block body %}
<h2>Post a Post</h2>

{{ form(form_post) }}
{% endblock %}

创建表单时,您还需要添加以下操作:

$form_post = $this->createForm(new PostType(), $post, array(
  'action'=>$this->generateUrl('_blog_backend_post_create'),
));