sábado, 13 de diciembre de 2008

Presentacion de Yupp PHP Framework en JIIO 2008

Esta es la presentación sobre Yupp Framework PHP hecha en las Jornadas de Informática e investigación Operativa de la Facultad de Ingeniería de Montevideo, Uruguay, que la disfruten.



Yupp PHP Framework
View SlideShare presentation or Upload your own. (tags: framework mvc php)




También puede ser descargada aquí.

Yupp Framework en Barcelona PHP Conference #2

Hoy, navegando por internet, me he topado con el sitio de PHP Barcelona, en una zona del sitio he encontrado varias presentaciones de la última PHP Conference, y para mi asombro en una de las presentaciones aparece Yupp Framework PHP, en las páginas 43 y 44 de la presentación está el logo de Yupp.

Ahora viene la crítica, quien hizo la presentación es Arno Schneider, core team member de Akelos Framework. En la página 44 de la presentación se cataloga a Yupp como "weaker PHP", si bien esto no me ofendió (bueno, Yupp aparece al lado de grandes como Zend, Cake, Akelos, Symphony, etc), mi actitud fue enviarle un mail muy respetuoso donde le consultaba porque consideraba que Yupp era "MVC débil", este email nunca fue contestado, y las razones de que Yupp Framework sea catalogado como "débil" por este señor, serán un eterno misterio. La crítica más dura se le puede hacer por el lado de lo rigurosa de la investigación que haya realizado este señor, nunca me contactó para preguntarme nada del framework, simplemente lo vio y lo catalogó. ¿Donde está la objetividad?, me sigo pregutando. Bien cabe destacar que Yupp se encuentra en etapa de desarrollo, que recién vamos por la versión 0.1.5, mientras muchos de los frameworks listados ahí ya pasan el 1.x.

Pese a todo, sigo apostando a este proyecto, el framework cada día toma más forma, se hace más robusto y estable, se amplía en funcionalidad, etc, etc. Esperemos a llegar a 1.x y ver si Akelos no queda "weaker" al lado de Yupp (tal vez lo catalogue así en alguna presentación futura :), creo que es el miedo de los grandes, repitiendo siempre el mismo verso de "reinventar la rueda" de que algún desarrollador invente una rueda mejor que la suya y lo saque del mercado...

lunes, 24 de noviembre de 2008

Yupp PHP Framework dice presente en las JIIO

Este miércoles 26 de noviembre estaremos dando una charla sobre Yupp en las Jornadas de Informática e Investigación Operativa, organizada por el Instituto de Computación de la Facultad de Ingeniería, Montevideo, Uruguay.

Búsqueda de emails en gmail

GMail es sin duda uno de los mejores sistemas de la web en sí, y uno de los mejores sistemas de email.

Una curiosidad interesante, hoy se me presentó la necesidad de buscar emails enviados desde el buscador (si ya se que hay una sessión de emails enviados, pero igual quise probar el buscador), al notar que los emails enviados por mi tienen un "me" en el sender en la versión en inglés (la que uso), intenté buscar por "me", y el resultado fue que no encontró ningún email enviado por mí.

Aquí va la crítica: como desarrollador de software, pienso que si una página tiene un buscador, debe dejarte buscar en la información como te la muestra, si me muestra "me" en lugar de mi usuario de gmail "pablo.swp", pienso que debería dejarme buscar por "me". Ahora, si busco por "pablo" encuentra en seguida todos los emails enviados por mi.

Simplemente una curiosisdad de gmail.

sábado, 1 de noviembre de 2008

Nuevas ideas para Yupp PHP Framework v0.1.6

Ya empezamos a trabajar en la próxima versión del framework. Estuvimos pensando en varios temas para hacer las tareas más sencillas para quienes recién empiezan a utilizar el framework, algunas son:
  • Bootstrap: La idea es tener por cada componente y script de bootstrap. Un bootstrap es un código que se corre previamente a la operación del sistema, básicamente sirve para ingresar información a la base de datos, información que el componente necesita precargada para su correcto funcionamiento.
  • Modos de ejecución: Esta idea ya está vista en varios frameworks y no nos podíamos quedar atrás. Se tendrían los tres modos de ejecución clásicos: development (desarrollo), testing (test) y production (producción), y posiblemente agreguemos un cuarto modo que podría ser algo como de administración y configuración.
  • Interfaz de generación de tablas en la base de datos: una interfaz simple donde se pueda ver que tablas están creadas y cuales no, y poder crear desde ahí las tablas que falten, y también borrar las que ya hay y generarlas de nuevo. Esto puede ser útil en modo "development" donde es necesario o útil a veces, empezar con una tabla vacía y si hacemos cambios al modelo, poder regenerar la tabla y que esos cambios se vean plasmados en la base de datos. La idea es de a poquito ir tendiendo a un generador automático de bases de datos, que pueda no solo generar (ya hay un generador automático que solo genera), si no ver cambios y actualizar la base sin modificar los datos, o hacerlo lo suficientemente inteligente como para que también pueda migrar datos de una tabla a otra versión más nueva de la misma tabla.
Estas son algunas ideas que intentaremos tener implementadas para Yupp PHP Framework v0.1.6, más las tareas de la hoja de ruta para llegar a dicha versión:
  • TICKET #38: terminar las funcionalidades para inspeccionar la base de datos.
  • Agregar interfaz para generar las tablas de la base de datos.
  • Implementar helpers para formularios y formularios ajax.
  • Implementar custom validators para validación automática de información.

