2013-07-19 10 views
10

Używam FOSUserBundle w mojej aplikacji Symfony, która jest naprawdę świetna. Mają formularze logowania i rejestracji w osobnym szablonie. Chcę, aby oba w jednym szablonie wyświetlały je obok siebie.FOSUserBundle: Jak najlepiej zintegrować formularz logowania i rejestracji w jednym szablonie?

Dlatego stworzyłem app/Resources/FOSUserBundle/Security/login.html.twig i app/Resources/FOSUserBundle/Registration/register.html.twig, aby nadpisać oba szablony. W login.html.twig wzywam kontroler rejestru, aby wyrenderować jego szablon.

app/Resources/FOSUserBundle/Bezpieczeństwo/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/Rejestracja/register.html.twig:

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

Ale potem dostać następujący błąd:

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 

Nie wiem, dlaczego pojawia się ten komunikat o błędzie. Jeśli patrzę na kontrolerze Security:login i Registration:register, szablony dostać świadczonych na różne sposoby:

$this->renderLogin(... 

i

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

Więc w zasadzie mam dwa pytania:

  • Co robi błąd wiadomość oznacza i jak mogę ją rozwiązać?
  • Może to podejście nie jest idealne, czy istnieje lepsze rozwiązanie?

Odpowiedz

11

Można użyć (jak @Sidali Hallak powiedział)

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

jednak wykorzystać własne wersje FOSUserBundle:Registration:register.html.twigFOSUserBundle:Security:login.html.twig i szablonów, które nie rozciągają FOSUserBundle::layout.html.twig

+0

brzmi całkiem nieźle. Ale nadal pozostaje główny problem: kontroler rejestracji wciąż kieruje się do własnej skonfigurowanej trasy "/ register", która nie jest pożądaną trasą. Jak mogę wpływać na to? Jak mogę mu powiedzieć, że chcę powrócić do mojej strony, na której logują się i rejestrują obok siebie? Myślę, że nie jest to rozwiązanie do zmiany routingu FOSUserBundle. – tester

+1

przy okazji: '{% renderowania url ('fos_user_security_login')%}' nie działa. czy możesz powiedzieć mi dlaczego? – tester

+0

Czy zaimportowałeś wszystkie trasy do własnego pliku routingu, czy trasa logowania powinna znajdować się w tym katalogu, tak jak powinna być baza? Aby nie musieć mieszać się z kontrolerami, możesz mieć '{% renderuj adres URL ('fos_user_security_login')%}' w 'FOSUserBundle: Registration: register.html.twig' chociaż to nadal oznacza, że ​​formularz logowania będzie trasa do oryginalnej trasy logowania po nieudanej próbie. Aby zrobić to poprawnie, myślę, że potrzebujesz dostosować kontrolery rejestracji i bezpieczeństwa. – qooplmao

0

Maksymalny poziom zagnieżdżenia pochodzi z XDebug i może być rozwiązana ustawienie ...

xdebug.max_nesting_level = 200 

... w php.ini.

+0

Thx, myślałem, że to niekończąca się pętla, którą otrzymałem, ponieważ 100 poziomów gniazdowania jest naprawdę głębokie. To rozwiązało komunikat o błędzie. Czekam jednak na więcej sugestii dotyczących rozwiązania, aby rozwiązać mój problem w lepszy sposób, jeśli taki istnieje. – tester

+0

Wygląda na to, że komponent Formularz Symfony2 intensywnie korzysta z rekursji, zobacz oficjalne dokumenty: http://symfony.com/doc/current/cookbook/form/form_collections.html (odpowiednia sekcja to około 1/3 w dół strony) – frak

3

zastosowanie:

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

Dodaję '' '%% render url ('fos_user_security_login')%}' '', ale pokaż mi formularz logowania i rejestrację, dlaczego? Jak mogę zrobić, aby pokazać tylko login. Myślę, że błąd leży w sonataadmin – jcarlosweb

5

Aby zachować zgodność z nowszymi wersjami Symfony, należy unikać używania znacznika {% render %} i używać {{ render(controller('MyBundle:ControllerClass:action')) }} zamiast:

{{ render(controller('FOSUserBundle:Security:login')) }} 
    {{ render(controller('FOSUserBundle:Registration:register')) }} 
Powiązane problemy