ene 29

Me pareció muy simple hacer sólo una clase scaffolding así que además le añadí la posibilidad de la complejidad de los modelos tipo Django, (aunque sin llaves externas, por ahora) y además le puse un tema por defecto para mostrar la información de los modelo con un presentador por defecto en HTML, y ahora un administrador con AJAX.

Las brujas :D magia AJAX? De Blogging

Para explicarlo, ¿qué mejor que una imagen?

En la imagen podemos ver un ejemplo de visualizador de contenido con soporte AJAX, la función contactar (que es llamada por el enrutador al invocar la delegación por el usuario) vincula la variable $c con el contenido de la página, que está en el padre que es la aplicación web. Dicha variable es de tipo array y se utiliza para reemplazar las #etiquetas# de la plantilla HTML usada para mostrar el contenido final, las constantes de idiomas se definen en un fichero PHP que es cargado en el constructor del visualizador donde reside esta función [en realidad donde reside es una clase heredada de esta] , que tiene una clase plantilla asociada para realizar operaciones de lectura de ficheros HTML y procesamiento de reemplazos simples y rápidos con str_replace en lugar de preg_match.
En el código se utiliza la carga de funciones, ésto quizás pueda resultar molesto pero es por temas de eficiencia el que se cargen las distintas partes de zenphp sólo cuando las necesitemos, es decir, cargaremos las funciones HTML para aplicar una validación a un formulario, además podemos insertar el código en JavaScript para añadir las validaciones que creamos oportunas.
Por último se hace una llamada a $this->mostrar_web($c); que lo que hace es tomar el array de contenido y reemplazar todas sus etiquetas para finalmente mostrar la salida por pantalla.

Las validaciones son automáticas, sólo necesitamos añadir el fichero de script y definir qué campos son los que necesitamos validar…

ene 28

Se ha añadido la clase zen_compactador_html que comprime tanto HTML como JavaScript de forma que podemos procesar todo el contenido que queremos añadirle, por ejemplo, cargar un fichero HTML, substituir un par de etiquetas enmarcadas por # , por los datos de una base de datos y por último enviarla del servidor al cliente compactándola…

Pros:

  • Tamaño del código DHTML mucho menor, la tasa de transferencia aumenta por el ahorro de ancho de banda
  • Disminución del tamaño de los ficheros javascript

Contras:

  • Se requiere un tiempo de procesamiento para expresiones regulares que es unas 10 veces más lento que el motor de la clase plantilla porque esta usa reemplazos simples y el compactador procesadores de expresiones
  • Necesitamos pasar todos los ficheros a incluir en la plantilla HTML por el compactado, esto genera más peticiones a Apache

Conclusiones: es necesario realizar los tests de eficiencia para comprobar cuál de las dos opciones es mejor, si usar o no el compactador, es decir, separar por un lado el compactador sólo para comprimir el texto fuente que sea muy pesado así como compactar sólo los scripts grandes y guardarlos ya procesados para que pesen menos….o bien, activar el compactador y procesar todo el contenido de las aplicaciones y scripts PHP mediante el búfer de salida…

ene 25

¿Programación Orientada a Aspectos sobre AJAX?
Propongo la siguiente metáfora: en un sistema AJAX las peticiones son como en una bici los piñones…si me monto en la bicicleta y le doy a los pedales pero no anda es que hay un piñón que hace que se salga la cadena, se trata de encontrar ese pequeño piñón o piñones que no están bien metidos en la cadena para que podamos disfrutar del paseo.
El AJAX de zenphp utiliza mecanismos para que se pueda asociar partes de un fichero HTML a llamadas AJAX y, de forma automática los eventos “onclick” de los enlaces <a> serán reemplazados por la llamada AJAX de Prototype, que por cierto, usa una versión muy ligera con todo lo necesario para que sea más eficiente.

Trae una gestión de detección de errores que hace que si no se puede mostrar una web con javascript o el navegador no soporta AJAX se carga el enlace normal.

Una captura de zen_ajax en funcionamiento:

Poco a poco, automáticamente, instantáneamente…

ene 22

Las librerías de zenphp son contenidos opcionales, no son necesarias en el núcleo,pero ayudan mucho a la hora de añadir funcionalidades a una aplicación. Primero se añadieron las librerías fundamentales como las de correo y gráficas (charts), ahora le toca el turno a las más avanzadas:

  • Librería para crear PDF’s (ezPDF)
  • Librería para crear ficheros de Excel (ExcelWriter)
  • Librería para generar descargas de ficheros (zen_descarga)
  • Librería para descargar contenido de Twitter
  • Librería para crear ficheros comprimidos (createZip )

Pongo una captura de la primera:

Captura del generador de PDF

<?php

require("zenphp/zen.php");

if (!zen___carga_clase('Cezpdf')) die("No se pudo cargar la clase PDF");

$pdf =& new Cezpdf();

$pdf->selectFont('zenphp/contenido/fuentes/Avgardm.ttf');

$x=578; $r1=25;

for ($xw=40;$xw>0;$xw-=3){

    $tono=1.0-$xw/40*0.2;

    $pdf->setLineStyle($xw);

    $pdf->setStrokeColor($tono,1,$tono);

    $pdf->ellipse(50,750,$r1);

    $r1=$r1+$xw;

}

for ($xw=40;$xw>0;$xw-=3){

    $tono=1.0-$xw/40*0.2;

    $pdf->setStrokeColor($tono,$tono,1);

    $pdf->setLineStyle($xw);

    $pdf->line($x,0,$x,842);

    $x=$x-$xw-2;

}

$pdf->ezText("Contenido PDFnn",24);

$pdf->ezImage('zenphp/contenido/img/logo.jpg',0,0,'none','center');