miércoles, 29 de octubre de 2008

Nuevo hotmail, ¿copia de Gmail?

Acabo de ingresar a mi cuenta de hotmail vía web y me encuentro con que tiene nuevo look, lo extraño es que los últimos cambios al aspecto de hotmail lo hacen más y más parecido a Gmail, aunque hice una prueba de enviar mails mientras veía la pantalla y no tiene la capacidad de AJAX que tiene desarrollada Gmail para mostrar los mensajes nuevos sin tener que recargar la página. Aquí dejo el screen shot.

sábado, 25 de octubre de 2008

Nueva liberación de Yupp PHP Framework

Notas de la versión:
  • Versión 0.1.5 del Yupp Framework PHP

Incluye los siguientes componentes:
  • versión 0.5 del YORM (Yupp Object Relational Mapping)
  • versión 0.1.4 del YMVC (Yupp Model View Controller)

Requisitos:
  • Version de PHP: 5.2.x (nosotros utilizamos 5.2.3)
  • Motor de bases de datos: MySQL 5.x o superior (nosotros utilizamos 5.0.41)
  • Tener el modulo de Apache MOD_REWRITE instalado y activado.

Cambios con respecto a la versión anterior:
  1. El mayor cambio de esta versión es el soporte de MTI, que es la posibilidad de mapear un modelo de clases con herencia entre ellas, en distintas tablas. Previamente Yupp solo soportaba mapeo de herencia de una tabla, con esta nueva opción tenemos un componente ORM de gran funcionalidad y flexibilidad a la hora de diseñar los modelos de datos de nuestros sistemas.

  2. Se corrigieron problemas en DAL y PersistentManager.

  3. Se agregó la generación de Foreign Keys para evitar errores de consistencia de datos al eliminar, esto sirve para avisarle al usuario cuando se olvida de actualizar asociaciones antes de eliminar algún objeto.

Que contiene esta liberacion?

Contiene los componentes mencionados antes, el YORM y el YMVC.

Esta liberación contiene un ejemplo de un sistema de Blog sencillo donde
se pueden crear entradas y comentarios, mostrando el funcionamiento básico
del framework, con funcionalidades como:

- Definicion de modelo persistente
- Crear modelo
- Modificar modelo
- Obtener modelo
- Definicion de controladores
- Definicion de vistas
- Uso de helpers basicos
- Validacion automatica de informacion


Para correr el ejemplo

Debes tener un servidor Apache con soporte para PHP corriendo.
Debes tener PHP 5.2.x o superior.
Debes tener MySQL 5.x o superior instalado y corriendo.

Descomprime el contenido de la liberacion que descargaste desde www.SimpleWebPortal.net
en un directorio de tu servidor Apache, accesible desde un browser,
por ejemplo /www o /public_html.


Configuracion de la base de datos y creacion de la base:

Para configurar los datos de conexion a la base de datos MySQL se debe
editar la informacion presente en el archivo:
"/core/config/core.config.YuppConfig.class.php",
modificando el campo $dev_datasource, estableciendo los valores correctos
para cada clave de dicho array: url, user, pass y database.

Y se debe crear la base de datos con el nombre que hayas configurado en
"/core/config/core.config.YuppConfig.class.php" en el campo "database".


Generacion de las tablas:

Debes editar el archivo "/index.php" descomentando la siguiente linea:

PersistentManager::getInstance()->generateAll();

Esto generara las tablas automaticamente a partir de las clases de modelo
en "/model", al acceder al sistema.

Debajo se explica como acceder al sistema, luego de haber accedido por
primera vez vuelve a comentar esa linea ya que si no la comentas
generara un error porque las tablas ya existen. En las próximas versiones
intentaremos crear un mecanismo más amigable para generar las tablas
en la base.


Acceder al ejemplo:

Accede al directorio donde se descomprimió Yupp Framework PHP desde un
browser, aparecerá una página con links, esos links ejecutan las acciones
por defecto de los controladores existentes, el único controlador que
tiene utilidad por el momento es "EntradaBlog" que es de donde se permite
crear entradas para el blog.


Cualquier duda o sugerencia, envianos un mail desde http://www.SimpleWebPortal.net > contacto.
Tambien puedes contactarnos a por nuestro blog: http://YuppFramework.blogspot.com.


Descargas:


Pablo Pazos Gutierrez
Project Leader
www.SimpleWebPortal.net

viernes, 12 de septiembre de 2008

El nuevo navegador de Google es incompatible con Google Groups

He descargado el nuevo navegador de Google, Google Chrome, un navegador sencillo, elegante, ina interfaz intuitiva, es rápido, cada pestaña se procesa en un thread distinto, lo que permite que las demás pestañas no se bloqueen cuando una se bloquea por un javascript con errores u otros motivos.

Ahora bien, voy a editar uno de mis grupos de google y al quere crear una página obtengo esto:

Tú navegador web no admite la edición de páginas. Descarga una copia nueva de Firefox o Internet Explorer para editar las páginas.

:D

sábado, 30 de agosto de 2008

ORM: Mapeo de herencia a multiples tablas

Como es sabido, Yupp Framework PHP implementa mapeo de herencia de una sola tabla, pero para la próxima versión (0.1.5) queríamos implementar también la posibilidad de mapear herencia a diferentes tablas, pudiendo así optar por cualquiera de las dos opciones según las necesidades del problema a resolver.

Estudiando el tema, tiene dos puntos bien importantes, la generación del esquema y como son pedidos los datos a la base. En primer lugar, la generación del esquema debe tener reglas que permitan saber cuando una clase se debe mapear a la misma tabla que su superclase o a una tabla distinta, para esto decidimos usar el atributo "withTable" con el que cuentan todas las clases persistentes, de este modo si una subclase define este atributo en un valor distinto al de alguna superclase, automáticamente se toma como que para esa clase (y sus subclases que sigan las mismas reglas) se genere una nueva tabla.

Por otro lado, para obtener datos de la base, como una instancia de una clase puede estar dividida entre varias tablas, debe haber algún mecanismo que permita hacer joins entre las tablas para reconstruir el registro completo, y así levantar toda la información de una instancia de una determinada clase. Para esto se inyecta un nuevo atributo "super_id" que es una foreign key a la tabla que mapee las superclases de la clase que se quiere cargar, y el join se hace por ese atributo con el identificador en la tabla de las superclases. Esto es medio complicado de explicar pero va a ser muy simple de utilizar, más que simple, va a ser transparente al usuario, ya que toda la responsabilidad de cargar la información correctamente corre por parte del framework.

Como se mencionaba antes, esta característica da más flexibilidad a la hora de resolver un problema, por ejemplo en el caso de tener muchas clases que heredan de una sola, en el caso de mapeo de una sola tabla la cantidad de columnas de la misma sería muy alta, y se podría "dividir" el problema mapeando algunas clases en otras tablas y dejando que las clases más utilizadas se sigan mapeando en la misma tabla que la superclase (para que sea más rápida la carga por no tener que hacer joins).

Esperamos tener esta caracteristica funcionando para la semana que viene y con suerte también tendremos la liberación de la próxima versión del framework.

viernes, 15 de agosto de 2008

Visión a futuro

Con la versión 0.1.4 del framework vimos a Yupp crecer como nunca antes, logrando mejoras y nuevas características que lo hacen más estable, brindando más opciones y aún conservar la simplicidad (tanto de las soluciones como a nivel de usuario), cosa no menos importante porque en general agregar nuevas características implica complicar las cosas, pero con la premisa de la simplicidad siempre en mente (premisa principal del framework) tratamos de llevarla a la práctica siempre.

Ahora bien, ¿qué tenemos?, tenemos un framework con una implementación completa del patrón MVC, tenemos una implementación completa de un primo lejano del patrón Active Record, tenemos generación automática de las tablas de la base de datos, tenemos integración con 2 motores de bases de datos (MySQL y SQLite), tenemos convenciones que, si se siguen, nos simplifican la vida (que poner, donde ponerlo, como llamarlo, etc), tenemos una forma sencilla de definir controladores, tenemos una forma sencilla de definir las vistas, tenemos helpers que nos ayudan a generar vistas, tenemos soporte de templates que nos ayudan a reutilizar código entre vistas (páginas), tenemos soporte para layout que son simplifica el tema de definir un mismo formato general para un conjunto de páginas y poder actualizarlo y mantenerlo de forma sencilla, tenemos soporte completo para i18n (una gran cosa), tenemos una primer integración con AJAX (la parte de llamadas no de efectos y animaciones), tenemos soporte para custom mappings, que son mapeos de las urls que nos dejan apuntar al controlador y acción que querramos, tenemos soporte para filtros de acciones que permiten ejecutar una serie de funciones, definidas por el usuario, antes y después de ejecutar la acción del controlador, en fin, tenemos un lindo framework, pero eso no alcanza, además recién estamos en 0.1.4, y mi visión es que recién en v0.2.0 se va a llegar a un framework completo con el cual se pueda desarrollar cualquier sistema y ponerlo en producción.

Ahora el trabajo estará concentrado en ampliar los helpers, completar la integración con AJAX para llamadas y procesamiento de respuestas JSON, integrar algún otro motor de bases de datos (tenemos a PostgreSQL en la mira), seguir mejorando y estandarizando la API y corrigiendo bugs conocidos y que encontremos. Además trabajaremos en terminar la definición de componentes, concepto importante dentro del sistema, para que el día de mañana se puedan desarrollar componentes e instalar en sistemas Yupp que estén en producción, de forma sencilla, lo que permitiría poder encarar proyectos de mediano y gran porte en distintas etapas, dejando en cada una un sistema 100%, y agregando funcionalidad en distintas etapas. Para la versión 0.3.0 del framework buscaremos proponer un proceso de desarrollo con Yupp Framework PHP que intentará definir las etapas básicas del desarrollo, orientado al framework, señalando mejores prácticas y orientando al desarrollador, de forma de hacer el proceso lo más rápido y bien posible. Ya hablaremos más de esta parte en el futuro.

Noticia: hay nueva documentación en el sitio sobre Yupp Framework PHP, dejo el link: http://www.simplewebportal.net/yupp_framework_php_doc/

Gracias por leer,
Pablo.

domingo, 10 de agosto de 2008

Tenemos nueva versión! Yupp Framework v0.1.4

