Eccoci ad un argomento molto interessante, non che gli altri già visti non lo siano ma in questo caso facciamo comunicare Flash CS3 con il server.
Le cose che sono cambiate per inviare/ricevere variabili da scripts lato server non sono poche.
Inizio col dichiarare che la classe AS2 LoadVars è stata rimossa e non si utilizza più con AS3.
Ecco un esempio di come agire con Actionscript 3.0...
Creo un FLA e salvo con nome ' load_vars.fla ' .
Creo la Document Class, un file AS che salvo con nome ' ExLoadVars.as ' , così implementata:
Code:
package
{
import flash.display.MovieClip;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLLoaderDataFormat;
import flash.text.TextField;
import flash.display.SimpleButton;
import flash.events.*;
public class ExLoadVars extends MovieClip
{
public function ExLoadVars()
{
addButtonListener();
}
private function addButtonListener():void
{
board_mc.invia_btn.addEventListener(MouseEvent.MOUSE_DOWN,inviaDati);
}
private function addListeners(d:IEventDispatcher):void
{
d.addEventListener(Event.OPEN,inizio);
d.addEventListener(ProgressEvent.PROGRESS,inProgresso);
d.addEventListener(Event.COMPLETE,completato);
d.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);
d.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatus);
d.addEventListener(IOErrorEvent.IO_ERROR,ioError);
}
private function inizio(e:Event):void
{
debug_txt.appendText('script chiamato: duplicanumero.php\n');
debug_txt.appendText('inizio: \n');
}
private function inProgresso(e:ProgressEvent):void
{
debug_txt.appendText('percentuale caricata: '+e.bytesLoaded+' totale: '+e.bytesTotal+'\n');
}
private function completato(e:Event):void
{
var loader:URLLoader=URLLoader(e.target);
debug_txt.appendText('completato: '+loader.data+'\n');
var vars:URLVariables=new URLVariables(loader.data);
board_mc.answer_txt.text=(vars.answer).toString();
debug_txt.appendText('La risposta è '+vars.answer+'\n');
}
private function securityError(e:SecurityErrorEvent):void
{
debug_txt.appendText('errore sicurezza: '+e+'\n');
}
private function httpStatus(e:HTTPStatusEvent):void
{
//debug_txt.appendText('errore HTTP: '+e+'\n');
}
private function ioError(e:IOErrorEvent):void
{
debug_txt.appendText('Errore in invio/caricamento: '+e+'\n');
}
private function inviaDati(m:MouseEvent):void
{
debug_txt.text='';
var NumeroInserito:Number=Number(board_mc.insert_txt.text);
var variables:URLVariables=new URLVariables('numero='+NumeroInserito);
var richiesta:URLRequest=new URLRequest();
richiesta.url='http://www.flepstudio.org/swf/duplicanumero.php';
richiesta.method=URLRequestMethod.POST;
richiesta.data=variables;
var loader:URLLoader=new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
addListeners(loader);
try
{
loader.load(richiesta);
}
catch (error:Error)
{
trace('Unable to load richiestaed document.');
}
}
}
}
Fai una prova con il mio esempio:
Lo script PHP chiamato (duplicanumero.php) è molto semplice:
PHP Code:
<?php
$num=$_POST['numero'];
$answer=$num*2;
echo ('answer='.$answer);
?>
Analizziamo Actionscript:
Le tre funzioni ( metodi ) che interessa soffermarmi sono inviaDati(), addListeners() e completato() .
Invia dati
con AS2 eravamo abituati ad istanziare la classe LoadVars, associare delle proprietà all' istanza e inviare via POST o GET l' istanza di LoadVars.
Come detto in apertura dell' articolo, la classe LoadVars è stata rimossa per cui adesso bisogna fare in questo modo ( molto più corretto e logico di AS2 in quanto fa capire veramente cosa avviene):
creo una variabile contenuto il valore che voglio inviare allo script PHP
var NumeroInserito:Number=Number(board_mc.insert_txt.t ext);
istanzio la classe URLVariables e gli paso la variabile che contiene il valore da inviare
var variables:URLVariables=new URLVariables('numero='+NumeroInserito);
istanzio la classe URLRequest che ' prepara ' Flash dicendogli che deve inviare dei dati via http
var richiesta:URLRequest=new URLRequest();
definisco l' url della richiesta
richiesta.url='http://www.flepstudio.org/swf/duplicanumero.php';
definisco il metodo invio dati (POST in questo caso)
richiesta.method=URLRequestMethod.POST;
alla proprietà .data della variabile richiesta assegno il valore da inviare che è contenuto vella variabile ' variables '
richiesta.data=variables;
istanzio la classe URLLoader
var loader:URLLoader=new URLLoader();
dico a loader di formattare la stringa invio dei dati ( per intenderci come fosse ?numero=...)
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
aggiungo i listeners necessari
addListeners(loader);
e chiamo lo script PHP
try
{
loader.load(richiesta);
}
catch (error:Error)
{
trace('impossibile caricare la richiesta');
}
addListeners
in questo metodo della classe ExLoadVars niente di nuovo, aggiungo i lisneters per ogni evento che voglio dispacciare in modo da poter monitorare la chiamata allo script PHP.
completato
questo metodo viene eseguito al momento in cui Flash ha finito di inviare/ricevere i dati in quanto un listener è in ascolto ( addListeners ), come tratto i dati restituiti dal PHP ? Così:
istanzio la classe URLLoader passandogli come parametro la proprietà .target dell'evento
var loader:URLLoader=URLLoader(e.target);
istanzio la classe URLVariables passandogli come parametro la proprietà .data di loader
var vars:URLVariables=new URLVariables(loader.data);
assegno al mio campo di testo il valore ricevuto dallo script PHP, assegnando una proprietà a vars che ha nome identico alla variabile che il PHP mi restituisce
board_mc.answer_txt.text=(vars.answer).toString();
Fico no ? ;)
Allego i files sorgente: