2013-07-19 3 views
10

Ich benutze den FOSUserBundle in meiner Symfony-Anwendung, die wirklich großartig ist. Sie haben Anmelde- und Registrierungsformulare in einer separaten Vorlage. Ich möchte beide in einer Vorlage nebeneinander anzeigen.FOSUserBundle: Wie integriere ich am besten Login und Registrierungsformular in einer Vorlage?

Daher habe ich app/Resources/FOSUserBundle/Security/login.html.twig und app/Resources/FOSUserBundle/Registration/register.html.twig erstellt, um beide Vorlagen zu überschreiben. In login.html.twig rufe ich den Register-Controller auf, um seine Vorlage zu rendern.

app/Resources/FOSUserBundle/Sicherheit/login.html.twig:

{% extends "FOSUserBundle::layout.html.twig" %} 

{% trans_default_domain 'FOSUserBundle' %} 

{% block fos_user_content %} 
    {% if error %} 
     <div>{{ error|trans }}</div> 
    {% endif %} 

    <form action="{{ path("fos_user_security_check") }}" method="post"> 
     <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" /> 

     <input type="text" id="username" name="_username" value="{{ last_username }}" placeholder="{{ 'security.login.username'|trans }}" required="required" /> 

     <input type="password" id="password" name="_password" placeholder="{{ 'security.login.password'|trans }}" required="required" /> 

     <input type="checkbox" id="remember_me" name="_remember_me" value="on" /> 
     <label for="remember_me">{{ 'security.login.remember_me'|trans }}</label> 

     <input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans }}" /> 
    </form> 

    {{ render(controller('FOSUserBundle:Registration:register')) }} 
{% endblock fos_user_content %} 

app/Resources/FOSUserBundle/Registration/register.html.twig:

{% include "FOSUserBundle:Registration:register_content.html.twig" %} 

Aber dann bekomme ich der folgende Fehler:

FatalErrorException: Error: Maximum function nesting level of '100' reached, aborting! in /private/var/www/symfony/My_UserBundle/vendor/twig/twig/lib/Twig/Node/Expression/Array.php line 31 

Ich weiß nicht, warum ich diese Fehlermeldung erhalte. Wenn ich die Security:login und Registration:register Controller schauen, bekommen die Vorlagen auf verschiedene Weise gemacht:

$this->renderLogin(... 

und

$this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.... 

Also im Grunde habe ich zwei Fragen:

  • Was den Fehler macht Mitteilungsmitteilung und wie kann ich es lösen?
  • Vielleicht ist dieser Ansatz nicht ideal, gibt es dafür eine bessere Lösung?

Antwort

11

könnten Sie verwenden (wie @Sidali Hallak sagte)

{% render url('fos_user_registration_register') %} 
{% render url('fos_user_security_login') %} 

Aber verwenden Sie Ihre eigenen Versionen der FOSUserBundle:Registration:register.html.twig und FOSUserBundle:Security:login.html.twig Vorlagen, erstrecken sich nicht FOSUserBundle::layout.html.twig

+0

klingt ziemlich gut. Aber es gibt noch ein Hauptproblem: Der Registrierungs-Controller routet immer noch zu seinen eigenen konfigurierten "/ Register" -Routen, was nicht die Route ist, die ich möchte. Wie kann ich das beeinflussen? Wie kann ich ihm sagen, dass ich zu meiner Seite zurückkehren möchte, wo Login und Registrierung nebeneinander existieren? Ich denke, es ist nicht die Lösung, das Routing des FOSUserBundle dafür zu ändern. – tester

+1

übrigens: '{% render url ('fos_user_security_login')%}' funktioniert nicht. Kannst du mir sagen warum? – tester

+0

Haben Sie alle Routen in Ihre eigene Routing-Datei importiert, sollte sich die Login-Route dort befinden wie die Basis des Register-Ordners? Um nicht mit den Controllern herumzualbern, könntest du die '{% render url ('fos_user_security_login')%}' in 'FOSUserBundle: Registrierung: register.html.twig' haben, obwohl dies immer noch bedeuten würde, dass das Login-Formular dies tut Bei einem fehlgeschlagenen Versuch zur ursprünglichen Login-Route zurückkehren. Um es richtig zu machen, denke ich, dass Sie die Registrierungs- und Sicherheitscontroller anpassen müssen. – qooplmao

0

Die maximale Verschachtelungstiefe kommt von xdebug und Einstellung gelöst werden kann ...

xdebug.max_nesting_level = 200 

... in der php.ini.

+0

Thx, dachte ich, es war eine nie endende Schleife was ich bekam, weil 100 Verschachtelungsebenen wirklich tief ist. Dies löste die Fehlermeldung. Aber ich warte auf weitere Vorschläge bezüglich einer Lösung, um mein Problem besser zu lösen, falls es eines gibt. – tester

+0

Es scheint, dass die Form-Komponente von Symfony2 die Rekursion stark nutzt, siehe die offizielle Dokumentation: http://symfony.com/doc/current/cookbook/form/form_collections.html (der relevante Abschnitt ist etwa 1/3 auf der Seite) – frak

3

Verwendung:

{% render url('fos_user_security_login') %} 
{% render url('fos_user_Registration_register') %} 
+0

Ich füge '' '{% render url ('fos_user_security_login')%}' '' hinzu, aber zeig mir das Login-Formular und Registrierung, Warum? Wie kann ich nur den Login zeigen. Ich denke, der Fehler liegt Sonataadmin – jcarlosweb

5

Um mit neueren Symfony-Versionen kompatibel zu sein, sollten Sie die Verwendung des Tags {% render %} vermeiden undverwendenstattdessen:

{{ render(controller('FOSUserBundle:Security:login')) }} 
    {{ render(controller('FOSUserBundle:Registration:register')) }} 
Verwandte Themen