Apuramos el paso en algunas áreas por posibles proyectos que pueden salir en torno a Yupp, esta versión tiene algunas características nuevas y muchas correcciones, cave destacar que se mejoraron algunas funcionalidades de persistencia, del sistema de layouts, se agregó el primer helper ajax usando prototype, se implementó el concepto de filtros y se muestra un ejemplo de uso de los mismos para verificar si un usuario tiene permisos para editar un blog, y muchas más cosas...

Por descargar e informe de cambios de la versión ver: http://www.simplewebportal.net/host/1022.htm

sábado, 9 de agosto de 2008

Nueva documentación disponible

Publicamos en el sitio de Simple Web Portal la primera documentación de referencia de Yupp Framework PHP, está accesible desde aquí:


Seguimos trabajando en la doc y en la liberación v0.1.4 que esperamos tener pronta mañana.

lunes, 4 de agosto de 2008

Nueva versión 0.1.3!!!

Hemos hecho la nueva liberación y alcanzado el hito de la v0.1.3 marcado en la hoja de ruta.

Los cambios en esta versión son:

1. Soporte para layouts. Como demo, hay un layout definido para el componente blog y la vista list de entradaBlog incluye ese layout. El layout muestra una barra con selección de idioma del blog.

2. Moficación a la forma en que se verifican los mappings de ruteo en routing.Mapping.

3. Se agregó una operación toJSON para las clases del modelo, no está completa.

4. Se agregó soporte para SQLite, para configurar que dbms se usa hay que modificar la información en YuppConfig.

En cuanto a JSON, todavía falta un poco para generar un JSON completo de todo el modelo.

Por mas info:

Descargas: http://www.simplewebportal.net/host/1022.htm

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.

domingo, 22 de junio de 2008

Nueva versión de Yupp Framework PHP 0.1.1

Como anunciamos anteriormente ya está disponible para descargar y probar la nueva versión de Yupp Framework PHP. La nueva versión v0.1.1 agrega nuevas características y mejoras al framework, que son las primeras mejoras de tantas otras que iremos haciendo hacia la versión v0.2.0 del framework.

En esta versión incluye:

- Redirects a acciones de controladores.
- Corrección de errores.
- Simplificación de render y redirect en las acciones de controladores.
- * Soporte para templates *
- Se agregó una clase que almacena variables de contexto que simplifica el acceso a variables globales a la aplicación.
- Se agregaron helpers para mensages i18n y para templates.


Para descargar siga el siguiente link: http://www.simplewebportal.net/host/1022.htm
También lo puedes descargar desde el grupo google del proyecto: http://groups.google.com/group/yuppframeworkphp

jueves, 19 de junio de 2008

Próxima liberación Yupp Framework PHP v0.1.1

Como ya avisáramos desde nuestro grupo google (de forma informal) , este fin de semana estaremos liberando una nueva versión de Yupp Framework PHP, esta versión agrega características y resuelve algunos problemas menores y es la primera de la hoja de ruta hacia la versión 0.2.0 del framework.

En esta versión 0.1.1, algunas de las nuevas características son:

- Redirects a acciones de controladores.
- Corrección de errores.
- Simplificación de render y redirect en las acciones de controladores.
- * Soporte para templates *
- Se agregó una clase que almacena variables de contexto que simplifica el acceso a variables globales a la aplicación.
- Se agregaron helpers para mensages i18n y para templates.

La versión 0.2.0 será una versión 100% funcional, estable y completamente documentada. El objetivo es que pueda comenzar a ser utilizado en producción para desarrollo de sistemas pequeños y prototipos, ya que más adelante agregaremos características y herramientas que permitan trabajar con sistemas más grandes de forma sencilla.

Saludos a todos y gracias por el interes, los comentarios son bienvenidos!

miércoles, 4 de junio de 2008

Presentación oficial del grupo google de Yupp Framework PHP

Dándole la importancia que se merece hago un nuevo post para la presentación del grupo google de Yupp Framework PHP.

El grupo es un medio más para acercar el proyecto a la comunidad de desarrolladores PHP, para difundirlo entre quienes realmente lo van a usar y para escuchar sus sugerencias y aportes al proyecto, para así hacerlo mejor para todos.

La dirección del grupo es: http://groups.google.com/group/yuppframeworkphp

El grupo es un lugar donde discutir detalles de implementación, donde se harán anuncios sobre el avance del proyecto, y donde publicaremos documentación y las últimas descargas a medida que estén disponibles.

El proyecto está abierto a todos quienes quieran aportar su granito de arena, sean expertos o principiantes, para todos quienes estén interesados en programación, gestión de bases de datos, diseño de software, patrones, procesos de desarrollo, testing, frameworks, etc, todos son bienvenidos.

lunes, 2 de junio de 2008

Página activa de nuevo!

Por suerte ya fueron superados los problemas por el incendio en el datacenter y la página web está de nuevo operativa.

domingo, 1 de junio de 2008

Pagina web offline por incendio en datacenter

Lamentablemente nuestra página web oficial www.SimpleWebPortal.net está inaccesible debido a un importante incendio en el datacenter donde es alojada.

Debido a que últimamente hubo mucha gente interesada en el framework y lo quería descargar, creamos un grupo de google donde se publicarán las descargas que estaban en el sitio para que puedan seguir descargándolo y probándolo sin problemas.

