OBSERVACION: amfPHP 1.9 es soportado hasta Php 5.2.xxx
OOBSERVATION: amfPHP 1.9 is supported only for Php 5.2.xxx
Esta aplicación es básicamente para demostrar que si usamos apropiadamente flex podemos dejar volar nuestra imaginación hasta lograr cualquier cosa que deseemos.
This application is basically build to test flex and se how we can use flex so we can create any application that at imagination can dream for.
A veces necesitamos salir del paso, con un cliente que nos pide una página, y nos dice solo quiero algo sencillo, donde puedan ver mi biografía y escuchar un preview de mi música.
No voy a mentir, hacerlo en HTML es lo más sencillo y rápido, pero si queremos que el cliente quede contento, y también no perder mucho tiempo en programación, podemos hacerlo todo en flex, en menos de un día, y de seguro nuestro cliente quedara más que feliz porque tendrá las 3 B (Bueno, Bonito, y Barato) y eso nos abrirá la puerta a otros clientes que quieran salir a la web con algo sencillo.
Así queda demostrado que lo sencillo puede ser bonito, sin tener que invertir mucho tiempo de mas.
Sometimes we need to muddle through with a client who asks us a page, and tells us just want something simple, where they can see my biography and listen to a preview of my music.
I will not lie, do it in HTML is as simple and quick, but if we want the customer is happy, and not lose much time in programming, can do everything in flex, in less than a day, and surely our client because there would be more than happy to have the 3 B (Bueno, Bonito, and cheap) and it will open the door to other customers who want to go to the website with something simple.
This is established that simplicity can be beautiful without having to invest much more time.
Son las imágenes con las cual vamos a trabajar, son imágenes conseguidas por google image, escogí estas 3 imágenes, y vamos a utilizarlas para aminarlas un poco con Flash CS3 para luego ser exportadas y ser utilizadas en Flex.
Imagen 1: Imagen 2: Imagen 3:
Una vez bajadas las imágenes, las importamos a flash CS3, y vamos a cambiarle el sentido a las flechas la flecha que sale de la caja, supongamos que representara perdidas de algún tipo, por lo que lo coloreamos de Rojo y las flecha hacia dentro representara ganancias y lo coloreamos de verde. Y le damos una animación como si estuviera ingresando o saliendo, con respecto a la grafica, podemos borrar la flecha que está dentro de la imagen y redibujarla con una animación como si estuviera rebujándose en el momento.
Dentro del mismo flash, le colocamos los códigos de animación On mouse Over, y On mouse Out. Para animar y dejar de animar los mismo.
Flash:
Una vez que exportemos nuestras animaciones, vamos a Flex y dentro de nuestra carpeta scr en donde tengamos los assets colocamos nuestro swf exportado de flash.
Luego creamos nuestro código en Flex y tenemos nuestros resultados.
En este tutorial vamos a hacer que un datagrid se llene con información de una base de datos en MySQL y además vamos a crear un formulario donde podamos dejar nuestro nombre y un mensaje.
Esto lo vamos a lograr con amfphp conectándose a MySQL y flex mostrando toda la interfaz.
Lo primero que vamos a crear es crear la lógica de Base de dato de MySQL, esta lógica fue creada por una Compañero de trabajo llamado “Joel Moya” quien me dio los scripts para crear seleccionar e insertar en la base de dato:
Ya que tenemos la base de datos podemos crear nuestras funciones remotas una para consultar de la base de datos y otra para insertar en ella:
<?php
Header('Cache-Control: no-cache');
Header('Pragma: no-cache');
class DataGridService
{
var $link;
function DataGridService(){
$this->link = mysql_connect("localhost", "verlasco_dydUser", "mypassword") or die ("No conecta con SQLSERVER");
mysql_select_db("verlasco_dyd", $this->link);
}
function getAllMessages(){
include_once("vo/com/dyd/tutorial/vo/MessageVO.php");
$Result = mysql_query("SELECT * From DataGridMessageTutorial ORDER BY id DESC;", $this->link );
while ($row = mysql_fetch_array($Result, MYSQL_ASSOC))
{
$my_user = new MessageVO();
$my_user->id = $row['id'];
$my_user->name = $row['name'];
$my_user->message = $row['message'];
$list_of_users[] = $my_user;
}
return $list_of_users;
}
function saveMessage($obj){
$sql = "INSERT INTO DataGridMessageTutorial (
id,
name,
message
)
VALUES (
NULL , '$obj->name', '$obj->message'
);";
return mysql_query(sprintf($sql));
}
}
?>
Notemos que en la línea 16 hay un new MessageVO() y en la línea 32 se accede a 2 atributos dentro de un objeto, esto es debido a un VO o Value Object esto nos permite enviar y recibir objetos entre el cliente y el servidor, del lado del servidor se construye así:
<?php
class MessageVO {
var $_explicitType = "com.dyd.tutorial.vo.MessageVO";
var $id;
var $name;
var $message;
}
?>
Ahora que tenemos el lado del servidor listo podemos empezar a crear el lado del cliente.
Entonces creemos un Datagrid y un pequeño formulario que contenga nombre y un mensaje:
Creamos el VO del Lado del Cliente también para poder recibir y enviar los mismos datos:
package com.dyd.tutorial.vo
{
[Bindable]
[RemoteClass(alias="com.dyd.tutorial.vo.MessageVO")]
public class MessageVO
{
public var id:String;
public var name:String;
public var message:String;
}
}
Y aquí les dejo dos imágenes en las cuales vemos como son las rutas de los archivos tanto del lado del cliente como del lado del Servidor: Ejemplo:
In this Example we want a data grid that fills from a MySQL Database and also we want to save all the messages and name from a form so anybody can leave a message.
So for this we are going to use amfphp to connect to MySQL and flex to display everything.
The first thing we have to do is Database Logic for MySQL and a co worker and also a good friend “Joel Moya” gave me the script to create select and insert in the Database:
Know with the database ready we can create the remote function in php, we are going to create 2 function one to consult and one to Insert in the database:
<?php
Header('Cache-Control: no-cache');
Header('Pragma: no-cache');
class DataGridService
{
var $link;
function DataGridService(){
$this->link = mysql_connect("localhost", "verlasco_dydUser", "mypassword") or die ("No conecta con SQLSERVER");
mysql_select_db("verlasco_dyd", $this->link);
}
function getAllMessages(){
include_once("vo/com/dyd/tutorial/vo/MessageVO.php");
$Result = mysql_query("SELECT * From DataGridMessageTutorial ORDER BY id DESC;", $this->link );
while ($row = mysql_fetch_array($Result, MYSQL_ASSOC))
{
$my_user = new MessageVO();
$my_user->id = $row['id'];
$my_user->name = $row['name'];
$my_user->message = $row['message'];
$list_of_users[] = $my_user;
}
return $list_of_users;
}
function saveMessage($obj){
$sql = "INSERT INTO DataGridMessageTutorial (
id,
name,
message
)
VALUES (
NULL , '$obj->name', '$obj->message'
);";
return mysql_query(sprintf($sql));
}
}
?>
Notice that in the line 16 the is an new MessageVO() and in the line 32 I can access to properties from a object, that is because we made an VO or Value Object this value Object lets us pass Object in the functions and send it back to the client:
<?php
class MessageVO {
var $_explicitType = "com.dyd.tutorial.vo.MessageVO";
var $id;
var $name;
var $message;
}
?>
Know we have the remote side complete we need the client side.
So we are going to paint a Datagrid and a little form that contains a name and a message:
The VO we are sending we have to have it to in the client side so let’s made it:
package com.dyd.tutorial.vo
{
[Bindable]
[RemoteClass(alias="com.dyd.tutorial.vo.MessageVO")]
public class MessageVO
{
public var id:String;
public var name:String;
public var message:String;
}
}
En este post se explicara paso por paso, como se lleva a cabo la ejecución de un ciclo completo de Cairngorm UM Extension. Universal Mind le agregaron una extensión al Cairngorm donde el diagrama cambia un poco.
Si queremos Ver el Cairngorm en su esquema básico podemos verlo en este interesante post en la pagina expuesta a continuación: http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html
El esquema de Universal Mind, se puede resumir en el siguiente diagrama:
This post will explain step by step, as performed by the execution of a complete cycle of UM Cairngorm Extension. Universal Mind Cairngorm Added an extension to a diagram and it change a bit from the original Cairngorm.
If we want to view the Cairngorm in its basic outline, we can visit this post that explains the bacis cicle: http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html
The scheme of Universal Mind, can be summarized in the following diagram:
Lo primero que debemos hacer para poder programar con los mapas de Google es bajarnos el api, el cual lo podemos encontrar en la siguiente dirección SDK Google Maps, luego necesitaremos una clave para poder usar el mapa de Google el cual podemos encontrarlo en esta página Google Maps Key, con estos dos requisitos estamos listos para jugar un poco con los mapas de Google, su página de ayuda tiene muchos ejemplos y cosas que podemos hacer sobre el mapa de ellos, esta ayuda la podemos encontrar en esta pagina Google Maps Doc.
The first thing we have to do to be able to develop with Google Maps is to download the API, this API we can find it in this link SDK Google Maps. The next thing we have to do to be able to use Google Map is go to a Google maps page and agree with some terms so we can get an Map Key we can get this Key in this link Google Maps Key. With these two things we are now ready to play a little with Google maps. Google Maps has a lot and very good info and doc’s and even better they have examples that can guide us through Google Map, this link is Google Maps Doc’s.
Como muchas veces no queremos lo que unos ofrece un API sino queremos jugar con varias cosas a la vez, con esto me refiero a que queremos botones más vivos tags que sean animados y aplicar nuestro propio toque a nuestras aplicaciones, Google nos ofreció algo maravilloso llamado OVERLAY un overlay traducido es una capa que se le coloca encima a algo. Los tags y las figuras básicas que ofrece Google son overlay pero Google dentro de esto nos ofrece el CUSTOM OVERLAY, ahí es donde entra nuestra imaginación. Esto lo podemos leer en la sección de ayuda de Google Maps en esta página Google Maps Custom Overlay.
Often we like to do something more complex than the API can provide, so we have to use other language to do so, with this am talking about nice buttons o tag over the map that we can animate easily or even breather, put own on touch in to the development in that we are best.
Google Offers us an tool inside the API called OVERLAY, the OVERLAY in nothing more than a layer that we can just put over the map and do most anything with it, so we can develop over custom and complex tags.
Google offers overlays so you can use their tag and some basic geometric figures, but our custom develops , you are going to use CUSTOM OVERLAY, all of Custom Overlays we can read it in this page Google Maps Custom Overlay.
En una página de adobe Daniel Terraza, un compañero de trabajo y quien me ayudo a programar este componente de prueba, vio unos tags en flex y se nos predio la luz de combinar estos tags con el Google Maps. Estos Tags los pueden conseguir en la página de Adobe como un componente simple, jajajaa cosa que para muchos principiantes en Flex no se les hará tan simple pero ellos dicen que es simple, les dejo la pagina (http://www.adobe.com/devnet/flex/samples/fig_callout/) . En tutoriales futuros hablaremos de Efectos y Transiciones, que fue como se logro este componente, hecho por Adobe, no vi el autor por ningún lado así que no lo menciono.
In a page of adobe Daniel Terrace, a fellow worker and who help me to program this map component, he saw these tags in flex and we thought that way not we out booth together, the tags with Google Maps. We can obtain this Tags in the page of Adobe like a simple component, Hear is the page (http://www.adobe.com/devnet/flex/samples/fig_callout/). In future tutorials we will speak of Effects and Transitions.
Los botones fueron Diseñados Melisa Correia, una compañera de trabajo, estos botones fueron creados usando AI y FL los cuales fueron importados como Skins usando las herramientas que brinda Adobe.
Los dos canvas con color degradado fue sacado de Gradient Canvas y su autor es Arnaud FOUCAL.
The buttons were designed Melisa Correia, a fellow worker, these buttons were created using AI and FL which were imported into flex like Skins having used the tools that Adobe offers.
The canvas with degraded color was found from Gradient Canvas and his author is Arnaud FOUCAL excellent Job me I say.
Este ejemplo se construyo para aquellas personas apasionadas por los relojes Binarios. Y si eres programado puedas construir tu propio reloj binario y colocarle un estilo personal al mismo.
El Reloj se construyo usando Flex 3, colocando de forma ordenada varios Check Box, los cuales se le creó un Skin en Flash CS3 y se importo el CSS a Flex para tener estos Check Box Verdes como se ven en el ejemplo.
This example was built for people passionate about watches binaries. And if you are scheduled you can build your own binary clock and place a personal style to it.
The clock was built using Flex 3, placing more orderly Check Box, which he created a skin in Flash CS3 and Flex CSS matter to have these Green Check Box as seen in the example.
Nota: Haz Click sobre el ejemplo, dentro de la zona gris claro.
Esto es una prueba de la librería APE Physis, les posteo el código el cual fue tomado en principio por un ejemplo posteado y fue modificado por nosotros para ver el desempeño de la librería.
Codigo:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundColor="#444444"
creationComplete="initApp()" verticalAlign="top" horizontalAlign="left" >
<mx:Script>
<![CDATA[
import flash.sampler.DeleteObjectSample;
import org.cove.ape.AbstractCollection;
import org.cove.ape.WheelParticle;
import org.cove.ape.RectangleParticle;
import org.cove.ape.AbstractParticle;
import org.cove.ape.Group;
import org.cove.ape.CircleParticle;
import org.cove.ape.Vector;
import org.cove.ape.APEngine;
[Embed(source='/assets/testApeLogo.swf', symbol='renito')]
[Bindable]
public var imgCls:Class;
private var contentHolder:Sprite=new Sprite();
private var defaultGroup:Group=new Group();
private var mousePosition:Point;
private var myTimer:Timer;
private function deleteObjects(e:TimerEvent):void
{
trace("TICK");
var len:int = defaultGroup.getAll().length-1;
var part:AbstractParticle;
for(var i:int =len; i>=0;i--){
trace((alto+100 < AbstractParticle(defaultGroup.getAll()[i]).position.y) + " "+(alto+100) +"<"+AbstractParticle(defaultGroup.getAll()[i]).position.y);
if(alto+100 < AbstractParticle(defaultGroup.getAll()[i]).position.y)
{
part = defaultGroup.getAll()[i];
defaultGroup.removeParticle(part);
delete(part as Object);
}
}
}
private function refreshTimer(e:TimerEvent):void
{
trace("NEW TIMER");
myTimer.removeEventListener(TimerEvent.TIMER,deleteObjects)
myTimer.removeEventListener(TimerEvent.TIMER_COMPLETE,refreshTimer);
myTimer.stop();
myTimer = null;
myTimer = new Timer(10*1000,Number.MAX_VALUE);
myTimer.addEventListener(TimerEvent.TIMER,deleteObjects);
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE,refreshTimer);
myTimer.start();
}
private function initApp():void{
myTimer = new Timer(10*1000,Number.MAX_VALUE);
myTimer.addEventListener(TimerEvent.TIMER,deleteObjects);
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE,refreshTimer);
myTimer.start();
spriteWrapper.addChild(contentHolder);
addEventListener(Event.ENTER_FRAME,run);
APEngine.init(1/3);
APEngine.container=contentHolder;
APEngine.addMasslessForce(new Vector(0,9.8));
defaultGroup.collideInternal=true;
ground=new RectangleParticle(viewScreen.width/2,viewScreen.height-40,viewScreen.width-50,40,0,true);
ground.setFill(0xCCCCCC);
defaultGroup.addParticle(ground);
APEngine.addGroup(defaultGroup);
viewScreen.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
ancho = viewScreen.width;
alto= viewScreen.height;
}
private var ground:RectangleParticle;
private var ancho:Number = 0;
private var alto:Number = 0 ;
private var hijos:int =0;
private function run(e:Event):void{
APEngine.step();
APEngine.paint();
if(hijos != defaultGroup.getAll().length){
hijos = defaultGroup.getAll().length;
trace(defaultGroup.getAll().length);
}
if(ancho != viewScreen.width || alto != viewScreen.height){
defaultGroup.removeParticle(ground);
ground=new RectangleParticle(viewScreen.width/2,viewScreen.height-40,viewScreen.width-50,40,0,true);
ground.setFill(0xCCCCCC);
defaultGroup.addParticle(ground);
}
}
private function addSelectedParticle():void{
var createdParticle:AbstractParticle;
if(radiobutton1.selected)
createdParticle=createCircle();
if(radiobutton2.selected)
createdParticle=createRectangle();
if(radiobutton3.selected)
createdParticle=createWheel();
createdParticle.setFill(itemColor.selectedColor);
defaultGroup.addParticle(createdParticle);
}
private function createCircle():AbstractParticle{
var circle:CircleParticle=new CircleParticle(mousePosition.x,mousePosition.y,circleRadius.value,isFixed.selected,myMasa.value,elastico.value,roce.value);
return circle;
}
private function createRectangle():AbstractParticle{
var rectangle:RectangleParticle = new RectangleParticle(mousePosition.x,mousePosition.y,circleRadius.value*2,circleRadius.value*2,0,isFixed.selected,myMasa.value,elastico.value,roce.value);
return rectangle;
}
private function createWheel():AbstractParticle{
var wheel:WheelParticle = new WheelParticle(mousePosition.x,mousePosition.y,circleRadius.value,isFixed.selected,myMasa.value,elastico.value,roce.value,1);
return wheel;
}
private function onMouseDown(e:MouseEvent):void
{
mousePosition=new Point(e.localX,e.localY);
addSelectedParticle();
}
]]>
</mx:Script>
<mx:HBox width="100%" height="100%" >
<mx:VBox backgroundColor="0xEEEEEE" cornerRadius="5" borderStyle="solid" borderThickness="1">
<mx:Form>
<mx:FormItem label="Forma del Objeto">
<mx:RadioButtonGroup id="particleGroup"/>
<mx:RadioButton label="Circulo" id="radiobutton1" groupName="particleGroup" selected="true"/>
<mx:RadioButton label="Cuadrado" id="radiobutton2" groupName="particleGroup" />
<mx:RadioButton label="Rueda" id="radiobutton3" groupName="particleGroup"/>
</mx:FormItem>
<mx:FormItem label="Masa">
<mx:NumericStepper minimum="1" maximum="100000" stepSize="1000" id="myMasa" value="1"/>
</mx:FormItem>
<mx:FormItem label="Radio/Ancho y Alto">
<mx:NumericStepper minimum="1" maximum="100" stepSize="5" id="circleRadius" value="20"/>
</mx:FormItem>
<mx:FormItem label="Constante de Elasticidad">
<mx:NumericStepper minimum="0" maximum="1" stepSize="0.01" id="elastico" value="0.3"/>
</mx:FormItem>
<mx:FormItem label="Constante de Roce">
<mx:NumericStepper minimum="0" maximum="1" stepSize="0.01" id="roce" value="0.01"/>
</mx:FormItem>
<mx:FormItem label="Color del Relleno">
<mx:ColorPicker id="itemColor" selectedColor="0xFF0000"/>
</mx:FormItem>
<mx:FormItem label="Afectado por la Fuerzas">
<mx:CheckBox id="isFixed" fontStyle="normal" fontWeight="bold" fontSize="14"/>
</mx:FormItem>
</mx:Form>
</mx:VBox>
<mx:Canvas id="viewScreen" width="100%" height="100%" backgroundColor="#FFFFFF" backgroundAlpha=".3" borderStyle="solid" borderThickness="1" cornerRadius="5" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:Image rotation="-45" alpha="1" x="{viewScreen.width/2}" y="{viewScreen.height/2}" source="{imgCls}" horizontalAlign="center" verticalAlign="middle" />
<mx:UIComponent id="spriteWrapper" width="100%" height="100%"/>
</mx:Canvas>
</mx:HBox>
</mx:Application>
OBSERVACION:amfPHP 1.9 es soportado hasta Php 5.2.xxx
Ejemplo a Elaborar:
Para conectar una aplicación Flex con PHP necesitamos un protocolo que pueda hablar los 2 idiomas que pueda hablar Flex y que pueda hablar PHP y aun más pueda traducir lo que habla uno para entender al otro. AMF (Action Message Format) es un formato binario basando en SOAP (Simple Object Access Protocol). AMF fue creado para intercambiar datos entre aplicaciones Adobe Flash y bases de datos, básicamente usando RPC (Remote Procedure Call). AMF contiene una estructura completa que contiene manejo de ERRORES y una RESPUESTA que estaremos esperando como un Objeto de ActionScript, esto quiere decir en pocas palabras que AMF al hacer una petición puede devolver 2 cosas una respuesta en el evento RESULT y si en dado caso exista un error en la trasmisión de datos o simplemente no existe lo que estamos buscando el error se devolverá en el evento FAULT. AMF por ser un formato binario tiende a ser más rápido en la comunicación que el paso POST o GET de PHP o el enviar un XML a php interpretarlo y devolver un XML e interpretarlo en Flash. SOAP, es un protocolo para mandar información estructurada implementada en Web Services, que sirve para hacer RPC para la negociación y recepción de mensajes.
En este ejemplo veremos cómo conectar FLEX con PHP mediante AMFPHP, creando un simple servicio web en el cual mandaremos un mensaje y recibiremos el mismo mensaje en FLEX.
Luego necesitaremos un Servidor Web, yo siempre he usado WAMP y me a funcionado muy bien ya que tiene MySQL , APACHE y PHP y es todo lo que necesitamos. Se lo pueden bajar de la siguiente dirección http://www.wampserver.com/en/download.php
Una ves instalado WAMP tendremos un icono al lado de nuestro reloj del sistema en forma de un semi circulo blanco con negro.
Y también tenemos nuestro Servidor en la siguiente dirección C:/wamp/www donde colocaremos todas nuestras páginas .php .html .asp Etc…
Luego una vez descargado AMFPHP colocaremos la carpeta dentro de WWW la cual nos permitirá acceder a nuestros, servicios vía WEB, creando así nuestro primer WEB SERVICES. Pero aun nos queda mucho camino por recorrer.
Para probar que AMFPHP esté funcionando correctamente dentro de nuestro Browser colocamos http://localhost/amfphp/gateway.php y recibiremos un mensaje “amfphp and this gateway are installed correctly.”
Y procedemos al darle al LINK que dice “Load the service browser” que es lo mejor que se a podido inventar AMFPHP que es un brower de WEB SERVICES donde podemos probar nuestros servicio debugearlos y hasta generar códigos que funcionan en FLX y FLASH para los que SOMOS un poco Flojos al momento de programar.
Una vez dentro de nuestro Services Browse vemos que no hay ningún tipo de servicios asociados al Explorador.
Por lo que crearemos un servicio llamado HelloWorld.php, tenemos que tener mucho cuidado en colocar .php y no cualquier otro tipo de extensión y lo vamos a colocar en la siguiente dirección C:\wamp\www\amfphp\services
Abrimos HelloWord.php con un editor de texto y echamos nuestras funciones la cual constara de una función que recibe un parámetro y devolverá el mismo parámetro pero con un texto concatenado el cual será “USTED ESCRIBIO: ”.
El código de HelloWord.php:
<?php
class HelloWorld
{
function HelloWorld(){
}
function say( $mensaje )
{
return 'USTED ESCRIBIO: ' . $mensaje ;
}
}
?>
Una vez que cuadramos nuestro código recargamos la pagina y veremos que nuestro servicio HelloWord aparece en nuestro Explorador de servicios para probarlo hacemos click sobre HelloWord y nos presentara una entrada de texto donde escribiremos “HOLA MUNDO” y nos responderá “USTED ESCRIBIO: HOLA MUNDO”.
Si todo se ha hecho bien podemos seguir ahora con la programación de un simple programa en Flex. Abriremos Eclipse y crearemos un nuevo Proyecto que tenga como servicio a PHP.
Entonces en Eclipse vamos a FILE -> NEW -> FLEX PROJECT
Le damos un nombre al proyecto, una vez que llenamos los campos le damos a siguiente “NEXT”. Creamos una carpeta en “C:\wamp\www” la cual llamaremos PRUEBAS y nos quedara la siguiente dirección “C:\wamp\www\Pruebas”. y le decimo a eclipse que compile todo a esta carpeta.
Bueno ya toda la configuración esta, ahora, manos a la obra.
Vamos a crear un texto de entrada donde podremos escribir el mensaje que queramos, crearemos un Botón el cual se encargara de enviar la información que queramos a PHP y luego crearemos un texto de Salida el cual se encargara de leer lo que PHP nos allá mandado.
Una ves escrito el código esto no es todo lo que necesitamos, FLEX BUILDER no sabes nada de que existe AMFPHP entonces de algún modo se lo tenemos que decir mediante un archivo de configuración de SERVICIOS que es el que dice mira para comunicar PHP con FLEX usaremos AMFPHP.
Este archivo lo llamaremos SERVICES-CONFIG.XML y lo llenaremos con el siguiente código:
Una ves que tengamos esta configuración puesta en muestra carpeta SRC vamos a tener que decirle al compilador que ese archivo esta hay de el siguiente modo, hacemos Click derecho en nuestro proyecto luego vamos a “PROPIEDADES” y en FLEX COMPILER en el espacio que dice ADDITIONAL COMPILER ARGUMENTS agregamos, no borramos nada solo agregamos un espacio y colocamos -services "services-config.xml"
Una ves hecho esto Estamos listo para Probar nuestro programa y comunicarnos con HelloWorld.php mediante WEB SERVICES.
Antes de terminar este tutorial, quiero hacer unas acotaciones MUY IMPORTANTES y se las presentare \en las siguientes imágenes.
Una acotación para esta imagen es Supongamos que tenemos una carpeta dentro de services llamada MyServices y nos queda C:\wamp\www\amfphp\services\MyServices y tenemos nuestro HelloWord.php dentro de esa carpeta en nuestro código justo donde dice SOURCE=”HelloWorld” colocaremos SOURCE=”MyServices.HelloWorld” para poder hacer referencia al mismo nada de MyServices/HelloWorld ni nada parecido.
En cuanto a los métodos podemos tener tantos métodos como dentro del HelloWold.php hallan.
En otras palabras, se colocarían en tantos tag de Method como funciones tengamos dentro de HelloWorld.php.
Y por ultimo
Esta imagen sale acotación para prevenir que si ustedes tienen AMFPHP EN OTRO LUGAR que no sea C:\wamp\www\amfphp entonces nuestro SERVICES-CONFIG.XML no nos va a servir por lo que el proyecto no va a funcionar tampoco.
Aquí les dejo todos los archivos y el ejemplo corriendo