Comunidad de diseño web y desarrollo en internet

Manejar AMFPHP facil con una clase en Actionscript

En esta oportunidad explicaré el uso de una clase de actionscript 2.0 hecha por Dano, para facilitar la conexión y manipulación de un servicio con Flash Remoting, esto le servirá a programadores de todos los niveles de experiencia, si no sabes de lo que estoy hablando por favor lee esto primero antes de continuar:

Como dije previamente utilizaremos una clase, asi que trabajaremos un poco con Programación Orientada a Objetos, una vez más si no estas familiarizado con esto (al menos en un nivel básico) te recomiendo leer esto:

Explicación:

La utilización de esta clase es realmente sencilla, asi que veamos y analicemos un poco el código de dicha clase:

import mx.remoting.Service;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
class AMFPHP {
private var capturaRespuesta:RelayResponder;
private var Servicio:Service;
private var Llamadas:Array;
public var eventos:Object;
function AMFPHP(slGateway:String, slServicio:String) {
capturaRespuesta = new RelayResponder(this, "onRespuesta", "onError");
Servicio = new Service(slGateway, null, slServicio, null, capturaRespuesta);
Llamadas = new Array();
eventos = new Object();
}
function onRespuesta(data) {
var slFuncion:String;
slFuncion = Llamadas[0].funcion;
slFuncion = slFuncion.substr(0, 1).toUpperCase()+slFuncion.substr(1, slFuncion.length-1);
eventos["on"+slFuncion].apply(eventos.Padre, [data.result]);
Llamadas.shift();
if (Llamadas.length>0) {
procesa(Llamadas[0].funcion, Llamadas[0].parametros, true);
}
}
function onError(fault):Void {
trace("Error en el Metodo: "+Llamadas[0].funcion);
trace(fault.fault.faultstring);
}
function procesa(funcion, parametros, Automatico) {
if (Llamadas.length == 0 or Automatico) {
Servicio[funcion].apply(this, parametros);
}
if (!Automatico) {
var miObjeto = new Object();
miObjeto.funcion = funcion;
miObjeto.parametros = parametros;
Llamadas.push(miObjeto);
}
}
}

Realmente lo que utilizaremos de dicha clase será el constructor de la clase ( function AMFPHP por si no leiste el tutorial Programación Orientado a Objetos en ActionScript 2.0) el método procesa (function procesa), asi que detallaré como usarlo solamente( no explicaré su código), y la propiedad eventos:

  • Constructor de la clase: solo tenemos dos parámetros, donde el primero será la url de nuestro gateway, el segundo será el nombre del servicio al que nos queremos conectar. Uso:
     var miServicio:AMFPHP = new AMFPHP("http://localhost/remoting/gateway.php","servicio");
  • La propiedad eventos: solo le añadimos una propiedad y le asignamos el _root(this). Uso:
     miServicio.eventos.Padre = this; 
  • Metodo procesa: tenemos tres parámetros, el primero será el metodo del servicio al que queremos invocar, el segundo parámetro será un arreglo(array) con los valores de los parámetros que tiene el método involucrado, el tercero no lo utilizaremos solo es para asegurar el correcto funcionamiento del objeto, evitando posibles errores al invocar varios métodos a la vez. Uso:
     miServicio.procesa("Metodo",["parametro1","parametro2","parametroN"]);

Ahora ya sabemos como conectarnos al servicio y como invocar sus métodos, nos falta como obtener la respuesta del método, siguiendo con los mismos identificadores de los códigos anteriores, solo necesitamos asignar una función a un identificador que estará conformado por: el identificador del objeto(en nuesto ejemplo miServicio) + un punto + eventos(propiedad del objeto AMFPHP)+ on + el nombre del método al que queremos escuchar, por ejemplo para Metodo sería:

miServicio.eventos.onMetodo = function(data){
trace(data);
}

Sencillo ¿no? , ahora y como sabremos los errores, el objeto por defecto ya tiene implementado el control de errores, asi que te lo mostrará en la ventana de salida si alguno ocurre, un error como este:

 Error en el Metodo: Metodo2
The method {Metodo2} was not declared in the meta data for class {servicio}

Insisto muy fácil ¿no?, asi que nos olvidamos de las lineas de importar las clases de Flash Remoting y otros, pero si aún lo ves muy abstracto yo hice un pequeño ejemplo para explicar el uso de esta clase, el ejemplo se trata de listar los nombres de archivos de un directorio especificando su extensión por parámetro.

Nota: no explicaré código de AMFPHP ni de Actionscript, asumo que ya tienes conocimiento de esto, por lo que solo me limitaré a explicar solo el código que involucre el uso de la clase AMFPHP.

Nota: por conveniencia y no estes luchando con las rutas y demás, en el directorio que tengas el archivo de la clase (AMFPHP.as) guarda tu archivo .fla

Veamos los códigos:

Código del servicio, nombre de archivo: misArchivos.php

<?php
class misArchivos{
function misArchivos (){
$this->methodTable = array (
"Lista" => array (
"description" => "lista los archivos de la extension dadade un directorio",
"access" => "remote",
"arguments" => array("extension")
)
);
}
function Lista($extension){
chdir("../../");
return glob("*.$extension");
}
}
?>

Antes de ver el código de Actionscript, menciono los nombre de instancia de los objetos que tengo en el escenario:

Objeto
Nombre de Instancia
TextInput
extText
Button
btnOk
ComboBox
cbLista
dynamic text
mensajeText

Ahora si veamos el código actionscript:

Servidor:AMFPHP = new AMFPHP("http://localhost/remoting5/gateway.php", "misArchivos");
Servidor.eventos.Padre = this;
Servidor.eventos.onLista = function(data) {
var aux:Array = data;
var miLista:Array = new Array();
for (i=0; i<aux.length; i++) {
miLista.push({label:aux[i], data:i}); } lista.dataProvider = miLista;
(aux.length)?mensajeText.htmlText="<b>Mensaje:</b> archivos listados.":mensajeText.htmlText="<b>Mensaje:</b> no hay archivos con esa extensión.";
};
//Solo letras
extText.restrict = "a-z";
// Maximo 5 caracteres
extText.maxChars = 5;
//escribimos en html el campo mensajeText
mensajeText.html = true;
var botonListener:Object = new Object();
botonListener.click = function() {
mensajeText.htmlText = "<b>Mensaje:</b> procesando información.";
Servidor.procesa("Lista", [extText.text]);
};
btnOk.addEventListener("click", botonListener);
var comboListener:Object = new Object();
comboListener.change = function(objeto:Object) {
trace(objeto.target.selectedItem.label);
trace(objeto.target.selectedItem.data);
};
lista.addEventListener("change", comboListener);
stop();

La primera linea creamos un objeto AMFPHP, con el identificador Servidor, segunda linea le añado una propiedad a la propiedad eventos (la propiedad Padre) y a esta le asigno el _root(this porque el código esta en acciones de fotograma), luego implemento la función para obtener la respuesta de el único método de mi servicio que es Lista (Servidor.eventos.onLista), por último en el evento click del boton invoco al método Lista de mi servicio:


botonListener.click = function() {
mensajeText.htmlText = "<b>Mensaje:</b> procesando información.";
Servidor.procesa("Lista", [extText.text]);
};

Bueno esto es todo, una vez más agradecemos al amigo Dano por compartir sus conocimientos con nosotros.
Para los que quieren tener el archivo de clase AMFPHP aqui les dejo un link ... Click derecho guardar como...

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Descargar Archivo

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate