base.html.twig中的Symfony2表单

时间:2014-04-16 07:59:25

标签: symfony login

我是Symfony2的新手,我只是想尝试一些东西来学习Symfony2。 目前,我有一些控制器可以完成一些简单的任务。例如一个简单的crud控制器。

我的网页扩展了base.html.twig文件并将其块插入其中。现在我想在我的基本文件中添加一个登录部分,因为我希望能够在每个页面上登录。我正在考虑使用formbuilder,但这是php代码,不能在html.twig文件中。我绝对不知道如何处理这个问题。有人能把我推向正确的方向,给我一些有用的例子吗?

提前感谢

操作:

public function loginFormAction(Request $request){

    // create a task and give it some dummy data for this example
    $message = "";
    $account = new Account();
    $account->setEmail('login@login.nl');

    $form = $this->createFormBuilder($account)
        ->add('email', 'text')
        ->add('wachtwoord', 'text')
        ->add('login', 'submit')
        ->getForm();

    $form->handleRequest($request);

    if ($_POST != null && $_POST['form']['email'] != null) {

        $repository = $this->getDoctrine()->getRepository('AcmeBlogBundle:Account');
        $email =$_POST['form']['email'];
        $wachtwoord =$_POST['form']['wachtwoord'];
        $foundAccount = $repository->findOneByemail($email);

        if (!$foundAccount) {
            $message = "Ingevuld email en wachtwoord komen niet overeen.";
        }else if($foundAccount->getWachtwoord() == $wachtwoord){

            $session = $request->getSession();

            $session->set('name', $foundAccount->getVoornaam() . " " . $foundAccount->getAchternaam());
            $session->set('email', $foundAccount->getEmail());


            //return $this->redirect($this->generateUrl('melding', array('melding' => 'mooiman')));
            //return $this->render('AcmeBlogBundle:Account:melding.html.twig', array('melding' => 'Hallo, '.$foundAccount->getVoornaam() . " " . $foundAccount->getAchternaam()));

            $message = 'Hallo, '.$foundAccount->getVoornaam() . " " . $foundAccount->getAchternaam();
            $form = $this->createFormBuilder()
                ->add('logout', 'submit')
                ->getForm();

            return $this->render('AcmeBlogBundle:Account:login.html.twig', array('form'=> $form->createView(), 'message' => $message));

        }else{
            $message = "Ingevuld email en wachtwoord komen niet overeen.";
        }


    }

    return $this->render('AcmeBlogBundle:Account:login.html.twig', array('form'=> $form->createView(), 'message' => $message));
}

public function logoutFormAction(Request $request){

    // create a task and give it some dummy data for this example
    $session = $request->getSession();

    $message = 'Hallo, '.$session->get('name');

    $form = $this->createFormBuilder()
        ->add('logout', 'submit')
        ->getForm();

    $form->handleRequest($request);

    if ($_POST != null) {
        $account = new Account();
        $account->setEmail('login@login.nl');

        $form = $this->createFormBuilder($account)
            ->add('email', 'text')
            ->add('wachtwoord', 'text')
            ->add('login', 'submit')
            ->getForm();

        $session->set('name', null);
        $session->set('email', null);

        $message = "U bent nu uitgelogd";
    }

    return $this->render('AcmeBlogBundle:Account:login.html.twig', array('form'=> $form->createView(), 'message' => $message));
}

Base.html.twig:

{% if(app.session.get('name') == null) %}
    {{ render(controller('AcmeBlogBundle:Account:loginForm')) }}
{% else %}
    {{ render(controller('AcmeBlogBundle:Account:logoutForm')) }}
{% endif %}

3 个答案:

答案 0 :(得分:1)

您可以在模板中包含其他控制器/操作的整个输出。只需将其包含在您的taplate中:

<div id="sidebar">
    {{ render(controller('YourBundle:User:login')) }}
</div>