La dirección es http://groups.google.com/group/yuppframeworkphp, y ya fueron publicados el archivo con la última liberación del framework y la documentación sobre como crear un sistema de blog simple.

Este grupo servirá también para discutir detalles de implementación y como vía alternativa de comunicación con la comunidad. Por lo pronto estaremos al tanto de las noticias sobre el servicio de hosting, y cualquier actualización que hagamos será publicada en el grupo y notificado aquí en el blog.

Por más información sobre el incendio en los datacenters: http://hostingdelsur.net

sábado, 31 de mayo de 2008

Nueva documentación de Yupp Framework PHP

Hemos publicado un documento que explica los pasos necesarios para empezar a desarrollar aplicaciones web utilizando Yupp Framework PHP.

El mismo trata el ejemplo de desarrollo de un sistema simple de blog, donde los usuarios serán capaces de crear entradas y agregar comentarios. Dicho ejemplo viene implementado junto con la descarga de Yupp Framework v0.1.

Para descargarlo puedes acceder aquí.

domingo, 25 de mayo de 2008

Tercer liberacion de Yupp Framework PHP !!!

Y como lo prometido es deuda...

Esta liberacion corresponde a Yupp Framework PHP en su version 0.1, que se compone de la version 0.3 de YORM (Yupp Object-Relational Mapping) y la version 0.1 de YMVC (Yupp Model View Controller), los cuales son los componentes principales del Yupp Framework PHP.

Esta version viene con un ejemplo de implementacion de un Blog sencillo que permite crear entradas y comentarios. Cave destacar que es la primer implementacion 100% mvc usando Yupp Framework PHP y muestra distintos aspectos de funcionalidades provistas por el framework, entre ellas:
  • Manejo de modelo.
  • Ruteo y ejecucion de acciones de controladores.
  • Manejo de vistas.
  • Utilizacion de helpers.
  • Validacion automatica de informacion.
Por mas informacion y descargarlo puedes hacerlo desde > aqui <

La descarga incluye informacion de la version, informacion de como instalarlo y ponerlo a funcionar y requisitos de instalacion.

Cualquier comentario lo puedes hacer aqui en el blog o mediante la pagina de contacto de www.SimpleWebPortal.net

miércoles, 21 de mayo de 2008

Proxima liberacion

Estamos trabajando para poder este fin de semana hacer una nueva liberacion de Yupp Framework PHP.

Esta liberacion contendra la version 0.3 del YORM (el componente de modelo persistente) y la version 0.1 del componente MVC que esta bastante avanzado pero como es la primer liberacion sale con version 0.1, luego veremos como ajustar el versionado a medida que se agregan caracteristicas.

En cuanto al YORM se hicieron cambios importantes en la parte de consultas para poder hacerlas mas sencillas y potentes. Tambien se mejoro y se integro la parte de validacion de informacion, esta caracteristica aunque existia en las liberaciones anteriores, no fue expuesta para probar, ahora esta 100% accesible y la liberacion va a incluir algunos ejemplos de uso.

En el YUPP MVC (o YMVC) implementa lo que seria el ruteo de requests a ejecucion de acciones de controladores, generacion de modelo, manejo de vistas y contiene algunos helpers basicos para mostrar informacion del modelo y errores que puedan haber ocurrido. Tambien fue implementado un controlador por defecto que permite hacer CRUD (Create Retrieve Update Delete) para cualquier clase de dominio (clase persistente definida con YORM). Y viene con 4 vistas genericas para listado, creacion, edicion y vista de detalles que funcionan con informacion provista por las clases de dominio (definidas con YORM).

Bueno, esperamos llegar al fin de semana con esta nueva liberacion, si no, sera para el proximo.

martes, 15 de abril de 2008

Primer versión del logo de Yupp Framework PHP

Es un placer presentarles en nuevo logo de Yupp Framework PHP.
Los comentarios son bienvenidos.

lunes, 7 de abril de 2008

Segunda liberación del Yupp Framework PHP

El componente de modelo persitente YORM en su versión 0.2 está listo para ser descargado y probado.

En el post anterior donde avisábamos de la liberación se comentan las características más importantes en esta liberación, entre lo más notable está el soporte para carga perezosa, que se une a la previa carga en cascada, y la operación *Contains sobre objetos del modelo.

Puedes encontrar toda la información de la liberación en la documentación dentro del .zip en la página de descargas.

Cualquier duda o comentario será bien recibido y lo tomaremos en consideración.

La versión 0.3 del YORM estará lista mas o menos en un mes, con nuevas características, pero sobre todas las cosas será una liberación de estabilización, donde se harán pruebas exhaustivas, se revisará la API y se documentará lo mejor posible. Intentaremos con esta versión del YORM liberar tambén la primer versión (v0.1) del componente MVC del Yupp Framework PHP, el YMVC.

sábado, 5 de abril de 2008

Anuncio de liberación de la versión 0.2 del YORM

En el día de mañana estaremos liberando la versión 0.2 del YORM, el componente de modelo persistente del Yupp Framework PHP.

