Archivo

Archivo para la categoría ‘Tecnología’

Crea archivos PDF como si fueran una página Web

Miércoles, 26 de Noviembre de 2008

Un requerimiento común en los proyectos es la generación de reportes de los datos almacenados dentro de la aplicación. Lamentablemente las herramientas disponibles en PHP para la generación automática de reportes es bastante limitada, y posiblemente el único formato que disponemos para la presentación de estos datos de una manera agradable es el PDF.

Sin embargo, la generación de PDF es bastante tediosa, usualmente las librerías de PHP disponibles para la generación de estos archivos requieren manipular detalles como celdas, píxeles, posiciones absolutas en las coordenadas X e Y, etc. Realmente, muy poco ágil.

Afortunadamente existe una de las herramientas más increibles que haya encontrado navegando en la web: DOMPDF, esta librería permite convertri cualquier página web en un archivo PDF, practicamente con ningún esfuerzo. Es realmente impresionante, incluso tiene soporte para archivos externos css, tipos de letras, y no depende de ninguna extendión de php.

DOMPDF soporta declaraciones básicas de CSS 2.1, los grandes faltantes son position y float, lo cual hará que el diseño de tus HTML para la generación automática de PDF, se parezcan más a algo hecho en Dreamweaver.

Sin duda, las horas que ahorra esta librería son innumerables. Puedes tener una versión html de tu reporte para ser visualizada con el explorador, y usar el mismo código para la versión PDF.

La magia no termina aquí. He escrito además un helper para mi framework favorito, cakephp, que facilita en gran medida la utilización de esta librería. Aquí cómo usarlo:

  • Descarga DOMPDF y coloca el contenido dentro de app/vendors/dompdf. Destro de esta carpeta debería estar el archivo dompdf_config.inc.php
  • Descarga el helper desde su repositorio y colócalo en app/views/helpers
  • Abre el archivo app/routes.php y coloca esta línea: Router::parseExtensions(‘pdf’) al principio de este archivo. Esto hará que las solicitudes como /personas/listar.pdf sean pasadas a traves del layout de pdf y se genere el archivo.
  • Agrega RequestHandler a la lista de componentes de tu controlador, si es que no está incluido aún.
  • Crear el layout: haz un nuevo archivo en app/views/layouts/pdf/default.ctp y coloca tu layout html como quieres que se vea en tu pdf. Haz uno sencillo. Puedes guiarte del layout por defecto que tengas. Aqui tienes un ejemplo. Observa las lineas adicionales al final. Esto hará que se genere correctamente el archivo.
  • Crea la vista correspondiente en la carpeta pdf corerspondiente, por ejemplo: app/views/solicitudes/pdf/ver.ctp.
  • Solicita el url correspondiente con la extension .pdf al final
  • Disfruta :)

Tecnología , ,

Google Chrome: el navegador de Google

Lunes, 1 de Septiembre de 2008

Hoy salió como una explosión inesperada en la blogósfera la noticia de que Google tiene listo un nuevo browser que presenta tanto ideas prestadas como propias para el mundo de los exploradores. El anuncio se hizo por medio de un comic que extraoficialmente se hizo público en el que se mostraba el camino de pensamiento de los desarrolladores para crear este nuevo producto.

Al final del día  publicaron oficialmente el comic, el cual me leí ávidamente para saber de que se trataba. Aquí un pequeño resumen de las características que tendrá el browser:

  • Cada página correrá en su propio proceso, separado de los demás tabs. Este proceso no tendrá privilegio alguno a menos que el usuario así lo decida, lo cual mejorará los peligros de ataques a la máquina, así como las posibilidades de fragmentación y pérdida de memoria. Lo que hará que el browser corra más rápido y seguro.
  • Usará Webkit como su máquina de render, al igual que Safari. Recordemos que webkit es un proyecto derivado de KHTML, del entorno de escritorio KDE. Me encanta KDE, así que estoy orgulloso de Webkit. En mi experiencia con safari, es muchas veces más rápido que firefox para la gran mayoría de las tareas.
  • Contará con una máquina virtual para el javascript. Esto ayudará a que el código corra mucho más rápido y uniforme en cada computadora. También ayudará a que el código generado dinámicamente se corra más rápido porque no será interpretado sino compilado. También evitará pérdidas de memoria puesto que cuenta con un recolector de basura mucho más avanzado que las implementaciones simples de los navegadores acutuales.
  • En cuanto a la interfaz, las pestañas estarán por encima de la barra de dirección, lo cual pienso que es una movida inteligente, aunque no son los primeros en hacerlo. Se podrán quitar todos los controles que sean relativos al navegador para dar una sensación más certera de “la web como plataforma”, al mismo estilo que hace Prism, el plugin para Firefox.
  • La barra de dirección será muy parecida al “Awsome Bar” de Firefox 3, pero no solo podrás hacer búsquedas sobre las páginas visitadas, sino que también te hará sugerencias de páginas populares en la internet… (Me huele a que alguien se aprovechará con publicidad)
  • Al abrir un nuevo tab no aparecerá una página en blanco, sino sugerencias de páginas para visitar, como las que más recientemente abres… (veo más publicidad en camino)
  • Tendrá un modo de pestaña “incógnito”, en el cual no se registra ninguna actividad en el computador de la visitas dentro de ese tab. Me pregunto qué estarían pensado los desarrolladores cuando hicieron eso…
  • Tendá plugins, tal cual como firefox.
  • Tendrá instalado Gears, lo cual puede mejorar ampliamente la experiencia en apliucaciones complejas como Google Reader o la mensajería de MySpace

Lo admito, soy un fan sin remedio de Google… no puedo esperar a mañana, que es el lanzamiento de este nuevo browser.

Tecnología , , ,

Castellaniza los nombre de tus modelos y controllers en CakePHP

Lunes, 2 de Junio de 2008

Actualización: Por alguna razón el nuevo cake se niega a encontrar el singular de las palabras terminadas en “as”, he actualizado las reglas de inflexión para corregir este problema.

¿Alguna vez haz necesitado que los nombres de los modelos que creas en cake estén en español ? ¿Haz sufrido (como yo) los azares de hacer bake de nombres de tablas en español con una “a” al final? La solución es muy simple…. pero primero, algo de historia.

Algo increíble de CakePHP es que tiene la inteligencia necesaria para deducir sinónimos y plurales de palabras, lo cual es muy utlizado dentro de las convenciones de este framework para darle semántica a los nombres de archivo que se han de crear para cada capa de las aplicaciones.

Como podrás recordar, las convenciones dictan que los nombres de tabla deben estar en plural (cosa que a los purista de SQL no les agrada, puesto que una tabla representa una entidad, no un conjunto de ellas), los nombres de modelo en plural, que a veces representan el conjunto y a veces la entidad; finalmente los controladores, que deben ser nombrados igual que las tablas, pues representan acciones sobre el conjunto de datos.

El lado negativo de estas convenciones, es que, como fueron diseñadas para el idioma inglés, no toman en cuenta las inflexiones del lenguaje castellano, que si bien no son más complicadas que la de la lengua anglosajona, son un poco diferentes.

Una de las reglas que difieren entre estas dos lenguas, y que más me mortifican al momento de autogenerar código con CakePHP, son las palabras terminadas por “a”, puesto que el plural en inglés tiene terminación “um”, mientras que en la hermosa lengua castellana, simplemente se le agrega una “s” al final.

Pues bien, los desarrolladores de mi framework favorito sabían que el inglés no es el único idioma, así que dejaron la infraestructura armada para agregar o quitar reglas de inflexión muy sencillamente. A continuación les dejo mi archivo inflections.php, que debe ser depositado en la carpeta app/configs de tu aplicación cake, para ser utilizado. Si se les ocurren nuevas reglas de inflexión, por favor avísenme y se las iremos agregando hasta que cubramos las reglas enteras para el castellano:

$pluralRules = array('/([r|d|j|n|l|m|y|z])$/i' => '\1es','/a$/i' => '\1as');
$uninflectedPlural = array();
$irregularPlural = array();
$singularRules = array('/([r|d|j|n|l|m|y|z])es$/i' => '\1', '/as$/i' => 'a', '/([ti])a$/i' => '\1a');
$uninflectedSingular = $uninflectedPlural;
$irregularSingular = array_flip($irregularPlural);

¡Qué lo disfruten!

Tecnología ,

Cakephp: tu primer proyecto

Miércoles, 16 de Abril de 2008

Usualmente todos los que hemos trabajado con PHP después de un tiempo conociendo el lenguje, llegamos a una misma conclusión en cuanto al código que se puede crear: es un desastre. A pesar de que la responsabilidad de un mal código recae completamente sobre el desarrollador, el lenguaje se lleva también parte de los méritos.

