Archivos Mensuales: noviembre 2006

Requeria JSON y que ocurrio? … PHP 5.2.0

El pasado 2 de noviembre la gente de PHP.net liberó oficialmente a PHP 5.2.0; entre algunas cosas importantes de su liberación es que deja obsoleta la rama 5.0 y pronto a la rama 5.1 (que dejará de lanzar releases o bugfixes) ; ademas de que añade directamente como extensiones (y no como modulos pear) a JSON (javascript serialize object notation) para PHP y un modulo para creacion y descompresion de archivos zip (ya habia una extension aparte y un modulo pear, ahora forma parte de las extensiones del nucleo de php); ahora el sistema de fecha y hora con todas sus funciones puede manejarse mediante un objeto unico; cosas como $fecha = new DateTime() o $zona = $fecha->getTimeZone() entre otras funciones orientadas a objetos; se mejoró la libreria PCRE (perl compatible regular expressions) y ademas el motor Zend incluye unas mejoras sustanciales en el manejo de memoria y cache.
La clase DOM (que he estado usando intensivamente en estos ultimos meses) añade alguna serie de gratas funciones como C14N, para serializar un nodo a un string, usando directamente una sentencia de busqueda xpath e incluso trayendose cualquier comentario interno; tambien incluye getNodePath con la cual podemos obtener la ruta xpath de un nodo cualquiera DOM; hubo una mejora bastante sustancial en la extension SPL y POR FIN! se les ocurrio crear una funcion que retorna la extension asociada a una imagen (image_type_to_extension(int typeimage, bool include_dot)) recibiendo como parametro el entero de tipo de imagen devuelto por las funciones exif_imagetype y getimagezise; en fin, se ve prometedor y como cosa rara en mi server, ya está instalado!
www.ajaxvenezuela.com
Mas que todo, lo instalé por JSON y por las nuevas funciones DOM, pero ya veremos que otras utilidades le saco al resto de las nuevas funciones (como la funcion de ordenamiento de arrays de objetos basado en un algoritmo natural case insensitive).

jugando con javascript

bueno, tenia tiempo sin escribir tanto javascript desde la época en que perl estaba en pañales y las paginas web dinámicas eran cosa de hacer truquitos interesantes con el javascript; pasados los años y con AJAX por delante, podemos volver a esos “jueguitos” pues el ancho de banda y el consumo de recursos lo permite; en este caso, una modificación sustancial a una clase javascript que permite drag n’ drop y un poco de estilo CSS me permitieron crear una clase javascript (orientada a objetos) que me permite implementar el arrastre y colocar de una forma facil y rapida, un ejemplo aqui:
http://www.ajaxvenezuela.com/splib/js/window/window.htm
La ventana es un simple div, con algo de estilo CSS y una sombra leve de fondo, para lograr que la capa fuera arrastrable simplemente ejecuto el siguiente codigo javascript:
var drag = dragme(“handler1”, “window1”);
El primero es el ID del div que servira de handler (es decir, de control, en este caso, la ventana solo puede ser arrastrada por la barra de titulo, no por el cuerpo); el segundo es el ID del “cuerpo” de la ventana …
si queremos mover un objeto unico (como una imagen, que esta estatica) simplemente declaramos:
var drag1 = dragme(“imgsrc”);
fijense que la ventana está confinada al area de la pantalla y no se sale de los bordes (algo practico en sistemas basados en ventanas o dialogos) y el contenido (declarado por el ID window_content) puede ser cualquier cosa, incluso una estructura DOM completa que llegue via AJAX o un IFRAME con un target especifico.
si quieren la libreria pueden bajarla de:
http://www.ajaxvenezuela.com/splib/js/drag_drop.js, requiere ademas el archivo http://www.ajaxvenezuela.com/splib/js/fade.js (para hacer la transparencia que vemos si hacen click sobre ella) y http://www.ajaxvenezuela.com/splib/js/api.js; que son una serie de funciones utiles (como un get DOM object cross-browser) entre otras.
Como todo GPL, espero mantengas mis créditos y si consigues algun bug interesante hazmelo saber (no, aun no tengo un CVS para mis funciones javascript).

Y NO!!… no funciona en Internet Explorer y ni me preocupo porq no funcione, simplemente es una opcion de usar document.all en vez del  estandar dom getElementByID y de usar AttachEvent en vez de usar el estandar w3c AddEventListener, pero bueno, no tengo un equipo con windows en mi casa asi que ni me preocupo por si corre o no en Internet Explorer (espero algun interesado en hacerlo funcionar en IE lo haga y podemos compartir los cambios).

