codice:
// includo le azioni dove è definita la classe Serializer (sephiroth.it) che serializza oggetti o array di oggetti da passare al server
// e li unserializza in ricezione ricreando gli stessi oggetti che ho creato sul server
#include "serializerClass.as"
/* =========================================
Uso
myServerConnection = new ServerConnection ( paginaServer, LoadVarsConnection[, metodo [, oggettoParametri [, targetHtml]]]);
metodi pubblici
myServerConnection.serverConnect([ linkage/istanza_ClipTarget [, pathClipTarget [, startX [, startY [, startdepth [, interval [, xOffset [, yOffset [, option1...optionN]]]]]]]]]);
proprietà
myServerConnection.objectCreated --> settato a true quando la duplicazione/assegnazione dei dati è terminata
myServerConnection.arrayObjects --> un array che contiene i riferimenti a tutti i clip creati, o cmq i clip dove risiedono i risultati della comunicazione
=========================================*/
// costruttore della classe
_global.ServerConnection = function() {
this.objectCreated = false;
this.arrayObjects = new Array();
this.serverPage = arguments[0];
this.connection = arguments[1];
if (arguments[2] != "") {
this.method = arguments[2];
}
this.loadVarsObject = new LoadVars();
// se esiste il parametro oggettoParametri
if (arguments[3]) {
// lo serializzo (SerializerClass da sephiroth.it) per passarlo al server dove a sua volta sarà unserializzato
this.loadVarsObject.params = new Serializer().serialize(arguments[3]);
unescape(this.loadVarsObject.params);
}
if (arguments[4] != "") {
this.targetHtml = arguments[4];
}
};
// metodo privato che istanzia i clip associando loro l'oggetto restituito dal server
ServerConnection.prototype.createObjects = function(targetClip, path, arrayArgs) {
// ciclo l'array di oggetti (recordset) che restituisce il server
for (var a = 0; a<this.loadVarsObject.result.length; a++) {
if (this.loadVarsObject.result[a]) {
// creo sul percorso specificato i clip "contenitore"
path.attachMovie(targetClip, targetClip+a, a+arrayArgs["startDepth"], this.initObject(arrayArgs, a));
// associo l'oggetto corrente al clip creato
path[targetClip+a].LoadedData = this.loadVarsObject.result[a];
// aggiungo il riferimento del clip creato all'array "arrayObjects"
this.arrayObjects.push(path[targetClip+a]);
}
}
// se ho creato almeno un clip setto a true la proprietà objectCreated
if (this.arrayObjects.length>0) {
this.objectCreated = true;
}
};
// metodo che costruisce l'oggetto di inizializzazione per i clip da "attaccare"
ServerConnection.prototype.initObject = function(arrayArgs, a) {
var initObject = {};
initObject._x = arrayArgs["xOffset"]*a+arrayArgs["startX"];
initObject._y = arrayArgs["yOffset"]*a+arrayArgs["startY"];
initObject.interval = arrayArgs["interval"]*a;
//oltre alle proprietà di default posso associare ai clip n opzioni (anche oggetti o riferimenti) che posso utilizzare ad esempio in una funzione di inizializzazione del clip stesso
for (var cont = 8; cont<arrayArgs.length; cont++) {
initObject["option"+(cont-7)] = arrayArgs[cont];
}
return (initObject);
};
ServerConnection.prototype.serverConnect = function() {
// se c'è almeno un argomento ... qui si può migliorare (ma non solo qui)... li associo all'array associativo che passerò al metodo createObjects()
if (arguments[0] != "") {
var arrayArgs = new Array();
var targetClip = arguments[0];
var path = arguments[1];
arrayArgs["startX"] = arguments[2];
arrayArgs["startY"] = arguments[3];
arrayArgs["startDepth"] = arguments[4];
arrayArgs["interval"] = arguments[5];
arrayArgs["xOffset"] = arguments[6];
arrayArgs["yOffset"] = arguments[7];
for (var cont = 8; cont<arguments.length; cont++) {
arrayArgs[cont] = arguments[cont];
}
}
this.loadVarsObject.path = this;
// controllo il tipo di connessione da effettuare per l'oggetto corrente
switch (this.connection) {
case "sendAndLoad" :
this.loadVarsObject.sendAndLoad(this.serverPage, this.loadVarsObject, this.method);
this.loadVarsObject.onLoad = function() {
// associo a result nell'oggetto LoadVars creato l'oggetto serializzato restituito dal server che unserializzo ricavando l'oggetto utilizzabile
this.result = new Serializer().unserialize(this.result);
// controllo il "type" del primo parametro del metodo corrente
switch (typeof (targetClip)) {
// se il parametro è una stringa allora è un linkage di movie clip quindi richiamo il metodo createObjects
case "string" :
this.path.createObjects(targetClip, path, arrayArgs);
break;
// altrimenti il parametro sarà un riferimento ad un'oggetto o clip a cui associo semplicemente l'oggetto restituito dal server
default :
targetClip.result = this.result;
this.objectCreated = true;
}
};
break;
case "send" :
this.loadVarsObject.send(this.serverPage, this.targetHtml, this.method);
break;
case "load" :
//come sopra per sendAndLoad
this.loadVarsObject.load(this.serverPage);
this.loadVarsObject.onLoad = function() {
this.result = new Serializer().unserialize(this.result);
switch (typeof (targetClip)) {
case "string" :
this.path.createObjects(targetClip, path, arrayArgs);
break;
default :
targetClip.result = this.result;
this.objectCreated = true;
}
};
}
};
// =============================================== ESEMPI
// utilizzo il metodo LOAD, non specifico quindi alcun parametro da passare al server e neanche metodo e targetHtml
conduttori = new ServerConnection("serialize_conduttori.txt", "load");
// mi connetto e duplico il clip "mioClip" linkato nella libreria tante volte quanti sono i risultati, il primo starà a 100,100 li
duplico a partire dal livello di profondità 100 a salire, l'offset è di 50 px sull'asse x, assegno un offset di delay tra un clip e
un'altro di 500 ms da utilizzare nelle azioni del clip, associo anche delle opzioni che posso utilizzare ad esempio così
_rotation=option1(45) _visible=option2(true) sempre nelle azioni del clip
conduttori.serverConnect("mioClip", _root, 100, 100, 100, 500, 0, 50, 45, true);
// creo l'oggetto da passare al server
parametri = Array();
parametri["query"] = "select * from party";
// Dovendo comunicare con SENDANDLOAD specifico il metodo di comunicazione e l'oggetto parametri da passare al server
speakers = new ServerConnection("serialize_conduttori.php", "sendAndLoad", "POST", parametri);
// per quanto riguarda i risultati mi comporto come l'oggetto precedente
speakers.serverConnect(_root.mioClip, _root, 200, 40, 50, 500, 0, 50, 45, true);
// creo l'oggetto da passare al server
search= Array();
search["key"]=12;
serach["table"]="speakers"
// Comunico al server l'oggetto search e setto anche il targetHtml a _blank per visualizzare il metodo è send visualizza i risultati in un altro frame (finestra) specifico anche l'oggetto parametri
ricerca = new ServerConnection
("serialize_conduttori.php", "send", "POST", parametri, "_BLANK");
// non dovendo visualizzare i risultati in flash non devo specificare parametri al metodo serverConnect();
ricerca.serverConnect();