PHP nació de una idea e automatizar ciertas actividades repetitivas en la creación de sitios web, no como un leguaje bien estructurado y definido como lo pueden ser Java, Python y Ruby. Sin embargo su enfoque pragmático y completamente orientado a resolver problemas en el reino del hipertexto lo convirtieron en el leguaje más popular para construir aplicaciones en Internet.

Desde hace un tiempo, PHP se ha reinventado a sí mismo para tratar de alcanzar a sus amigos más estructurados, y para sumarse a la lista de lenguajes orientados a objetos. Aunque no es obligatorio, PHP puede ser utilizado con un enfoque completamente OO, lo cual sin duda ayuda a organizar en código en módulos auto-contenidos, bien cohesionados y a su vez independientes del resto de la arquitectura.

No obstante, es difícil evitar la naturaleza promiscua y rebelde intrínseca de PHP, debido a que no existe esa restricción a la forma en que debe ser desarrollados los componentes. Aunque esto le da al desarrollador la libertad máxima para programar lo que desee, es una pesadilla de dimensiones titánicas para nuevos programadores que deseen sumarse al proyecto. Sin ir muy lejos, de mis propias aplicaciones en los comienzos de PHP, entiendo muy poco de lo que hice.

CakePHP al rescate

PHP necesitaba un framework, y lamentablemente según algunas opiniones, de un momento aparecieron de la nada decenas de ellos, algunos buenos, otros no tanto. Fue en algún momento de la historia que hace su aparición el famoso Ruby on Rails, framework para el lenguaje Ruby, que trae consigo novedosas ideas sobre cómo debe construirse una aplicación web, siendo una de la más emblemáticas la de “convención en vez de configuración”.

Ruby on Rails, se convirtió en una moda. En un instante ya habían cientos de personas evangelizando tanto el lenguaje como el framework, al punto de un fanatismo irracional. Quizás no tan irracional, la facilidad que ofrece para la creación ágil de proyectos no tiene precedentes. Por eso no es de extrañar que empezaran a salir al aire copias del framework en distintos lenguajes de programación. Y como bien adivinarás PHP fue uno de ellos.

CakePHP nace como un clon de Ruby on Rails, según palabras del creador porque “aunque me gusta la limpieza de Ruby, necesito la estructura que brinda Rails“. Y es exactamente eso lo que Cake aporta a los desarrolaldores de PHP, un enlatado muy bien pensado dentro del cual construir tus aplicaciones, lo cual lo ha convertido en un framework, no solo diferente sino uno de los más populares para el desarrollo en este lenguaje.

Anatomía de un proyecto en CakePHP

Para los que ya han trabajado con RoR, encontran que CakePHP es muy similar en la estructura de archivos y de clases que propone. Ambos frameworks obligan al desarrollador a utilizar el patron MVC, el cual es uno de los patrones más utilizados y recomendados para la creación de aplicaciones Web. Las tres capas de este patron son estas:

Modelos: Son representaciones de las entidades que conforman la lógica del negocio. En esta capa se especifican las relaciones entre dichas entidades y también la forma en que han de persistir los estados de las mismas. En un lenguaje más plano, los modelos representan activamente las tablas de una base de datos, archivos XML, servidores LDAP, o cualquier otra fuente de datos, persistente o no.

Controladores: Las clases de esta capa están encargadas de definir las acciones que podrán ser usadas en el sistema, comunicarle a los Modelos que realicen las operaciones necesarias y seleccionar la vista que ha de ver el usuario finalmente junto con las variables que ha de usar la misma para construirse. Esta capa es la que separa los modelos de las vistas, de tal manera que no haya ninguna comunicación directa entre estos dos niveles.

Vistas: Son plantillas de presentación que se arman a partir de las variables que el controlador envía. Se pueden pensar como simples páginas web en el sentido tradicional de PHP, pero con un enfoque más limitado y ordenado. Las vistas no deberían conterner lógica alguna, son simplemente una capa de presentación.

CakePHP tiene además una estructura de archivos fija en la cual se deben colocar todos los archivos que vayan a generarse durante el desarrollo. Esta es una de las características más notorias del uso de “convención en vez de configuración”, si mantienes esta estructura de archivos, el framework sabrá exactamente donde ubicar lo que necesitas, sin necesidad de definir complicados archivos XML, o cualquier otra forma de configuración.

Tecnología ,