2011-01-25 23 views
8

Si quiero tener una pieza común de UI en varias páginas, como un menú, ¿cuál es la forma recomendada de hacerlo?¿Admite Play Framework los "fragmentos"?

Contendría tanto código de plantilla como un controlador back-end (similar a "fragmentos" en el marco LiftWeb).

Soy consciente de que hay un módulo de menú para Play, pero estoy más interesado en cómo se lograría esto en general.

Respuesta

11

Hay dos formas de incluir código de vista común en Play Framework.

Puede usar la etiqueta #{include} o la etiqueta #{extends}.

La etiqueta extends, como su nombre indica, se extiende desde una vista principal. La etiqueta extends se utiliza de forma predeterminada en el código de esqueleto configurado por Play cuando crea una nueva aplicación. Extiende el main.html. Agregas tu código aquí.

La etiqueta includes, le permite insertar un código de vista común en sus plantillas en un punto específico. Esto funciona de forma similar a un php include/require, o jsp includes work.

El problema vendrá cuando su código de plantilla también requiera datos o lógica del modelo (a través del controlador). Si este es el caso, entonces necesitará usar la notación @Before o @With en su controlador para asegurarse de que la pieza común del código del controlador se ejecute cada vez. Puede agregar cualquier dato a la lista de renderArgs, de modo que esté disponible para su uso dentro de la vista.

Un ejemplo simple de usar renderArgs sería.

@Before 
private static void commonData() { 
    // do your logic here 
    renderArgs.put("menu", menu); 
    renderArgs.put("selected", selectedMenuItem); 
} 

los valores que ha puesto en renderArgs (menú y seleccionados en el ejemplo) estará disponible solo en la misma forma que si se les pasa en el método render.

+0

Gracias, ¿me puede indicar algún código de ejemplo que use renderArgs? – sanity

+3

Ejemplo de código agregado. – Codemwnci

+0

@Codemwnci Obtengo valores vacíos/nulos en mis renderArgs {}. En el inicio de sesión exitoso, almacené un mapa en renderArgs e imprimí con todos los valores en la consola usando renderArgs.get (login_det '). ToString(). Cuando uso el mismo en otro controlador obtengo renderArgs como {}. Lo que podría ser el problema aquí. – Arasu