Aquí va un resumen de algunas de las nuevas características:
  • Carga de relaciones bidireccionales instanciadas unidireccionales corregida.
    Es básicamente la consideración de que si tengo una relación bidireccional entre dos clases, puedo tener una instancia de la relación que no es bidireccional, a no ser que tenga una restricción no estructural que diga lo contrario.

  • Se agrego operacion *Contains( id ) para preguntar si un atributo hasMany contiene un objeto con ese id.
    Si una clase Empresa tiene un atributo hasMany llamado "personas" (o sea que tiene asociadas varias "personas"), puedo preguntarle a una instancia de Empresa: $emp->personasContains( 123 ), eso retornará un booleano y será true solo si la lista de personas de la empresa tiene una persona con id 123.

  • Soporte para multiples relaciones entre las mismas 2 clases.
    Esto es, por ejemplo cuando tengo artículos escritos y autores, y en cada artículo quiero tener asociado un autor principal y los autores secundarios, antes no se podía modelar algo así de forma estándar. Ahora hay una forma "Yupp" de hacerlo ;)

  • Soporte para carga perezosa (lazy loading).
    Esta es la característica más importante de esta liberación, la capacidad de poder cargar un modelo de forma lazy, esto quiere decir que se puede cargar una instancia de una clase sin cargar las instancias de las clases asociadas, cosa que antes no se podía hacer y se cargaba en cascada (cargando una instancia se cargaban todas las de los elementos asociados). De esta forma, se cargan los objetos asociados solo si son utilizados, lo que representa un gran ahorro en el número de consultas que se deben hacer a la base de datos.

Entre hoy y mañana estaremos terminando de actualizar los tests para poder correr esta nueva versión, y en la noche estará publicada la nueva versión.

miércoles, 19 de marzo de 2008

Primer liberación del Yupp Framework

Esta liberación de código del Yupp Framework está relacionada con uno de los componentes principales del mismo, el YORM. Este componente se encarga de manejar todo el acceso a datos, definición de modelos y generación de esquemas, en una forma 100% orientada a objetos, simplificando las tareas en dichas áreas.

Hoy con la versión 0.1 de este componente se inicia un largo camino para este framework que espera y apunta a ser el más simple y productivo del mercado (en frameworks PHP, claro está).

En esta primer versión encontramos una primer solución para definir clases del modelo, generar esquemas, persistir datos y obtener datos, sin necesidad de codificar una sola línea de SQL y con una configuración mínima (apenas los datos de conexión a la base). Esta versión cuenta con soporte para definición del modelo de datos, soporte de relaciones de herencia y relaciones entre clases con cardinalidades 1-1, 1-n y n-n unidireccionales o bidireccionales.

Aquí está es link para descargar esta versión.

Problemas al acceder al nombre de la clase en un esquema de herencia desde metodos estaticos en PHP

Digamos que tenemos un esquema como el siguiente, en donde hay dos clases que mantienen una relación de herencia, y hay un método estático definido en la clase padre, el cual accede al nombre de la clase y es invocado por la clase hija. El resultado esperado sería que el nombre de la clase fuera el de la clase hija, pero como veremos en el ejemplo, el resultado es la clase padre.
class A {
public static function
who() {
echo
__CLASS__;
}
public static function
test() {
self::who();
}
}

class
B extends A {
public static function
who() {
echo
__CLASS__;
}
}

B::test();

Lo descrito anteriormente sucede porque PHP resuelve el nombre de la clase por la clase a la cual pertenece el método que se está invocando, lo que tal vez se puede ver como una violación al polimorfismo, es decir, que esperamos que el código anterior devuelva el nombre de la clase sobre la cual es invocado el método, pero no es así.

Según el manual de PHP, con la versión 5.3.0 este tema será resuelto de forma nativa por PHP, la solución a este problema lleva el nombre de "Late Static Bindings". Lo que básicamente agrega esta solución es una palabra clave que ayuda a referenciar a la clase correcta en tiempo de ejecución conservando el comportamiento deseado en un ambiente Orientado a Objetos con polimorfismo. Este es el ejemplo que se ofrece en la documentación de PHP:

class A {
public static function
who() {
echo
__CLASS__;
}
public static function
test() {
static::
who(); // Here comes Late Static Bindings
}
}

class
B extends A {
public static function
who() {
echo
__CLASS__;
}
}

B::test();


En este ejemplo se agrega la palabra clave "static" para referenciar a la clase correcta en tiempo de ejecución, devolviendo el valor correcto y esperado para un ambiente que soporta polimorfismo.

Por más información sobre el tema, accede al manual de PHP - Late Static Bindings.

viernes, 29 de febrero de 2008

Metadata en nombres de archivos PHP

Por suerte con PHP no hay restricciones o estandares a seguir con respecto al nombrado de los archivos PHP. Algo que no es nada nuevo es que podemos usar el nombre del archivo para comunicar más información que solo el nombre del archivo. Algo muy usado es ponerle "archivo.class.php" o directamente "archivo.class" a los archivos PHP que contienen una o más clases. Se puede notar que ni siquiera es requerido que el archivo tenga extensión ".php".

A continuación voy a mostrar algunos ejemplos de nombrado de archivos que pueden ser de utilidad al implementar aplicaciones.


1. Paquetes codificados en el nombre del archivo

PHP no soporta paquetes, lo que es un dolor de cabeza para la implementación de aplicaciones de cierto tamaño. Hay muchas formas de simular la presencia de paquetes en PHP, en este caso se hace con el nombrado de los archivos.

