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.

viernes, 11 de julio de 2008

Característica: devolver directamente el modelo

Una nueva característica que vino con la versión 0.1.2 del framework es la de no necesitar explicitar la vista que se va a utilizar. Por ejemplo con la acción edit, la forma de especificar la vista a utlizar se hace mediante el retorno de llamar al método “render” de YuppController:

class EntradaBlogController extends YuppController {

public function editAction()

{

$id = $this->params['id'];

$obj = EntradaBlog::get( $id );

$this->params['object'] = $obj;

return $this->render("entradaBlog/edit", &$this->params);

}

}

Esta es la única forma de especificar la vista previo a la versión 0.1.2, con Yupp Framework PHP v0.1.2 se puede retornar solo el modelo y la vista se resuelve de forma automática por Yupp Framework:

class EntradaBlogController extends YuppController {

public function editAction()

{

$id = $this->params['id'];

$obj = EntradaBlog::get( $id );

$this->params['object'] = $obj;

return $this->params;

}

}

En este caso, el framework buscará una vista llamada “edit”, igual al nombre de la acción, dentro del directorio de vistas del controller “EntradaBlog”. También se podría retornar NULL o nada en caso de no querer mostrar modelo. En una próxima versión no será necesario tampoco retornar el modelo, ya que como “params” es un campo de “YuppController” puede ser accedido sin necesidad de retornarlo de forma explícita.

La idea fundamental de estas pequeñas características es reducir la cantidad de código que es necesario escribir para implementar cierta funcionalidad y tener varias formas consistentes de hacer lo mismo de forma que cada usuario programe como más le guste y que el framework no restrinja esa libertad.

sábado, 5 de julio de 2008

Descargar Yupp Framework PHP v0.1.2

Tenemos el agrado de anunciar la liberación de la nueva versión de Yupp Framework PHP, que ya está disponible para descargar desde:

http://groups.google.com/group/yuppframeworkphp
http://code.google.com/p/yupp/downloads/list
http://www.simplewebportal.net/host/1022.htm

Con esta versión hemos resuelto:
  • TICKET #34: mejorar el tema del ruteo implementando un componente especificamente para eso, y agregar custom mappings para poder modificar facilmente que accion de que controller ejecutar si viene determinada url.
  • TICKET #32: cambiar de lugar la funcionalidad de saber el nombre de una tabla dada una clase.
  • TICKET #43: no se verifican constraints sobre relaciones hasOne.
  • TICKET #46: simplificar el acceso a recursos estaticos como imagenes, css y js.

Nuevas características:
  • Helper para cambiar el idioma (disponible para probar desde el ejemplo del blog).
  • Helpers para incluir Javascript y CSS.
  • Ahora las acciones pueden obviar el tener que devolver la vista, pueden devolver solo el modelo y Yupp busca y muestra la vista correcta => escribir menos código!
  • Nuevo paquete de ruteo con mapeos de urls que se pueden configurar a medida para permitir urls que no sigan las convenciones de Yupp.
  • Se modificó el ejemplo del blog para mostrar algunas de las nuevas características.
Gracias por tu atención y si pruebas el framework esperamos tus comentarios!

Nuevo sitio en Google Code

Hemos hecho una cuenta en Google Code para disponer de las herramientas que brindan en beneficio del proyecto. Entre ellas wiki, sistema de tickets, repositorio de archivos y repositorio svn.

En breve empezaremos a utilizar el repositorio svn y a trabajar sobre él, para quien quiera descargarse la última versión de implementación lo pueda hacer.

El link: http://code.google.com/p/yupp/


PD: los últimos archivos generados por el proyecto están ya en el sitio de google code.