这会将YourBundle / UserController / loginAction的整个输出注入#sidebar div。请记住,YourBundle / UserController / loginAction模板不能扩展其他树枝模板,并且应该很简单。

您可以在此处了解有关嵌入控制器的更多信息http://symfony.com/doc/current/book/templating.html#embedding-controllers

[实施例]:

表单操作:

/**
 * @Route("/contact", name="contact")
 */
public function contactAction(Request $request){

    $form = $this->createFormBuilder()
        ->setAction($this->generateUrl('contact'))
        ->add('email', 'email', array(
            'constraints' => array(
                new \Symfony\Component\Validator\Constraints\Email()
            )
        ))
        ->add('add', 'submit')
        ->getForm()
        ;

    if ($request->getMethod() == 'POST') {

        $form->handleRequest($request);

        if ($form->isValid()) {

            //do whatever you want and redirect
            return $this->redirect($this->generateUrl('homepage'));
        }else{
            // this must be a full page (extending from base tamplate)
            // that show form and errors
            return $this->render(
                'YourBundle:ControllerName:contact_faild.html.twig',
                array('form' => $form->createView())
            );
        }
    }

    return $this->render(
        'YourBundle:ControllerName:contact.html.twig',
        array('form' => $form->createView())
    );
}

表格中必须有操作网址&#34; - &gt; setAction($ this-&gt; generateUrl(&#39; contact&#39;))&#34;因为表单应该在单独的请求上处理。

接下来是表单模板(YourBundle:ControllerName:contact.html.twig):

{{ form(form) }}

然后我们需要一个额外的模板来在出现问题时显示表单错误。这应该扩展基本模板,并可能覆盖第一次出现表单的位置 错误形式的表单(YourBundle:ControllerName:contact_faild.html.twig):

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

{% block sidebar -%}
{{ form(form) }}
{% endblock sidebar %}

基础teplate:

(...)
{% block sidebar %}
<div id="sidebar">
    {{ render(controller('ClickAdUserBundle:User:contact')) }}
</div>
{% endblock %}
(...)

答案 1 :(得分:0)

阅读this 你会找到一些html / twig代码,把它放在“login.html.twig”中并把它包含在你想要的地方

答案 2 :(得分:0)

如果您对Symfony2完全不熟悉,我可以建议symfony2 symblock tutorial

在创建一个小博客时,您将使用Doctrine 2,创建表单并设计它们,Twig Layouts以及所有其他内容。

从示例中获取,您将在控制器中创建表单,如此

// src/Blogger/BlogBundle/Controller/PageController.php
public function contactAction()
{
    $enquiry = new Enquiry(); //This creates an Instance of the Entity you need for the form
    $form = $this->createForm(new EnquiryType(), $enquiry);

    $request = $this->getRequest();
    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

        if ($form->isValid()) {
            // Perform some action, such as sending an email

            // Redirect - This is important to prevent users re-posting
            // the form if they refresh the page
            return $this->redirect($this->generateUrl('BloggerBlogBundle_contact'));
        }
    }

    return $this->render('BloggerBlogBundle:Page:contact.html.twig', array(
        'form' => $form->createView()
    ));
}

和.html.twig的形式看起来像这样

{# src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig #}
{% extends 'BloggerBlogBundle::layout.html.twig' %}

{% block title %}Contact{% endblock%}

{% block body %}
    <header>
        <h1>Contact symblog</h1>
    </header>

    <p>Want to contact symblog?</p>

    <form action="{{ path('BloggerBlogBundle_contact') }}" method="post" {{ form_enctype(form) }} class="blogger">
        {{ form_errors(form) }}

        {{ form_row(form.name) }}
        {{ form_row(form.email) }}
        {{ form_row(form.subject) }}
        {{ form_row(form.body) }}

        {{ form_rest(form) }}

        <input type="submit" value="Submit" />
    </form>
{% endblock %}

我几乎不建议通过本教程来开始使用symfony2