martes, 15 de julio de 2008

Soporte para layouts

El soporte para layouts es una característica bien importante para cualquier framework MVC y Yupp Framework no se podría quedar atrás, así que empecé a buscar información sobre implementación de layouts, patrones de diseño, y frameworks especializados en layouts y templates.

Un sistema de layout ayuda a ahorrar código en las vistas, de forma que varias vistas puedan compartir código común que está en un único archivo externo.

En un momento, luego de leer un rato sobre las posibles formas de implementarlo, más algunas ideas que tenía en mente, probé una pequeña implementación de un sistema de layout, y luego de un par de horas (y para mi sorpresa) lo teníaandando integrado con el framework. En este post mostraré como es que se utilizaría esta implementación de layouts.

La idea principal era no tener que modificar demasiado las vistas de forma que las vistas ya creadas sigan funcionando bien aunque no tengan referencia a un layout. Por lo tanto inventé una tag que sirve para crear la referencia desde una vista:

<layout name="blog" />

Esta tag debe ser incluída luego de <html> y antes de <head>,
para hacer más clara la referencia y más fácil de implementar el procesamiento de esa tag.

El procesamiento debía ser muy rápido y casi no afectar la velocidad de procesamiento actual, de esta forma probé hacer un procesamiento de layout mediante expresiones regulares y mediante operaciones con strings, y la velocidad con las operaciones con strings fue muchísimo mejor que con expresiones regulares, y muchísimo mejor me refiero a varios órdenes por debajo:

velocidad con expresiones regulares promedio: 0.03 ms
velocidad con operaciones de strings promedio: 5.5E-5 ms

El layout tiene la estructura de una vista pero no hace referencia al modelo y tiene dos variables disponibles para poder mostrar el contenido de la vista de la cual es layout, estas son $head y $body, que representan el contenido del <head> y del <body> de la vista.

Este es un ejemplo de un layout:

<html>
<head>
<style type="text/css">
...
</style>
<?php echo $head; ?>

</head>
<body>

<div style="padding:10px; background-color:#6af;" align="right">

<?php echo h('locale_chooser'); ?>
</div>

<div style="padding:10px;">

<?php echo $body; ?>

</div>
</body>
</html>

Por último quien hace el proceso de la vista es una clase llamada LayoutManager que se
encarga de resolver referencias a layouts y mostrar la vista generada. Si la vista no contiene una referencia a un layout, simplemente muestra la vista igual que antes.

Si bien esta solución funciona bien, se puede mejorar en varios aspectos:

  • Chequeos de errores, para hacerlo más robusto.

  • Más flexible, por ejemplo poder acceder a más información de la vista como el título, ahora solo se accede al head y al body.

  • Poder incluir N niveles de layouts en cascada, podría servir para que un layout a su vez pueda tener un layout que
    lo contiene y poder definir distintas secciones de la página que se arma en distintas layouts.
Esta característica estará disponible con la próxima liberación del framework, Yupp Framework PHP v0.1.3.

No hay comentarios:

Publicar un comentario en la entrada