2011-11-07 12 views
8

voglio inserire il modulo di login di FOSUserBundle nel mio modello come questo:FOSUserBundle: incorporare il form di login e scegliendo il suo modello

<div id="sidebar"> 
    {% render "FOSUserBundle::Security::login" %} 
</div> 

ma non a rendere il modello che è stata chiamata nel codice di loginAction() originariamente.

ho pensato che avrei trovato utile la possibilità di passare il modello Voglio il rendering come parametro di 'Max' in questo esempio:

<div id="sidebar"> 
    {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 
3} %} 
</div> 

È quello possibile in Symfony2? In caso contrario ..

devo creare un'altra azione per il mio pacchetto con lo stesso codice all'interno di di loginAction? o dovrei modificare il codice loginAction originale e scrivere le strutture di controllo ?

if(currentPage == 'home') 
renderResponse('template1') 
else 
renderResponse('template2') 
+1

Date un'occhiata qui: https://github.com/FriendsOfSymfony/FOSUserBundle/issues/399 – greg0ire

risposta

33

È possibile creare un parziale memorizzare il form HTML semplice, per esempio, questo semplice:

<form action="{{ path("fos_user_security_check") }}" method="post"> 
    <label>Email</label> 
    <input type="text" name="_username" required="required" /> 

    <label>Password</label> 
    <input type="password" name="_password" required="required" /> 

    <button type="submit">Submit</button> 
</form> 

Poi, nel il tuo layout include solo il tuo parziale parziale :)

Se hai bisogno del token csrf (che è altamente raccomandato riparato), basta definire il provider come Twig variabile globale:

twig: 
    globals: 
     fos_csrf_provider: "@form.csrf_provider" 

Poi basta aggiungere il campo di input nascosto nel modulo:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.generateCsrfToken('authenticate') }}" /> 
+1

Grande - esattamente quello che cercavo - Grazie! – someuser

+6

@ David, Come posso implementare lo stesso modulo mostrando errori lì? Grazie!! – jcarlosweb

+4

Questo messaggio: > La classe Symfony \ Component \ Form \ Extension \ Csrf \ CsrfProvider \ CsrfProviderAdapter è obsoleta dalla versione 2.4 e verrà rimossa nella versione 3.0. Utilizzare invece la classe Symfony \ Component \ Security \ Csrf \ CsrfTokenManager. Mi ha fatto cercare una soluzione. Si scopre che non hai più bisogno del globale. Basta aggiungere questa riga nel modulo: Mondane

0

è un unico "due punti" tra ogni parte

{% render "FOSUserBundle:Security:login" %} 
10

È necessario specificare che si sta chiamando un controller

{{ render(controller('FOSUserBundle:Security:login')) }} 
1

Poiché la parte per includere l'errore non è stata risposta qui e ho dovuto scavare nel codice FOSUsBundle, lasciatemi aggiungere anche a questo post come aggiungere i messaggi di errore al loginPartial.html. modulo ramoscello:

Date un'occhiata al file /vendor/friendsofsymfony/user-bundle/Controller/SecurityController.php

Questo controller ha un loginAction che costruisce la variabile errore. Tutto quello che devi fare nel controller che usi per rendere il ramoscello loginPartial è quello di aggiungere a questo controller il seguente codice.

$session = $request->getSession(); 
    // get the error if any (works with forward and redirect -- see below) 
    if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) { 
     $error = $request->attributes->get(SecurityContextInterface::AUTHENTICATION_ERROR); 
    } elseif (null !== $session && $session->has(SecurityContextInterface::AUTHENTICATION_ERROR)) { 
     $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR); 
     $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR); 
    } else { 
     $error = null; 
    } 

    return $this->render('YourDemoBundle:Default:index.html.twig', ['error' => $error]); 

In questo caso vi sono solo utilizzando lo stesso codice nel tuo controller per generare alcun login messaggi di errore IE Password non corretta, ecc

Ora, nel ramo, che mostra la forma è sufficiente aggiungere il seguente: { % include "YourDemoBundle: Security: loginPartial.html.twig '%}

E nel loginPartial.html.ramoscello di file messo in questa:

{% block fos_user_content %} 
{% if error %} 
    <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div> 
{% endif %}`Let the rest of the form be as is....and then endblock ofcourse..{% endblock fos_user_content %}` 

che dovrebbe farlo

Problemi correlati