Ha sido probado en Camino (si, tengo un equipo con Tiger truqueado), Mozilla, epiphany, konqueror, opera y firefox 1.5 y 2, con excelentes resultados (aunque un fallo en opera no me permite hacer drag n’ drop de imagenes con position static, pero ya corregiré eso).
Otra clase interesante es fade, fade tiene 2 efectos, transparencia y degradado de color, en:
http://www.ajaxvenezuela.com/splib/prueba.htm
como en el caso anterior la programacion orientada a objetos permite una facil implementacion:
var f = new fade();
f.fade_element(‘p3’);
f.fade_element(‘p1’, ‘#FF0000’); //si quieres cambiar el color predeterminado de inicio
f.intermiddle = false; //desactivo el color intermedio
f.fade_element(‘cuerpo’, ‘#808080’);

en todo caso, se puede cambiar incluso el destino final del color y el color de segunda trancision.

para el caso de las transparencias contamos con 2 funciones:
set_opacity(‘fadein’, 30);
que cambia la opacidad de un elemento cualquiera, ha sido probado en todos (excepto como ya dije en el mal mentado browser) y funciona bastante bien.

tambien hay una funcion llamada:
f.fadein_element(‘fadein’);

que me permite realizar una transicion de transparente a opaco en una cantidad de tiempo (tambien configurable)
f.duration = 2000; //en milisegundos

Como ven; hay muchas cosas que pueden hacer con javascript actualmente (y que pueden usar de una manera facil) sin tener que recurrir a  Flash o a efectos privativos (como los filter de Internet Explorer) dandonos la posibilidad (sin incurrir en excesos de peso) de contar con una aplicación web más vistosa, animada y la la vez útil y ligera.

Espero disfruten las funciones, traeré más después  …

Recompilando PHP y usando JSON

Hace 2 dias recompilé PHP para activar un par de extensiones, entre ellas la tidy html (para limpieza de código html) y la JSON (javascript Serialize Object Notation) para intercambiar (mas que todo objetos) entre el cliente web y el servidor; sin embargo, para mi sorpresa hoy (mejor dicho, ayer a mediados de la tarde) han liberado PHP 5.2.0, que trae a tidy y a json incluidos *by default* con lo cual decidí hacer un upgrade a mi estación de trabajo (este servidor seguirá el ejemplo que el portatil dió en un par de días luego de las pruebas de rigor).

Lo que puedo asegurar luego de las pruebas es que tanto la ampliación de javascript para JSON como la extensión de PHP para JSON son la mar de sencillas de utilizar; en el primer caso con simplemente hacer var sjson = oExample.toJSONString(); entonces contamos con que cualquier string, objeto u array será convertido a la notación JSON:
ej javascript:

var oExample = new Object();
oExample.id = 10;
oExample.className = 20;
oExample.position = 30;
oExample.value = “Jesus”;
oExample.newValue = “Lara”;

es llevado a la forma:
{“id”:10,”className”:20,”position”:30,”value”:”Jesus”,”newValue”:”Lara”}

La cual puede ser enviada facilmente a través de AJAX usando POST.
Del lado del servidor, podemos contar con algo parecido y es que podemos tomar los datos recibidos y con $obj = json_decode($json); obtendremos un objeto con todas las mismas propiedades del objeto javascript, es decir $obj->value o $obj->className.

Pero eso no queda allí, si tomamos cualquier clase y creamos un objeto:

ej php:
class objeto {
public $id = 10;
public $className = 20;
public $position = 30;
public $value = ‘Jesus’;
public $newValue = ‘Lara’;
}
$obj = new objeto();

podemos entonces con $strjson = json_encode($obj); obtener la misma version serializada pero ahora para javascript de un objeto PHP, podemos serializar casi cualquier cosa, exceptuando recursos (como datastreams o conexiones a bases de datos), haciendolo mucho más flexible y potente que las soluciones ajax basadas en XML.

Por cierto, el unico punto en contra a JSON es que no es tan “Human readable” como XML, pero al final de cuentas, tanto JSON como XML son strings para alimentar aplicaciones AJAX y no van a ser vistos por ojos humanos, asi que que importa si el string de JSON es mas complejo (aunque mas compacto) que el XML si nunca lo vamos a ver de frente? …

por cierto, y para terminar, el objeto php serializado que hemos recibido lo podemos devolver a una forma javascript con la siguiente linea de codigo:

var oExample = a.parseJSON();
document.getElementById(“resultado”).innerHTML = oExample.value+’ ‘+oExample.newValue;

Con lo cual como observan, contamos con la flexibilidad de enviar objetos sumamente complejos y grandes cantidades de datos en un solo y unico string sin tener que estar haciendo parsing de una estructura xml (que de por si es bastante engorroso andar pensando en childNodes y getElementsByTagName cuando podemos tener todo en un objeto, DOM queda para otras situaciones).

Les contaré de mis progresos por esta via …

A %d blogueros les gusta esto: