2012-01-16 21 views
7

Estoy tratando de construir un diseño común con un contenido de la página div principal y una barra lateral con la Play framework:Rendering la barra lateral utilizando el Marco de Juego

<html> 
<head></head> 
<body> 
<div id="all"> 
    <div id="content">the ususal doLayout stuff</div> 
    <div id="sidebar"> 
    <div class="widget">Recent comments...</div> 
    <div class="widget">Recent posts...</div> 
    other Widgets... 
    </div> 
</div> 
</body> 
</html> 

¿Es posible hacer que los widgets en la barra lateral sin unión preventiva del contenido de los widgets en cada controlador? Incluso si no hay tal widget en la plantilla, tendría que obtener todos los datos requeridos.

Recientemente utilicé el Lift Framework y pude escribir solo <div class="lift:someWidget.news">. Esto llama al método news en la clase someWidget para representar el widget. Es posible recuperar datos de la base de datos en ese método, por lo que no es necesario un enlace preventivo. ¿Hay algo similar en Play para guardar consultas DB innecesarias y código no relacionado en el controlador?

Respuesta

5

Sí. Aquí están mis dos opciones preferidas. La opción correcta depende de su caso de uso particular.

Opción 1 - Utilizar la notación @before

Mediante el uso de la anotación @before, se puede ejecutar el procesamiento común en cada acción que se invoca. Ejecutará el método antes de que se ejecute la acción principal, lo que le permite almacenar sus datos en el mapa renderArgs, que está disponible dentro de la vista.

Estos datos en la vista se pueden acceder en su plantilla principal y, por lo tanto, están disponibles en todas las vistas.

Opción 2 - Uso de AJAX

Ponga algunos divs como marcadores de posición como lo han hecho en su ejemplo, y luego usar la carga jQuery que llamará a una acción en su serverside para generar un pequeño trozo de HTML sólo para el fragmento que requieres

2

Puede llamar a un método de controlador estático desde una plantilla. Tenga en cuenta la @Util - Anotación de saber Play que esto no se entiende como una acción - Método:

@Util 
public static List<Post> getPosts() { 
    ... 
} 

luego llamar a esto de su plantilla (tal vez una etiqueta personalizada):

<div class="widget"> 
%{ 
    def posts=controllers.Post.getPosts() 

    for(post in posts) { 
    }% 
     <h2>${post.header}</h2> 
     <p>${post.body}</p> 
    %{ 
    } 
}% 
</div> 

Como se trata de Al violar el modelo MVC puro, no recomendaría usarlo en exceso. Pero sabiamente puede ser una solución realmente pragmática. Y su caso de uso para construir una barra lateral en un diseño general es un uso perfectamente válido (en mi opinión); si luego decide proporcionar una representación json de sus datos en el contenido principal, su barra lateral de diseño no se usa, y por lo tanto los datos no se obtiene al usar este patrón.

+0

¡Respuesta muy útil, gracias! – Dave

Cuestiones relacionadas