$pdf->ezImage('zenphp/contenido/img/img05.jpg',0,0,'none','left');

$pdf->ezText("Prueba PDF",16);

$pdf->ezStream();

?>

La única que he escrito es zen_descarga, el resto son de otros autores,pero con licencia LGPL. ;)

En un par de líneas las tenemos funcionando :)

ene 20

Sin duda, las herramientas “IDE” o entornos visuales para la edición de código fuente aumentan muchísimo la producción.
Hoy en día es muy necesario que dicha aplicación disponga de una interfaz amigable y de herramientas super importantes a la hora de la verdad, creando un proyecto si no sabemos qué está pasando con nuestro código,no sabremos si hace lo que se espera de él cuando lo escribimos y previamente diseñamos…

Así pues, es imprescindible disponer de un profiler que nos informe por qué y qué es lo que hace que nuestra aplicación vaya demasiado lenta o se cuelgue; e incluso nos ayuda a depurar todo el proyecto de una forma a simple vista sencilla.

En el ejemplo podemos ver que el compilador lleva mucho tiempo en ejecutar la línea 29 de la clase que añade el contenido especificado en nuestro XML de aspectos a un fichero .PHP. Si leemos la línea veremos que lo que se hace es una llamada a implode : construir una cadena a partir de un array de contenidos. Es bien sabido que éste lenguaje es muy ineficiente cuando se trata de operar con cadenas, sobre todo en las concatenaciones…
El resto de llamadas ineficientes son básicamente la lectura de ficheros,por lo que ya sabemos que debemos intentar realizar el menor número de accesos a disco, éstos son, llamadas a require(), require_once(), include_once(), readfile(), virtual()include_path, fopen, etc…Ahora deben ser precedidas por funciones de comprobación de existencia de funciones,clases y ficheros… ;)

Por lo tanto ya sabemos donde tenemos que centrar nuestra atención a la hora de optimizar el código. :)

ene 19

He dejado de estudiar Matemáticas por un día justo la semana del examen…,pero no podía dejar de pensar en que podría acabar el compilador basado en el Paradigma orientado a Aspectos antes de esta semana!…sin él, el generador no es nadie ;)

Me ha llevado mucho porque el analizador sintáctico me estaba dando problemas y no sabía por qué no me añadía los puntos de corte automáticos a la clase del fichero original ,al final ,después de mucho depurar resultó que sólo era un constructor mal declarado…¡qué típico! jaja :D

He añadido un documento explicando la idea y acabo de terminar el compilador con “pica código” incluido :D ,si,si….pica código…por tí, jejeje…, ahora los proyectos web se puede crear con un par de definiciones en XML (XAD) e incluso montar un repositorio de clases,módulos y funcionalidades con todo lo que una web necesita.

Por ejemplo si necesitáramos una cesta de la compra bastaría con descargarnos, como en CakePHP, el módulo, sin embargo aquí se añaden muchas más funcionalidades porque se permite cambiar (antes de generar) el código,todo lo que tenga nuestro proyecto de “extra”, i.e.: campos, funciones que necesitemos en cualquier lenguaje,etc…

Todo se pueden añadir en el XML como definiciones y se le pasa a zenphp para que genere las clases del proyecto, que cargará los orígenes de las definiciones y creará los ficheros.

Dejo una captura del compilador y generador funcionando.

Eso es todo por hoy, si quieres saber puedes leer más sobre Programación Orientada a Aspectos.

ene 19

Temas por defecto

19 enero, 2008

Aprovechando que he terminado una práctica de esas gordas para la Universidad he montado un sistema de aplicaciones cliente / administrador utilizando las plantillas XHTML+CSS de licencia para copiar :) con ésto siento que he progresado! y mucho, :D y realmente estoy bastante contento con el diseño, la plantilla sirve para hacer las llamadas a las vistas y controladores por defecto de todo el sistema de clases de zenphp.

Aquí, una captura de la plantilla en funcionamiento:

Captura de la aplicación por defecto de zenphp

 

Estoy terminando con la plantilla de administración, la factoría de generación de código depende de la clase zen_andamio (el scaffolding de zenphp) y la administración depende de zen_AJAX. Tras escribir esta mañana la clase zen_JSON está bastante avanzado…

Con esto tengo una buena parte hecha de lo que veía imposible ,sin embargo ha sido más fácil de lo que en un principio parecía y ya incluso veo el final del túnel. 

ene 11

Tomando control de PHP

11 enero, 2008

Poco a poco zenphp va tomando el control de las operaciones que PHP hace, automáticamente,instantáneamente…

Al principio fueron sólo las sesiones,los ficheros de logs y los errores, ahora se añaden los búferes de salida, todos los tipos de bases de datos,las redirecciones de URL, las funciones de correo, el procesamiento con filtros de entrada/salida y la configuración con ficheros .ini

El tenerlo todo controlado y funcionando ,mejor que el funcionamiento por defecto de PHP es lo que hace que un framework sea rentable de utilizar, no sólo por la facilidad para construir una aplicación compleja sino porque es mucho más rápido trabajar con un sdk que esté bien diseñado y sea rápido de entender gracias a la simplicidad de la jerarquía.

dic 28

Además de todos los “features iniciales” se me ocurren nuevas posibilidades, hablando con un amigo se me ha ocurrido que podrías serializar una aplicación zen ( $fichero = fwrite (serialize($zen)) ) y enviarla por correo a otro sistema (o por cualquier otro método: ftp,etc.) y desde allí recuperar todos los datos de la misma manera, [ $zen = unserialize(fread($fichero)) ] sin necesidad de acceder a la base de datos, es un ejemplo de servicio que me acabo de inventar…

Las posibilidades no tienen límites, es cuestión de imaginar! :)

Saludos!

Close
E-mail It