2012-03-17 13 views
12

tengo la siguiente configuración de plantilla simplificada:Juega 2.0 Acceso a solicitar en las plantillas

  • principal (plantilla)
    • Página
    • detalles

Ahora, cuando una el usuario inicia sesión, se establece un atributo de sesión username para que pueda figurar fuera si un usuario está conectado o no. Con el fin de ayudar a mí averiguar si un usuario está conectado o no, tengo el siguiente objeto de sesión ayudante:

object SessionHelper { 
    val sessionKey = "username" 

    def authenticated(implicit request: RequestHeader) = { 
    request.session.get(sessionKey).exists(_ => true) 
    } 
} 

¿Qué puedo usar en una plantilla que toma un objeto implicit petición, por ejemplo:

(implicit request: play.api.mvc.RequestHeader) 
... 
@if(SessionHelper.authenticated) { 
    <strong>Authenticated!</strong> 
} 
... 

Desde — por lo que yo puedo decir — esta es la única manera de obtener una implícita variables en una plantilla, que significa que en todas partes se renderiza una vista, necesito de forma explícita "definir" la petición implícita variable. Por ejemplo:

def index = Action { implicit request => 
    Ok(views.html.index(myStuff)) 
} 

Sin la declaración implicit request =>, no compila. Ahora bien, aunque esto es un poco incómodo, siempre que permanezca dentro de cualquiera de las "sub-vistas" (por ejemplo, Página de inicio o Detalles) está bien porque para cada una de esas vistas tengo un método de control y como tal también acceso al RequestHeader implícito ejemplo. Sin embargo, cuando necesito acceder a la sesión en mi plantilla (por ejemplo, Main), esto no funciona porque nunca es procesado explícitamente por un controlador.

No estoy viendo de inmediato una forma de acceder a la sesión en una plantilla, y un Google rápido no revela mucho más que un par de preguntas sobre el mismo tema sin resolución. ¿Algunas ideas?

Actualización: parece que esto está relacionado de alguna manera con this question.

Respuesta

8

No hay alternativa a pasar la solicitud implícita alrededor de todas sus plantillas, al menos no desde Play Framework 2.0.

El enlace que agrega en la actualización es mover más datos alrededor de las plantillas en solo 1 objeto, pero aún necesita declarar el parámetro implícito en todas partes.

2

me di cuenta de una cosa interesante: en mi Java 2.1.0 Juego de aplicaciones puedo usar objetos implícitos que figuran en Play 1.2.5 documentation, mientras que no se documentan en absoluto en el juego 2! Probablemente es algo así como la corrección de compatibilidad con versiones anteriores no documentada. De todos modos, no puedo hacer esto:

<li @if(request.uri == routes.Help.index.url){class="active"}> 

y esto:

@for((key, message) <- flash) { ... } 

Como se puede ver, puedo usar request y flash las variables sin definirlas. Mi IntelliJ constantemente lo destaca como un error, pero se compila y funciona de todos modos. Entonces parece que algunas versiones después de 2.0 abordaron este problema.

+2

Con Play 2.3.x, consigo "no encontrado: solicitud de valor". – Wrench

+0

@Wrench: Mire la respuesta de Kaká, él ofrece una explicación. En resumen: se puede tener algunos de implícita disponibles. Sumérgete en esa clase –

2

Si está utilizando Juego para Java, se puede hacer algo esto:

<li @if(requestHeader.uri == routes.Help.index.url){class="active"}> 

simplemente ignorar el error en el IDE, que compila y correr bien.

El método fue requestHeader importar automáticamente por clase play.TemplateImports:

javaImports.add("play.core.j.PlayMagicForJava._"); 
Cuestiones relacionadas