[img]http://l4c.me/fotos/shinodax/phpyflex[/img]
y los codigo
PHP
Código PHP :
<?php class misquerys{ function insertar($nombre,$comentarios){ $nombre = utf8_encode($nombre); $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("localhost","root","aranibar") 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; } } ?>
FLEX
Código Flex :
<?xml version="1.0" encoding="utf-8"?> <!-- Definimos la aplicación añadiendo una función creationComplete que realizará una consulta con el remote que definiremos. --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="remoteObject.consulta()"> <!-- ****************LAYOUT***************** --> <!--El componente Panel es un contenedor "bonito" en el que además podemos poner un título. Lo usaremos para contener toda la aplicación, y usando un tamaño 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 añadiendo. A este VBox le damos un nombre de instancia (id) ya que lo usaremos después 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 información de los registros. Haceoms que ocupe todo el espacio disponible (que además del tamaño de la ventana estará determinado por los componentes que tengamos en cada estado) Al seleccionar otro elemento, hacemos que cambie una variable, que después 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í más bien lo usaremos como apuntador, ya que definimos una función 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 función 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 rápidamente entre diferentes conjuntos de componentes. En ActionScript cambiamos de estado con la propiedad currentState="nombreEstado", y al estado inicial nos referimos con una cadena vacía ""--> <mx:states> <mx:State name="commands"> <!--Dentro de la etiqueta AddChild colocamos los componentes que incluiremos en el nuevo estado. además usamos el parámetro 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 diseño, esto lo hace el FlexBuilder sólo--> <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> <!--***************CÓDIGO*****************--> <!-- Usaremos el remoteObject para acceder a nuestro servicio en php. En "destination" ponemos el id que hemos definido en remoting-config.xml. Ponemos el parámetro 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 invocarán cuando se complete la función 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 irán 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 //función 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é operación 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 petición. 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 demás 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 inserción se realizó exitosamente"; dgIndex=datagrid.dataProvider.length; //Volvemos a cargar los datos actulizados remoteObject.consulta(); } else { estadotxt.text = "La inserción 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 modificación se realizó exitosamente"; remoteObject.consulta(); } else { estadotxt.text = "La modificación 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 operación falló"; } } // // // //Muestra el error al no poder ejecutarse alguna función public static function onFault(event:FaultEvent):void { Alert.show(event.fault.faultString, 'Error'); } // // // //Esto pasará cada vez que se pusle un botón: private function onButtonPress(event:Event):void{ //Según el botoón que hayamos pulsado... switch (event.target){ case btnConsultar: remoteObject.consulta(); estadotxt.text="Consultando..." break; case btnInsertar: //Usamos la variable action para saber a cuál de las acciones posibles nos referimos, //para evaluarlas después, al presionar el botón Si action = 1; //Nos ponemos en el estado donde están todos los menús 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 están todos los menús currentState="commands"; //Mostramos el elemento seleccionado en el DataGrid, con los carácteres 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 están todos los menús 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 acción es... case 1: //Realizamos la función 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; } } //Función 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()); } //Función para ordenar los datos de la columna id de manera numérica, no alfabética: 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>
SON CODIGO DE UN EJEMPLO DE UN TUTORIAL
EN WEB-INF TENGO LO SIGUIENTE:
services-config.xml
Código XML :
<?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service-include file-path="remoting-config.xml" /> <service-include file-path="messaging-config.xml" /> </services> <channels> <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel"> <endpoint uri="weborb.php" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>false</polling-enabled> </properties> </channel-definition> <channel-definition id="my-rtmp" class="mx.messaging.channels.AMFChannel"> <endpoint uri="weborb.php" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>false</polling-enabled> </properties> </channel-definition> <channel-definition id="weborb-rtmp" class="mx.messaging.channels.AMFChannel"> <endpoint uri="weborb.php" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>false</polling-enabled> </properties> </channel-definition> <channel-definition id="my-amf-absolute" class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://localhost/weborb/PHP/weborb.php" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>false</polling-enabled> </properties> </channel-definition> <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel"> <endpoint uri="weborb.php" class="flex.messaging.endpoints.SecureAMFEndpoint"/> </channel-definition> <channel-definition id="my-air-amf" class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://localhost:80/Weborb/weborb.php" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>false</polling-enabled> </properties> </channel-definition> <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel"> <endpoint uri="weborb.php" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>true</polling-enabled> <polling-interval-seconds>1</polling-interval-seconds> </properties> </channel-definition> </channels> </services-config>
remoting-config.xml
Código XML :
<?xml version="1.0" encoding="UTF-8"?> <service id="remoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <adapters> <adapter-definition id="php-object" default="true"/> </adapters> <default-channels> <channel ref="my-amf"/> <channel ref="my-rtmp"/> <channel ref="my-amf-absolute"/> </default-channels> <destination id="AccountBalanceDestination"> <properties> <source>Weborb.Examples.AccountBalance</source> </properties> <security> <security-constraint> <auth-method>Custom</auth-method> <roles> <role>examplesuser</role> </roles> </security-constraint> </security> </destination> <destination id="PrimitiveTest"> <properties> <source>Weborb.tests.PrimitiveTest</source> </properties> </destination> <destination id="DatabaseTestMsSql"> <properties> <source>Weborb.tests.DatabaseTestMsSql</source> </properties> </destination> <destination id="DatabaseTestMySql"> <properties> <source>Weborb.tests.DatabaseTestMySql</source> </properties> </destination> <destination id="MultipleArgsTest"> <properties> <source>Weborb.tests.MultipleArgsTest</source> </properties> </destination> <destination id="StringsTest"> <properties> <source>Weborb.tests.StringsTest</source> </properties> </destination> <destination id="PrimitiveArrayTest"> <properties> <source>Weborb.tests.PrimitiveArrayTest</source> </properties> </destination> <destination id="ComplexTypesTest"> <properties> <source>Weborb.tests.ComplexTypesTest</source> </properties> </destination> <destination id="InfoServiceDestination"> <properties> <source>InfoService</source> </properties> </destination> <destination id="SecureTest"> <properties> <source>Weborb.Examples.AccountBalance</source> </properties> <security> <security-constraint> <auth-method>Custom</auth-method> <roles> <role>examplesuser</role> </roles> </security-constraint> </security> </destination> <destination id="WeborbManagement"> <properties> <source>Weborb.Management.ManagementService</source> </properties> </destination> <destination id="WeborbSecurity"> <properties> <source>Weborb.Management.SecurityService</source> </properties> </destination> <destination id="WeborbConfiguration"> <properties> <source>Weborb.Management.ConfigurationService</source> </properties> </destination> <destination id="WDMFCodeGen"> <properties> <source>Weborb.Management.DataManagement.Codegen.AppHandler</source> </properties> </destination> <destination id="GenericDestination"> <properties> <source>*</source> </properties> </destination> <destination id="GenericAIRDestination"> <channels> <channel ref="my-air-amf"/> </channels> <properties> <source>*</source> </properties> </destination> <destination id="BusinessIntelligenceDestination"> <properties> <source>Weborb.Management.RBIManagementService</source> </properties> <channels> <channel ref="my-amf"/> </channels> </destination> <destination id="misquerys"> <properties> <source>misquerys</source> </properties> </destination> </service>
NUEVAMNETE ME ESTOY VOLVIENDO LOCO