Los paquetes son una setructura jerárquica similar a una estructura de directorios, lo paquetes pueden contener archivos y otros paquetes. Por ejemplo, en Java, los paquetes coinciden con la estructura de directorios en donde se encuentran los archivos (paquetes físicos), en cambio, en C# se pueden definir una especie de paquetes lógicos llamados "namespaces".

Usando el nombre de los archivos para codificar paquetes lógicos nos evitamos problemas como tener dos archivos con el mismo nombre, o simplemente tener un poco más de orden cuando trabajamos con gran cantidad de archivos, y se podrían tener una inmensa cantidad de archivos, en el mismo directorio, perfectamente distinguidos entre si y fáciles de encontrar a simple vista.

Digamos que en nuestro proyecto tenemos 3 paquetes: "core", "core.utils", "core.db". Por otro lado tenemos 100 archivos, 20 del paquete "core", 40 de "core.utils" y otros 40 de "core.db". Y llamamos a los archivos dentro de estos paquetes de la siguiente forma:

- core.UnArchivo.php
- core.OtroArchivo.php
- ...
- core.utils.UnArchivo.php
- core.utils.OtroArchivo.php
- ...
- core.db.MySQL.php
- core.db.PostgreSQL.php
- ...

En principio, estos nombres pueden servir para ver de forma simple que archivos están en que paquete, simplemente listando los archivos ordenados por nombre.

Otra ventaja, ya desde el punto de vista del sistema que estemos construyendo, es por ejemplo hacer un script para cargar o incluir todos los archivos de determinado paquete, por ejemplo, la siguiente función incluye todos los archivos del paquete:

function includeDB( $path )
{
$d = dir($path);

while (false !== ($entry = $d->read())) // Por cada entrada del directorio
{
if (is_file($path . "/" . $entry)) // Si la entrada es un archivo
{
if ( strcmp("core.db", substr($entry,0,7)) == 0 ) // Si el nombre empieza con "core.db"
{
include_once($path . "/" . $entry); // Lo incluye para usarlo
}
}
}
}

Explicación del código:

$path es la ruta del directorio que contiene los archivos. No se verifica que sea correcta, esta verificación se podría agregar para hacerlo mas robusto.

$entry son los archivos del directorio.

Lo demás ya se explica con los comentarios en el código.


Tambien se podria usar el nombrado para hacer un class loader (como el del codigo anterior) mas inteligente, sin necesidad de incluir todos los archivos del sistema, si no incluyendo solo los que se van a usar.



2. Decir que contiene el archivo

Un archivo php puede contener cualquier cosa, ya que no es mas que un archivo de texto.

Pensando en alguno de los posibles contenidos que puede tener un archivo php podría nombrar:

- scripts (en el sentido de tener un código que se ejecuta automáticamente al cargar el archivo)
- funciones
- clases
- interfaces
- paginas (código HTML mezclado con script PHP)

Entonces, podríamos utilizar el nombre del archivo para decir que tipo de contenido tiene, en los casos anteriores podríamos tener los siguientes nombres:

- DownloadFile.script.php
- String.functions.php
- Invoice.class.php
- Clonable.interface.php
- Contacts.page.php


También, esta notación puede servir para saber a simple vista que tiene cada archivo, o también para cargar los archivos por su tipo, por ejemplo si quiero cargar todas las clases de un determinado directorio, puedo usar el código anterior y modificarlo un poco y buscar los archivos que tienen "class" adelante del ".php" como en el siguiente ejemplo:

function includeDB( $path )
{
$d = dir($path);

while (false !== ($entry = $d->read())) // Por cada entrada del directorio
{
if (is_file($path . "/" . $entry)) // Si la entrada es un archivo
{
if ( preg_match("/(.*)class\.php$/", $entry, $matches) ) // Si el nombre tiene "class" antes del ".php"
{
include_once($path . "/" . $entry); // Lo incluye para usarlo
}
}
}
}


Una posible aplicacion de esto es si uno tiene scripts de testing para correr, y algun otro script encargado de correr los tests, y los test se llaman por ejemplo "paquete.Nombre.test.php", puedo buscar todos los tests, incluirlos, correrlos y mostrar los resultados. A simple vista se puede ver el poder con el que se cuenta simplemente por nombrar los archivos de cierta forma.


3. Paquetes y contenido

Y podemos también decir en que paquete esta un archivo y ademas poner que tipo de contenido tiene, por ejemplo:

- core.db.MySQL.class.php
- core.String.functions.php
- ...


Conclusión:

Podemos utilizar los nombres de los archivos para poner metadatos que nos dan información sobre el archivo, que lugar ocupa o que responsabilidad tiene en el sistema y que tipo de contenido tiene. Esa información la podemos utilizar para hacer sistemas mejores, mas eficientes, mas potentes, etc, ademas de que es una buena forma de ordenar los archivos cuando tenemos un gran numero de ellos. Y como vimos es muy simple hacer scripts que procesen los nombres de los archivos, utilizando funciones del file system como dir() para leer nombres de archivos y funciones de strings o expresiones regulares para filtrarlos.

miércoles, 27 de febrero de 2008

Consultas sobre archivos de un directorio en PHP

Problema: necesidad de obtener los nombres de archivos de un directorio filtrados por alguna condición.
Solución: utilizar expresiones regulares para las condiciones sobre los nombres de archivos del directorio.

