从渲染的控制器获取表单

时间:2014-07-14 15:24:03

标签: forms symfony controller twig render

我对symfony2有这样的问题。

我有base.html.twig,这个基础是其他树枝的模板。 我想渲染控制器,其中包含带有语言环境类型输入字段的表单。 该表格将用于更改网站的语言。

我的语言控制器:

<?php

namespace Soczewki\PlatformaBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class LanguageController extends Controller {

  public function createAction(Request $Request)
    {

      $form = $this->createFormBuilder()
            ->setMethod('POST')
            ->setAction(null)
            ->add('locale', 'locale', array(
                'label'     => ' ',
                'choices'   => array('pl' => 'Polski', 'de' => 'Deutsch', 'en' => 'English'),
                'data' => $this->getRequest()->getLocale(),
                'required'  => true))
              ->add('submit', 'submit')
              ->getForm();

     $form->handleRequest($Request); 

     if($form->isValid()) {
         $this->getRequest()->setLocale('en');
     }

     return $this->render("SoczewkiPlatformaBundle::myForm.html.twig",
            array(
                'form' => $form->createView(),
                'req' => $r
            ));
    }


} 

整个base.html.twig:

<html>
    <head>
        <title>{% block pageTitle %}{% endblock %}</title>
        {#js#}
        <script src="{{ asset('bundles/soczewkiplatforma/js/jquery.js') }}"></script>
        <script src="{{ asset('bundles/soczewkiplatforma/js/bootstrap.js') }}"></script>
        {#/js#}   
        {% block stylesheets %}
            <link href="{{ asset('bundles/soczewkiplatforma/css/bootstrap.min.css') }}" rel="stylesheet">
            <link href="{{ asset('bundles/soczewkiplatforma/css/my-style.css') }}" rel="stylesheet">
        {% endblock stylesheets %}         

    </head>
    <body>



    {% if app.security.getToken().getUser().getAuthKey() is defined %}    
        {% if app.security.getToken().getUser().getAuthKey() is not empty %}
            {% set diff =  ( app.security.getToken().getUser().getEndDate()|date('U') - "now"|date('U') ) / 3600  %}
            <div style="width: 300px; height: 140px; position: absolute; bottom: 90px; right: 50px;" class="alert alert-danger alert-error">
            <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <strong>Uwaga!</strong> Twoje konto nadal nie zostało aktywowane!<br />
            Pozostało Ci: <span class="badge">{{ diff[0:2] }} godzin {{   ( diff[3:] * 60 )[0:2]   }} minut </span> 
            <br /><br />
            <a href="{{ url('soczewki_platofrma_account') }}#activate_form_auth_key"><button type="button" class="btn btn-danger">Wpisz kod</button></a>
            <button type="button" class="btn btn-default" data-dismiss="alert">Zamknij</button>
            </div>
        {% endif %}

        {% set hasParams = app.request.get('id') %}

        {% if hasParams is empty %}
            {% set currentPath = url( app.request.attributes.get( '_route', app.request.attributes.get('_route_params'))) %}
        {% else %}
            {% set currentPath = url( app.request.attributes.get( '_route', app.request.attributes.get('_route_params')),{'id': 0}   ) %}
        {% endif %}

        {% set dirs = currentPath|split('/') %}
        {% set flag = "" %}
        {% set url = "" %}

        <ol class="breadcrumb">
            <li><a href="{{ url('soczewki_platofrma_test') }}">Główna</a></li>  

            {% for key, dir in dirs %} 

                {% if url is not empty %}
                    {% set url = url ~ '/' ~ dir %}
                {% else %}
                    {% set url = url ~ dir %}
                {% endif %}
                {% if flag == true %}

                    {% if '=' in dir %}   
                        {% set _temp = dir|split('=') %}
                    {% else %}
                        {% set _temp = dir|split(' ') %}
                    {% endif %}

                    {% if key + 1 == dirs|length %}
                        <li class="active"> {{ _temp[0]|capitalize|replace('-',' ') }} </li> 
                    {% else %}
                        <li><a href="{{ url }}"> {{ _temp[0]|capitalize|replace('-',' ') }} </a></li> 
                    {% endif %}
                {% endif %}  
                {% if dir == 'app_dev.php' %}
                    {% set flag = true %}
                {% endif %}  
            {% endfor %}

            <li class="dropdown" style="float: right !important;">    
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">Zalogowano jako: {{ app.security.getToken().getUser().getName() }} <span class="caret"></span></a>
                <ul class="dropdown-menu" role="menu">
                    <li><a href="{{ path('soczewki_platofrma_account') }}">Moje konteło</a></li> 
                    <li><a href="{{ path('logout') }}">Wyloguj</a></li>
                </ul>   
            </li>
        </ol>

    {% else %}           
        <ol class="breadcrumb">
            <li><a href="{{ url('soczewki_platofrma_test') }}">Główna</a></li>   
            <!--- logowanie --->
            <li class="dropdown" style="float: right !important;">    
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">Zaloguj <span class="caret"></span></a>
                <div class="dropdown-menu" style="padding: 15px; padding-bottom: 0px; left: -200px;">


                    <form action="{{ path('login_check') }}" method="post">
                    <label for="username">Email/NIP:</label>
                    <input type="text" id="username" name="_username" />
                    <br />

                    <label for="password">Hasełko:</label>
                    <input type="password" id="password" name="_password" />
                    <br /><br />

                    <button type="submit">Loguj do Afganistanu</button>
                    </form>

                </div>   
            </li>
            <!--- log ---->
        </ol>         
    {% endif %}  

     {{ render(controller('SoczewkiPlatformaBundle:Language:create')) }}

    {% block pageContainer %}

    {% endblock %}  

    </body>
</html>    

没有任何显示,我也得到任何错误。 为什么会那样?

//代码已更新

myForm.html.twig:

{{ dump(req) }}

{{ form(form) }}

和LocaleListener.php:

<?php
namespace Soczewki\PlatformaBundle\Translations;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    public function __construct($defaultLocale = 'pl')
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            return;
        }

        // try to see if the locale has been set as a _locale routing parameter
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // if no explicit locale has been set on this request, use one from the session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered before the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

2 个答案:

答案 0 :(得分:0)

您需要在希望表单出现的位置添加此代码

{{ form(form) }}

在以下评论后编辑;

创建一个名为myForm.html.twig的文件并放入SoczewkiPlatformaBundle;
现在写下这段代码:

{{ form(form) }}

现在你的控制器应该是:

public function changeAction(Request $Request)
    {


      $form = $this->createFormBuilder()
            ->add('locale', 'locale', array(
                'label'     => 'user.locale',
                'required'  => true,
                'choices'   => array('en' => 'English', 'de' => 'Deutsch', 'pl' => 'Polish')
                                ))
                    ->getForm();

     $form->handleRequest($Request); 


     return $this->render("SoczewkiPlatformaBundle::myForm.html.twig",
            array(
                'form' => $form->createView(),
            ));


    }

答案 1 :(得分:0)

您创建了一种情况,即在页面刚刚死亡之前,您无限次地调用相同的方法。

正在渲染原始基础,最终呈现SoczewkiPlatformaBundle::base.html.twig模板。在此模板中,render()正在调用一个操作,然后呈现SoczewkiPlatformaBundle::base.html.twig模板,然后调用render(),然后呈现SoczewkiPlatformaBundle::base.html.twig,然后再打开.. {1}}。

您需要为要呈现的表单而不是基础指定模板,然后在changeAction中调用该模板。

例如......

Soczewki\PlatformaBundle\Controller\LanguageController

public function changeAction(Request $Request)
{
    // ..

    return $this->render("SoczewkiPlatformaBundle:Locale:change_form.html.twig",
        array(
            'form' => isset($form) ? $form->createView() : null,
        ));
}

SoczewkiPlatformaBundle:Locale:change_form.html.twig

{{ form_start(form, {'method': 'POST', 'action': 'your_locale_change_route' }) }}
    {{ form_row(form.locale) }}
{{ form_end(form) }}

您的下一个问题是您的changeAction实际上并未执行某项操作(除了创建表单之外),尽管您可能只是希望在到达该部分之前显示该页面。

相关问题