Conectar Flex
Conectar Flex
Conectar Flex
Por MorphX el 05 de Octubre de 2007 con 98,284 visitas. Aplicaciones web y moviles Otros tutoriales por MorphX.
En este tutorial aprenders desde cero a obtener datos desde una base de datos en MySQL y a representarlos en un DataGrid de Flex. Desde la configuracin de WebORB hasta el cdigo Actionscript 3, hecho fcil. Para lograrlo:
1.
Instalaremos WebORB, como agente de intercambio Cliente/Servidor en formato AMF3, el cual funciona con Flex perfectamente. Gracias a WebORB podremos acceder fcilmente a los Servicios PHP que desarrollaremos para nuestro ejemplo en Flex. 2. Crearemos una base de datos en MySQL muy sencilla, a travs de phpMyAdmin para el ejemplo. 3. Escribiremos una clase/servicio en PHP y la registraremos en WebORB.
4.
Y finalmente, construiremos una pequea aplicacin en Flex Builder 2, que acceda al Servicio PHP creado, y rellene un DataGrid con los datos recibidos. NOTA: Si desconoces alguno de los conceptos anteriores, te recomendamos leer estos tutoriales: Tutorial de Flex Builder 2, Tutorial bsico de bases de datos, Crear una base de datos MySQL desde cPanel. Todo esto lo haremos, paso a paso y explicando el porqu de cada cosa, desde los conceptos ms elementales, hasta los ms avanzados, para que al final del tutorial entiendas perfectamente, qu, cmo y porqu de todo lo que se est manejando.
serializacin de datos que hasta entonces suframos. Resumen: Un RemoteObject permite invocar funciones escritas en cdigo del lado del servidor y usar su resultado en Flash. AFM0 evolucion hacia AMF3 con la llegada de Flex 2, corrigiendo varias carencias que tena el protocolo original, y mejorando con mucho la velocidad, el peso, el modo en como se transmite la informacin, y sobre todo unificando criterios de llamada y construccin de clases, al estilo Java para todos los lenguajes que lo soporten. Una vez sabes que demonios es RemoteObject y AMF3, vamos a ver como instalamos un agente de transporte que implementa AMF3 sobre PHP en el servidor, WebORB. NOTA: Un agente de transporte es un bloque de cdigo que permite conectar a Flex o Flash con PHP u otro lenguaje del lado del servidor.
WebORB, es la alternativa (gratis y libre) ms lograda a la versin de Abobe del protocolo AMF3, el cual es LiveCycle Data Services. LiveCycle solo puede usarse en entornos Java, en cambio WebORB da soporte al protocolo en Java, .NET, PHP y Ruby on Rails, con un rendimiento muy alto y estable. El sistema para configurarlo es idntico al que usa LiveCycle, con lo cual lo que aprendas ahora para WebORB te valdr tambin para LiveCycle.
WebORB es la serie de archivos del lado del servidor (En PHP en este caso) que permiten a Flash o Flex conectarse directamente con PHP por medio de AMF3. Antes de pasar a rellenar xml's como loco para configurarlo y que copies y pegues sin saber realmente que estas haciendo, voy a explicarte como funciona un agente de transporte, para que sepas porqu y para qu son los distintos xml's que tiene en configuracin. Entra al sitio de descarga de WebORB para PHP, descarga el .zip y descomprimelo en la raiz de tu sitio, de modo que todo el contenido del zip quede en www.tusitio.com/weborb/. Esta direccin ser la raiz de weborb y a partir de esto empezar el tutorial. WebORB tiene su carpeta de configuracin alojada dentro /Weborb/WEB-INF/ (Buscala dentro de la carpeta donde descomprimiste el .zip). Dentro de sta se encuentran las clases de PHP, configuracin y
librerias que requerir el agente para poder generar el protocolo e incluir nuestras clases personales dentro de las clases usables en despliegue. En Flex Builder has de indicar la ruta hasta la carpeta WebORB (contenedora de WEB-INF), para encontrar los xml's de configuracin a la hora de compilar. Dentro de /WEB-INF/flex/ la estructura que encontramos es esta:
Un canal, es realmente un proceso del agente que procesa una peticin de servicio -->
CHANNEL-DEFINITION id = Nombre para referirnos al l desde Flex. LO MS IMPORTANTE DE ESTE ARCHIVO ES ESTO class = Clase que usar el agente para procesar el protocolo --> <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel" >
<!-ENDPOINT uri = Url donde deber dirigir la llamada Flex, (uri o url) class = Clase que estar esperando llamdas en esa url --> <endpoint uri="/Weborb/index.php" class="flex.messaging.endpoints.AMFEndpoint" />
</services-config> Este fichero era el ms complejo, A que no era tan complicado? remoting-config.xml ste es el que ms tocaremos, de hecho el anterior viene preconfigurado en la distribucin y difcilmente necesitaras tocarlo. Este es remoting-config. Lee los comentarios (En verde) para entender el XML. <?xml version="1.0" encoding="UTF-8"?>
<!-- Aqu, slo el ID es lo que debes recordar --> <service id="remoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage" >
<!-- Irrelevante en nuestro caso, deja esto sin modificar --> <adapters> <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/> </adapters>
<default-channels> <!-- Le decimos al agente que en caso de indicar lo contrario, usaremos el canal llamado my-amf que fu definido en el archivo anterior. (El nombre "my-amf" depende de nosotros y lo elegimos en el XML anterior) --> <channel ref="my-amf"/> </default-channels>
<!-- Bloques como ste, sern los que aadirs en tus proyectos Cada bloque representa una clase PHP que se conectar a Flex De nuevo, manten en mente el ID, que es lo ms importante. Lo puedes cambiar por lo que quieras. --> <destination id="myweborb-service"> <!-- El id lo usaremos para llamar desde Flex al PHP --> <properties> <!-- Ruta en el disco duro a nuestra clase PHP En el tutorial haremos esta ruta ms adelante --> <source>flex.morphx.UsuarioService</source> </properties> </destination>
</properties> </destination>
</service>
Y con esto ya sabes que es cada cosa en los xml que hay que tocar, y ademas de camino hemos aadido la configuracin para nuestro ejemplo. Notese que la ruta de nuestra clase es relativa a la carpeta /Services/ dentro de la raiz de /weborb/. En esa carpeta /Services/ es donde guardaremos nuestros archivos .PHP de la aplicacin.
Con esta estructura, ya tenemos nuestra tabla lista para trabajar, no olvides llenarla de datos para tener algo que mostrar ;) Si no quieres usar phpMyAdmin, este cdigo en SQL genera la base de datos: CREATE TABLE `user` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL );
PHP, de manera que lo que enviemos por PHP sea recibido identido en AS3. Para ello, indicamos en Actionscript 3 con el metatag [RemoteClass(alias=)] donde est su pareja AMF3 escrita en PHP. RECUERDA: PHP es el lenguaje del lado del servidor que se conecta a MySQL. Actionscript 3 es el lenguaje del lado del cliente que muestra los datos en Flex. AMF3 es el protocolo de comunicacin entre PHP y Actionscript 3 que en AS3 ya est programado internamente y en PHP lo implementamos usando las libreras WebORB para PHP. En otras palabras, AMF3 es, para efectos practicos, WebORB
Cdigo en Actionscript 3
Creamos un archivo llamado UsuarioVO.as, que colocaremos en la misma carpeta raiz del proyecto de Flex (Donde est el .mxml). package
[Bindable]
[RemoteClass(alias="flex.morphx.UsuarioVO")]
Este objeto tiene una propiedad "name" y nada ms. name ser el nombre de usuario a mostrar en el DataGrid, que es el campo de contenido de nuestra tabla. Este valor ser llenado por medio de PHP.
Cdigo en PHP
Versin de PHP WebORB requiere obligatoriamente, PHP 5. Crearemos nuetro fichero PHP en /Services/flex/morphx/UsuarioVO.php nota que la ruta de carpetas coincide con la ruta de la clase que indicamos en el XML, de ese modo AMF3 es capaz de encontrar nuestra clase PHP, y replicarla correctamente. De esto se deduce que las mayusculas y minusculas en los nombres de las carpetas ha de coincidir plenamente con la ruta indicada antes. En programacin es muy importante mantener mayusculas y minusculas de manera exacta. <?php class UsuarioVO {
public $name;
} ?> Si os fijis es un objeto que tiene exactamente la misma estructura que nuestro UsuarioVO.as, y de hecho sus propiedades han de llamarse exactamente igual, incluso manteniendo el mismo uso de mayusculas y minusculas. ValueObject: Esta combinacin de clases gemelas en PHP y Actionscript 3, cuyo objetivo es mantener un mismo tipo de datos entre lenguajes, se conoce como ValueObject.
La llamaremos UsuarioService.php, y ser sta la clase a la que nos conectaremos desde Flex, en la cual podremos usar sus metodos, por tanto es sta la clase que hemos de asociar al destination en la configuracin de WebORB, como vimos antes (El XML). Lee los comentarios del cdigo (En verde) para entender su funcionamiento. <?php
class UsuarioService {
//Cabecera de conexin a la BD //DEBES CAMBIAR LOS VALORES de "SERVER", "USER" y "PASS" de acuerdo a tus datos //de conexin a tu base de datos. $sqlconnect = mysql_connect("SERVER", "USER", "PASS"); $db = "DBNAME"; //DEBES CAMBIAR "DBNAME" por el nombre de tu base de datos.
//Ejecutamos la consulta SQL para obtener todos los registros de la tabla $rst = mysql_query("SELECT * FROM USER");
$respuesta = array (); //Array de datos a devolver. //De este modo nuestro ArrayCollection en Flex, //tendr una serie de objectos con la propiedad "name" //para pasarle al DataGrid
while ($row = mysql_fetch_object($rst)) //Tomamos record a record y lo encapsulamos //en nuestro objeto de transporte { //Creacin de los Objetos de Transporte $vo = new UsuarioVO(); //Le aadimos a nuestro ValueObject el nombre obtenido de MySQL $vo->name = $row->name;
//Devolvemos el resultado hacia Flex return $respuesta; } } ?> Y finalmente construimos nuestro ejemplo Flex.
La llamada al mtodo en s. Un evento result que entrega un ResultEvent, y es lanzado cuando nos llegan los datos. Un evento fault que entrega un FaultEvent, y es lanzado en caso de obtener un error en el
proceso. Por lo tanto el tratamiento de los datos esperados tras una llamada tipo servicio.getUsuario() donde "srv" es el id de nuestro RemoteObject en Flex, no puede hacerse en la lnea siguiente a ella, sino que se har en una funcin a parte que ser lanzada por el evento result y que nos pasar por parmetro un ResultEvent con los datos recibidos y lo salvaremos en un ArrayCollection. ArrayCollection es un tipo de datos de Flex que nos encapsula un Array, con una serie de metodos de manejo que nos permiten un gran numero de operaciones avanzadas sobre la "coleccin" de datos, tales como: Filtros, Cursores, Ordenaciones, etc. Por ello recogemos los datos en un objeto de este tipo, que actuar como DataSet. <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[
//Esto lo hacemos para forzar al compilador //a incluir la clase UsuarioVO en el swf de salida, //de modo que reconozca los objetos recibidos desde WebORB. private var forceimport:Array = [UsuarioVO];
private function onResult(event:ResultEvent):void{ usuarios = ArrayCollection(event.result); //Es necesario convertir el "result" a un ArrayCollection (Eso se llama hacer cast) //Asignamos al ArrayCollection, //la coleccin de objetos de //transporte recibidos desde WebORB. }
]]>
</mx:Script>
<!-- Instanciamos un RemoteObject, le damos nombre ?srv? y le indicamos a que destination hace referencia, o sea que clase ha de usar WebORB cuando srv haga llamadas, que tal como vimos antes, era nuestra clase UsuarioService --> <mx:RemoteObject id="srv" destination="myweborb-service" showBusyCursor="true" fault="Alert.show(event.fault.faultString, 'Error')" >
<!-- Declaramos qu metodo de la clase PHP vamos a usar y que funcin de Flex queremos que trate los resultados que ese metodo nos devuelva --> <mx:method name="getUsuario" result="onResult(event)"/>
</mx:RemoteObject>
</mx:Application>
Ahora tan solo nos queda dar de alta en /Weborb/WEB-INF/flex/remoting-config.xml nuestro destination tal y como vimos antes, para que el compilador de Flex encuentre la clase remota a llamar a la hora de generar nuestro swf, para ello incluiremos en dicho fichero el siguiente segmento de cdigo (Si ya lo hiciste antes en la configuracin, no necesitas duplicarlo): <destination id="myweborb-service"> <!-- Id para llamar desde Flex -->
<properties>
</properties> </destination> Ya tenemos todo, ahora solo queda compilar en Flex y probarlo. No olvides enviar tus preguntas al foro de Flex y Actionscript 3 o al de WebORB.
Adems usaremos FlexBuilder2 para configurar el proyecto y obtener el swf final. Configurar el proyecto con algn otro framework es bastante complicado, pero siempre pueden probar FlashDevelop.
Instalacin de WebOrb
Instalar WebOrb es muy sencillo. Adems tiene la ventaja de que podemos tratar en ActionScript instancias de una clase de php con toda naturalidad, y sin tanto cdigo como hace falta para AMFPHP. Simplemente tenemos que descargar la ltima versin para php desde aqu: http://www.themidnightcoders.com/weborb/php/weborb-php-latest.zip Ahora tenemos que descomprimir el archivo .zip que hemos conseguido en la raiz de nuestro sitio (la carpeta www donde tenemos nuestro index, vamos). Ahora, para comprobar que todo funciona abrimos el archivo http://tusitio/Examples/FlexRemoting/main.html, que si trabajamos en local ser http://localhost/Examples/FlexRemoting/main.html. Los 5 primeros test deberan funcionar sin problemas y el sexto una vez hayamos ejecutado el desde phpmyadmin (u otra cosa parecida) el archivo siguiente archivo: DIRECTORIOWEB\Services\weborb\tests\northwind.sql. Aqu est el tutorial en ingls de la web oficial.
Nota: Pueden crear la base de datos ejecutando el archivo flexphp_bd/flexphp.sql de los archivos det tutorial.
class misquerys{
$comentarios = utf8_encode($comentarios); $sql= "INSERT INTO prueba (id,nombre,comentarios) VALUES ('','".$nombre."','". $comentarios."')"; return $this->query($sql,1); //retornamos el id de nuestro registro insertado
function eliminar ($id){ $sql= "DELETE FROM prueba WHERE id='".$id."' LIMIT 1"; return $this->query($sql,0); }
function modificar ($id,$nombre,$comentarios){ $nombre = utf8_encode($nombre); $comentarios = utf8_encode($comentarios); //creamos la cadena de nuestra sentencia(query) SQL
$sql = "UPDATE `prueba` SET `nombre` ='".$nombre."', `comentarios` ='". $comentarios."' WHERE `id` =".$id." LIMIT 1;"; return $this->query($sql,0); }
function consulta (){ $sql = "SELECT * FROM prueba ORDER BY id "; return $this->query($sql,0); }
function query ($sql, $accion){ $conex= mysql_connect("tuhost","user","password") or die("no se puede conectar porque ".mysql_error()); mysql_select_db("flexphp"); $result= mysql_query($sql,$conex); if ($accion && result){ $result= mysql_insert_id(); } mysql_close($conex); return $result; }
?>
Explicacin:
Una descripcin detallada de cada mtodo: Nombre Parmetros Explicacin Inserta los parmetros a los respectivos campos de la tabla, codificando con utf8_encode los parmetros para entender la codificacin que hace flash con el escape para mandarle los parmetros y crea la respectiva sentencia SQL. Crea la sentencia SQL DELETE con la condicin de que id sea el que recibio. Crea la sentencia SQL UPDATE, buscando el registro cuyo campo id corresponda con $id y actualiza los campos nombre y comentarios con los respectivos parmetros. Valor de Retorno
insertar
$nombre, $comentarios
Retorna el id del registro insertado en tal caso de que se haya hecho exitosamente.
eliminar
$id
modificar
consulta
ninguno
Crea la sentencia SQL SELECT para seleccionar todos los registros de la tabla.
query
$sql, $accion
$sql ser la sentencia SQL que ejecutar, $accion es para hacer una excepcin de que si la sentencia es un INSERT.
un recordSet. Para eliminar y modificar: 1 o 0 en caso de que haya sido exitosa la operacin.
Noten que en el cdigo, en la funcin query, donde pone "tuhost, "user" y "password" tendrn que sustituirlos por sus datos. Ahora tenemos que decirle a WebOrb que este servicio existe: Vamos a la carpeta principal>Weborb>WEB-INF>flex y abrimos el archivo remoting-config.xml. En l, al final del cdigo, antes del ltimo </service> aadimos lo siguiente <destination id="misquerys"> <properties> <source>misquerys</source> </properties> </destination> </service>
C:\wamp\www\Examples. Tambin tendremos que darle la ruta que tendr cuando aparezca en el navegador al darle al botn de compilar, en el caso anterior sera esta: http://localhost/Examples. De nuevo, esto pueden verlo en ingls en la ayuda de WebOrb. Y por fin podemos empezar a programar mxml.
<!--
****************LAYOUT*****************
-->
<!--El componente Panel es un contenedor "bonito" en el que adems podemos poner un ttulo. Lo usaremos para contener toda la aplicacin, y usando un tamao relativo del 100% haremos que se adapte al espacio del que dispone, al igual que con el resto de los componentes--> <mx:Panel title="Operaciones de Bases de Datos con Flex2" width="100%" x="0" height="100%" y="0"> <!--El contenedor VBox fuerza a todos los componentes que tiene dentro a posicionarse uno debajo de otro. Podemos usarlo para posicionar los componentes que iremos aadiendo. A este VBox le damos un nombre de instancia (id) ya que lo usaremos despus para agregarle componenentes--> <mx:VBox x="0" y="0" width="100%" height="100%" horizontalAlign="center" id="vbox1"> <!--El componente DataGrid ser el encargado de mostrar la informacin de los registros. Haceoms que ocupe todo el espacio disponible (que adems del tamao de la ventana estar determinado por los componentes que tengamos en cada estado) Al seleccionar otro elemento, hacemos que cambie una variable, que despus necesitaremos para seleccionar el datagrid. --> <mx:DataGrid width="100%" id="datagrid" height="100%" change="{dgIndex=datagrid.selectedIndex}"> <mx:columns> <!--Colocamos 3 columnas, cuyo atributo dataField ser el nombre de la propiedad del correspondiente item que querramos mostrar, aunque aqu ms bien lo usaremos como apuntador, ya que definimos una funcin para mostrar los datos. --> <mx:DataGridColumn headerText="ID" dataField="id" sortCompareFunction="numericSort"/> <mx:DataGridColumn headerText="Nombre" dataField="nombre" labelFunction="dataGridLabelFunction"/>
<mx:DataGridColumn headerText="Comentarios" dataField="comentarios" labelFunction="dataGridLabelFunction"/> </mx:columns> </mx:DataGrid> <!--El contenedor Grid es semejante a una tabla de html. Aqu lo he usado para que los botones se distribuyan en funcin del espacio disponible. --> <mx:Grid width="100%" horizontalAlign="center" id="buttonsGrid"> <mx:GridRow width="100%" height="100%" horizontalAlign="center" id="gridrow1"> <mx:GridItem width="100%" height="100%" horizontalAlign="center"> <mx:Button label="Consultar" id="btnConsultar" click="onButtonPress(event);"/> </mx:GridItem> <mx:GridItem width="100%" height="100%" horizontalAlign="center"> <mx:Button label="Insertar" id="btnInsertar" click="onButtonPress(event);"/> </mx:GridItem> <mx:GridItem width="100%" height="100%" horizontalAlign="center"> <mx:Button label="Modificar" id="btnModificar" click="onButtonPress(event);"/> </mx:GridItem> <mx:GridItem width="100%" height="100%" horizontalAlign="center"> <mx:Button label="Eliminar" id="btnEliminar" click="onButtonPress(event);"/> </mx:GridItem> </mx:GridRow> </mx:Grid>
<!--Un componente HBox hace lo mismo que un VBox pero en horizontal (los componentes se alinean uno al lado de otro)--> <mx:HBox width="100%"> <mx:Label text="Estado:"/> <mx:Label id="estadotxt" text="cargando..."/> </mx:HBox> </mx:VBox> </mx:Panel> <!--Los estados de Flex permiten alternar rpidamente entre diferentes conjuntos de componentes. En ActionScript cambiamos de estado con la propiedad currentState="nombreEstado", y al estado inicial nos referimos con una cadena vaca ""--> <mx:states> <mx:State name="commands"> <!--Dentro de la etiqueta AddChild colocamos los componentes que incluiremos en el nuevo estado. adems usamos el parmetro relativeTo, para referirnos al contenedor en el que colocaremos los componentes y position, para indicarle que ser al final. De todas formas, si trabajas en modo diseo, esto lo hace el FlexBuilder slo--> <mx:AddChild relativeTo="{vbox1}" position="lastChild"> <mx:VBox width="100%" horizontalAlign="center"> <mx:HBox width="100%" horizontalAlign="center"> <mx:VBox> <mx:Label text="ID" id="idlbl"/>
<mx:TextInput id="idtxt" editable="false"/> </mx:VBox> <mx:VBox> <mx:Label text="Nombre" id="nombrelbl"/> <mx:TextInput id="nombretxt"/> </mx:VBox> <mx:VBox> <mx:Label text="Comentarios" id="comentarioslbl"/> <mx:TextInput id="comentariostxt"/> </mx:VBox> </mx:HBox> <mx:Label text="Desea insertar este registro?" id="preguntatxt"/> <mx:HBox width="100%" horizontalAlign="center"> <mx:Button label="S" id="btnSi" click="onButtonPress(event);"/> <mx:Button label="No" id="btnNo" click="onButtonPress(event);"/> </mx:HBox> </mx:VBox> </mx:AddChild> <mx:SetProperty target="{datagrid}" name="enabled" value="false"/> <mx:RemoveChild target="{buttonsGrid}"/> </mx:State> </mx:states>
<!--***************CDIGO*****************-->
<!-Usaremos el remoteObject para acceder a nuestro servicio en php. En "destination" ponemos el id que hemos definido en remoting-config.xml. Ponemos el parmetro showBusyCursor en true para que nos salga un relojito en el cursor mientras estamos esperando las operaciones. --> <mx:RemoteObject id="remoteObject" destination="misquerys" showBusyCursor="true"> <!-Definimos listeners distintos result y el mismo de fault (error) para cada una de las funciones de la clase de php. Los listeners se invocarn cuando se complete la funcin y devuelva un resultado, event.result.
--> <mx:method name="consulta" result="consulta_Result(event)" fault="onFault(event)"/> <mx:method name="insertar" result="insertar_Result(event)" fault="onFault(event)"/> <mx:method name="modificar" result="modificar_Result(event)" fault="onFault(event)"/> <mx:method name="eliminar" result="eliminar_Result(event)" fault="onFault(event)"/> </mx:RemoteObject> <!-- En la etiqueta Script irn todas las funciones que utilizaremos.--> <mx:Script> <![CDATA[ //Importamos la clase ArrayCollection, que usaremos en el DataProvider.
import mx.collections.ArrayCollection; //Importamos la clase para trabajar con las comlumnas del dataGrid, que ser necesaria para definir //funcin con la que rellenaremos el dataGrid import mx.controls.dataGridClasses.DataGridColumn; //Importamos las clases para trabajar con los remoteObjects de WebOrb import mx.rpc.remoting.*; import mx.controls.*; import mx.rpc.events.* //Importamos los detectores de eventos import flash.events.Event; //Una variable que necesitaremos para saber qu operacin realizar private var action:Number; // // // //Esta variable servir para definir el nduce en el que tendr que estar el datagrid //alrealizar una consulta private var dgIndex:int=0; // // //Esta variable contiene el resultado de la peticin. Su tipo de datos ser // ArrayCollection, el recomendado para dataProviders. //El metatag Bindable har que la variable se pase por referencia: //si ella cambia, las dems cambian.
[Bindable] private var resultado:ArrayCollection // // // //Al ejecutarse una consulta... private function consulta_Result(event:ResultEvent):void{ //rellenamos la variable resultado con los datos obtenidos en la consulta, //tratando de convertirlos en un Array usando el operador "as". resultado=new ArrayCollection(event.result as Array); //Rellenamos el dataGrid con los datos que hemos recibido datagrid.dataProvider=resultado; //Si hay al menos un registro... if (resultado[0]){ estadotxt.text="Consulta completada"; //Seleccionamos el primer elemento del datagrid. datagrid.selectedIndex=dgIndex; //Mostramos los botones de Eliminar y Modificar por si estaban deactivados btnModificar.enabled=btnEliminar.enabled=true; //Si no... }else{ //Desactivamos los botones de Eliminar y Modificar btnModificar.enabled=btnEliminar.enabled=false; estadotxt.text="No hay registro que mostrar"; }
} // // // //El resultado de insertar un registro: private function insertar_Result(event:ResultEvent):void{ //Si todo sali bien... if (event.result){ estadotxt.text = "La insercin se realiz exitosamente"; dgIndex=datagrid.dataProvider.length; //Volvemos a cargar los datos actulizados remoteObject.consulta(); } else { estadotxt.text = "La insercin no fue completada, intente de nuevo"; } } //Lo mismo para las funciones modificar y eliminar private function modificar_Result(event:ResultEvent):void{ if (event.result){ estadotxt.text = "La modificacin se realiz exitosamente"; remoteObject.consulta(); } else { estadotxt.text = "La modificacin no fue completada, intente de nuevo"; } }
private function eliminar_Result(event:ResultEvent):void{ if (event.result){ estadotxt.text = "El registro se elimin correctamente"; remoteObject.consulta(); } else { estadotxt.text = "El registro no se elimin, la operacin fall"; } } // // // //Muestra el error al no poder ejecutarse alguna funcin public static function onFault(event:FaultEvent):void { Alert.show(event.fault.faultString, 'Error'); } // // // //Esto pasar cada vez que se pusle un botn: private function onButtonPress(event:Event):void{ //Segn el boton que hayamos pulsado... switch (event.target){ case btnConsultar: remoteObject.consulta();
estadotxt.text="Consultando..." break; case btnInsertar: //Usamos la variable action para saber a cul de las acciones posibles nos referimos, //para evaluarlas despus, al presionar el botn Si action = 1; //Nos ponemos en el estado donde estn todos los mens currentState="commands"; //No necesitamos que se pueda insertar el id idtxt.text="##"; //Borramos los otros campos de texto nombretxt.text= ""; comentariostxt.text= ""; preguntatxt.text="Desea insertar este registro?"; nombretxt.editable=true; comentariostxt.editable=true; break; case btnModificar: //Nos ponemos en el estado donde estn todos los mens currentState="commands"; //Mostramos el elemento seleccionado en el DataGrid, con los carcteres codificados //correctamente idtxt.text= datagrid.selectedItem.id.toString(); nombretxt.text= unescape(datagrid.selectedItem.nombre);
comentariostxt.text= unescape(datagrid.selectedItem.comentarios); action = 2; preguntatxt.text="Desea modificar este registro?"; nombretxt.editable=true; comentariostxt.editable=true; break; case btnEliminar: //Nos ponemos en el estado donde estn todos los mens currentState="commands"; idtxt.text= datagrid.selectedItem.id.toString(); nombretxt.text= unescape(datagrid.selectedItem.nombre); comentariostxt.text= unescape(datagrid.selectedItem.comentarios); action = 3; preguntatxt.text="Desea eliminar este registro?"; nombretxt.editable=false; comentariostxt.editable=false; break; case btnSi: switch (action){ //Si la accin es... case 1: //Realizamos la funcin php que hemos pedido. remoteObject.insertar(escape(nombretxt.text), escape(comentariostxt.text)); break;
case 2: remoteObject.modificar(idtxt.text,escape(nombretxt.text), escape(comentariostxt.text)); break; case 3: remoteObject.eliminar(idtxt.text); break; } //Volvemos al estado principal currentState=""; break; case btnNo: currentState=""; break;
} } //Funcin para mostrar correctamente el DataGrid public function dataGridLabelFunction(item:Object, column:DataGridColumn):String{ //Devuelve lo mismo, pero aplicando un unescape return unescape(item[column.dataField].toString()); } //Funcin para ordenar los datos de la columna id de manera numrica, no alfabtica: public function numericSort(a:*,b:*):int{ var nA:Number=Number(a.id);
var nB:Number=Number(b.id); if (nA<nB){ return -1; }else if (nA>nB){ return 1; }else { return 0; } } ]]> </mx:Script> </mx:Application> En el primer estado coloco un Panel, que ocupar todo el espacio disponible del swf (hago esto con el width=heigth=100%) y dentro un DataGrid que tambin intentar ocupar todo el espacio. El DataGrid (datagrid) ser quien muestre la informacin. Sus tres columnas, que muestran cada una la informacin del objeto del dataProvider que les indica el parmetro dataField, aunque aqu sirve ms bien de indicador ya que las columnas tienen una labelFunction para mostrar la informacin decodificada (ya que si no hay problemas con los carcteres raros y es la solucin mas fcil). La columna que muestra la propiedad id tiene una sortCompareFunction, para que al presionar sobre ella los datos se ordenen de forma numrica, no alfabtica. Debajo del DataGrid coloco un Grid de una fila, que permitir mantener los botones que lleva dentro distribuidos segn el espacio disponible. Debajo hay una caja de texto que nos ir informando sobre el transcurso de las operaciones. Los tres ltimos paneles llevan al segundo estado, que aade tres cajas de texto y los botones para confirmar o cancelar la operacin, elimina los botones principales y deshabilita el datagrid. Segn el botn que hayamos pulsado, las cajas de texto sern o no editables y mostrarn unos datos u otros. Al insertar un registro, no podremos usar el campo id, ni modificarlo al pulsar el botn modificar. Con el botn eliminar se vern los tres campos pero ninguno ser editable. Al pulsar el botn No simplemente volveremos al estado principal y al presionar el btnSi adems realizaremos la operacin solicitada con el Remote Object de php.
Conclusiones
Flex crea un nuevo mundo de posiblidades en las aplicaciones de Internet, permitiendo un manejo de datos potente y fcil y una rapidsima forma de montar proyectos que en Flash costaran mucho ms tiempo (eso s, una vez que te acostumbras a programar con l ;) ).