function getFileNames($path, $match = null, $groups = null)
{
if (is_dir($path))
{
$res = array();
$d = dir($path);

while (false !== ($entry = $d->read()))
{
if (is_file($path . "/" . $entry))
{
$matches = null;
if ($match)
{
if (preg_match($match, $entry, $matches))
{
if (!$groups) $res[] = $entry;
else
{
$gentry = "";
foreach($groups as $i)
{
$gentry .= $matches[$i];
}
$res[] = $gentry;
}
}
}
else // Si no paso match, le entrego derecho la entrada.
{
$res[] = $entry;
}
}
}
$d->close();
return $res;
}
else
{
throw new Exception("El directorio: $path no existe.");
}
}


Explico el código:

function getFileNames($path, $match = null, $groups = null)

path: directorio del cual se quieren leer los nombres de archivos
match: expresión regular con la cual se filtran los nombres de archivos (si no se pasa nada, se devuelven los nombres de todos los archivos del directorio)
groups: solo se usa si match no es null, y se usa para seleccionar los grupos de la expresión regular cuando coinciden los nombres de los archivos con match. Más adelante explicaré como es que se usa, pero la idea es poder sacar pedazos del nombre del archivo y devolver eso, por ejemplo si tenemos infomración codificada en el nombre como: paquete.Clase.class.php, y me interesa devolver solo el nombre de la clase, o sea "Clase". Si groups es null se devuelven los nombres de todos los archivos que coincidan con la expresión regular match.

if (is_dir($path))
Verifica si path es un directorio válido, si no lo es lanza una excepción.

$res = array();
Se crea la lista de nombres a devolver, todos los nombres de archivos que coincidan con los criterios serán incluidos en res.

$d = dir($path);
Se abre el directorio para comenzar a leer sus entradas. Para entender como trabaja dir() visita el manual.

while (false !== ($entry = $d->read()))
Recorre cada entrada del directorio, estas son archivos y subdirectorios, entry es el nombre del archivo o subdirectorio actual en la recorrida.

if ($match)
{
if (preg_match($match, $entry, $matches))
Si match no es null, verifico que entry coincida con él. Para entender como trabaja preg_match, visita el manual. En matches se guardan los grupos definidos en match que coincidieron con entry, y si groups no es null los voy a usar para armar los nombres que voy a devolver.

if (!$groups) $res[] = $entry;
else
{
$gentry = "";
foreach($groups as $i)
{
$gentry .= $matches[$i];
}
$res[] = $gentry;
}
Si groups es null, simplemente agrego entry a la solución, o sea, devuelvo el nombre del archivo así como está y se que ese nombre coincide con la expresión regular match.
Si groups no es null, busco en matches los grupos indicados por groups, concatenando dichos grupos, la concatenación de todos los grupos seleccionados es el nombre a incluir en la solución. De esta forma, si los archivos tienen nombres por ejemplo "paquetes.Clase.class.php", podría devolver "Clase.php", luego mostraré ejemplos de como se hace esto.

else // Si no paso match, le entrego derecho la entrada.
{
$res[] = $entry;
Si match es null, simplemente agrego a la solución el nombre del archivo sin procesarlo.

$d->close();
return $res;
Cierra el directorio y devuelve la solución.


Algunos ejemplos de uso:

Para entender que hacen necesitas entender las expresiones regulares usadas, si no sabes mucho de expresiones regulares te aconsejo que busques en google algún manual de expresiones regulares.

En estos casos usaremos como directorio "." que es el directorio actual. Puedes cambiarlo y utilizar otro directorio si lo deseas.

getFileNames("."); // Todos los archivos, no hay ninguna restricción.

getFileNames(".", "/\.php$/i"); // Todos los archivos con extensión ".php"

getFileNames(".", "/^utils\.(.*)\.php$/i"); // Todos los ".php" del paquete utils (pensado para nombres con la forma "paquete.Class.php", en este caso paquete es "utils"). Observar el "(.*)", eso es un grupo y se podría usar el parámetro groups para obtenerlo, como veremos en el siguiente ejemplo.

getFileNames(".", "/(.*)\.php$/i", array(1)) ); // Todos los ".php", pero sin el .php (ver que la regexp match tiene un grupo y en el array selecciono ese grupo). El grupo 0 (cero) coincide con el nombre del archivo.

getFileNames(".", "/^utils\.(.*)\.php$/i", array(1,5,0)) ); // Todos los php del paquete utils, idem anterior, ahora sin el "utils." Observar todo lo que se pasa en groups, ver que el grupo 5 no existe y por lo tanto no es considerado, luego si tengo un archivo "utils.Class.php", el resultado de esto es "Classutils.Class.php", porque concatena el grupo 1 ("Class") y el grupo 0 (que es el nombre del archivo), y ver que se respeta el orden establecido en groups.


En conclusión, no solo se logró hacer una función que resuelve el problema, si no que se obtuvo una solución que puede hacer un preproceso de los nombres a devolver (gracias a groups), lo que permite extraer información presente en los nombres de los archivos y concatenarla a gusto.

Siéntanse libres de utilizar este script, modificarlo a gusto, hacer comentarios y mejoras sobre él. Y si lo incluyen en algún proyecto no se olviden de hacer referencia a este blog y/o a este post.