Notification Center para AS3
Supongo que muchos ya conocereis el framework ASAP para flash. Ciertamente es un framework bastante completo, y aunque casi todos usamos los nuestros “propios”, por aquello de “yo lo hice y yo me lo entiendo”, a mi me encanta echar un vistazo a las tripas y ver que caramelitos traen dentro.
En el caso del Notification Center, era algo que ya Sergio Daroca me había comentado, y ahora que lo he visto en profundidad la verdad es que me ha parecido algo muy interesante.
Notification Center es un port a AS3 de la clase “NSNotificationCenter_Class” usada en Cocoa, utilizada en el sistema OSX, portada por Arthur Clemens. Sencillamente, es un Centro de Notificaciones, tal como el nombre indica, y que te permite generar eventos personalizados con sus parámetros.
El funcionamiento de la clase es muy sencillo :
1. Registras tu clase para recibir el tipo de eventos que desees.
2. Emites eventos desde donde necesites
3. Todas las clases suscritas reciben su evento, con los parámetros que pasaras al emitirlo.
Añadir Observer
Para añadirlo, usas :
NotificationCenter.getDefaultCenter().addObserver(this, “doSomething”, “Notification”);
Donde “doSomething” es el método que recibe el evento, y “Notification” es el tipo de evento al que te suscribes.
Ademas de por tipo de evento, puedes suscribirte por tipo de datos, cosa muy interesante :
NotificationCenter.getDefaultCenter().addObserver(this, “doSomething”, null, myTipoDatos);
De este modo, es cuchas todos los eventos, recogiendo siempre que coincida con tu tipo de datos.
Emitiendo Eventos
Haríamos :
NotificationCenter.getDefaultCenter().post(”Notification”, null, “My message”);
Con esto notificariamos a todos los escuchas del evento “Notification” pasandoles el parametro “My message”.
Y la otra opción sería :
var anIdentifier:Object = this;
NotificationCenter.getDefaultCenter().post(null, anIdentifier, “My message”);
Ahora estariamos notificando a todos los escuchas que esperan el objeto “anIdentifier”.
Recogiendo Datos :
Para recibir, en la funcion que le hubieras seteado como escucha :
private function miFuncionEscucha (inNote:Notification) : void {
var notificationName:String = inNote.name;
var notificationObject:Object = inNote.object;
var productData:Object = inNote.data;
}
Y recuperamos simplemente los argumentos pasados y propiedades del evento en sí.
Como veis, es bastante sencillo de implementar, y muy práctico. Lo mismo puede hacerse usando el modelo de eventos nativo, la verdad no lo he mirado en profundidad y no se las diferencias exactas que pueda haber, lo que puedo decir es que esta clase funciona realmente bien y es sencilla y comoda de usar.
La clase en sí esta muy bien documentada, y por cierto, hace uso de otra clase para Logs, la cual os adjunto en el “pack”, simplemente recibe eventos de Log y los emite como traces para ir controlando, es bastante sencilla y tambien esta documentada.
Tengo algunas cosas más sobre ASAP sobre las que ire posteando, es un framework con muchos “caramelitos” dentro desde luego…
Espero os sea de utilidad !!
Descarga :
TYPENEU, una odisea en tipografía …
Asi reza el slogan de TypeNeu.
TypeNeu es una web que recopila distintas aplicaciones y experimentos tipográficos, que os recomiendo echeis un vistazo. Se ven trabajos buenos, muy buenos.
Espero que os guste, a mi me encanta.
Generar consultas SQL dinámicamente desde Flash para AMFPHP
Desde hace bastante tiempo, uso AMFPHP en la mayoría de los proyectos. Si ya lo habeis usado, sabreis lo cómodo, útil, y práctico que resulta, y si no lo habeis hecho, os recomiendo que lo descargueis y le hecheis un vistazo en cuanto tengais un rato.
Cuando llevaba un tiempo trabajando con él, me fastidiaba bastante tener que escribir un servicio de AMFPHP cada vez que quería realizar cualquier cosa, de modo que si un proyecto tenia seccion de noticias, galeria de fotos, novedades o lo que fuera, tenias que andar escribiendo un nuevo servicio por cada uno de ellos. Como no, si tenias que variar cualquier cosa en tu aplicacion, tenias que tocar la clase correspondiente, y el servicio, no era un trabajo dificil, pero si demasiado repetitivo …. ¿ Por que ?
Dandole vueltas, realmente te das cuenta que siempre haces lo mismo en un servicio, usas SELECT, INSERT, UPDATE y DELETE, esto cubre el 95% de los casos, y ocasionalmente, usas un SEARCH.
¿ Y si genero mi consulta SQL en flash, y simplemente uso un servicio único AMFPHP que haga de proxy ? De esta forma, me olvidaría por completo de tener que estar generando servicios constantemente, y ademas, podría generar todo desde flash, ahorrandome tener que pasar tantisimos parámetros …
A raíz de ahi, surgio la clase GenerateSQL. Es una clase que empece a usar hace un par de años, y que con el tiempo se ha ido refactorizando y portado a AS3. Su fucionamiento es bastante sencillo, una vez le coges el hilo, puedes generar consultas complejas muy muy rápido y directamente desde flash.
Vamos a un ejemplo sencillo, un típico SELECT :
/* param:
@elements: [nombre_columna_BD,......]
@tabla: tabla_BD
@myID: [[nombre_id,valor],….]
@limit: Number
@order: [nombre_columna_BD, order_type] - order_type: ASC // DESC
@option : AND // OR
*/
public static function GenerateSelect(elements:Array,tabla:String,myID:Array, order:Array, limit:Number, option:String = “”):String
Como vereis, hay opciones varias para generar el SELECT. El primer array, son las columnas a seleccionar, el segundo la tabla, el tercero las distintas condiciones ( WHERE …. ) y luego, distintas opciones de limite, ordenacion, y concatenación.
Al lío ( Ej. AS3 ) :
import GenerateSQL;
var tmpSTR:String = GenerateSQL.GenerateSelect ( [],”productos”,[],[],undefined,undefined );
trace(tmpSTR)
Resultado :
SELECT*FROM productos
Vale, esto es bastante básico, y sencillo. Vamos a algo un poco mas completo, voy a obviar los import y demas para ir a lo que nos interesa :
var tmpSTR:String = SQL.GenerateSelect ( ["id","nombre","apellidos"],”productos”,[["edad",15]],[],undefined,undefined );
y obtendríamos :
SELECT`id`, `nombre`, `apellidos`FROM productos WHERE `edad`=15
Bueno, ya veis como se pueden obtener facilmente consultas que van siendo mas complejas a medida que lo necesitemos. Es bastante cómodo ademas, puesto que siempre puedes ver exactamente “que” estas enviando a tu servicio, de modo que sabes perfectamente si hay un error en esa consulta, incluso si te apetece, pegas tu consulta generada en tu phpMyAdmin y ves que te genera.
No me extiendo más en esto, pues es sencillo probar y ver que tal funcionan los diferentes métodos, para los inserts, updates, deletes, y lleva dos métodos para generar búsquedas simples y complejas.
Una vez visto toda esta movida, vale, y ahora que ?. Esta consulta que generamos en flash, se la vamos a pasar a nuestro servicio de AMFPHP. Este servicio, siempre sera igual, no hay ni que tocarlo, y simplemente nos devolverá nuestro resultado perfectamente parseado como recordSet.
En el caso de enviar tanto un insert, update o delete, nos va a devolver simplemente un “ok”, o bien el error que haya generado el SQL.
Tampoco voy a entrar en como enviar los datos a tu servicio, pues esto esta bastante documentado en la red, y probablemente muchos de vosotros ya sepais como funciona, simplemente añadir, que no es para nada complicado.
Con esta clase, se hace bastante rapido ir desarrollando cualquier interaccion con la BD, me resulta super comoda para los insert y updates, pues normalmente recojo los datos en un array, y solo es pasarlo y fuera.
Importante. Como muchos habeis ya adivinado, usar este sistema asi “a pelo”, es muy muy peligroso. Te pueden inyectar código muy fácilmente, y hacerte un DROP de la leche …. ( Actualizo : Ojo a los permisos de la BD, con esto ya te ahorras muchos problemas… )
Ya depende de cada uno, y del proyecto, el establecer la seguridad que cada uno estime oportuna. Yo lo uso encriptando previamente desde flash, y desencriptando posteriormente en el propio servicio de AMF, de modo que la informacion viaje de forma segura permanentemente.
Aqui os dejo los archivos, la clase y el servicio, por si quereis hecharle un ojo :
Bueno, blog estrenado ! xD

