Tra i vari metodi per passare dati a Flash ve n'è uno particolarmente utile nel caso in cui si debbano utilizzare dei valori per stabilire il comportamento del filmato SWF. Si tratta delle FlashVars, variabili che vengono inserite nel tag <object>
e che il flash player è in grado di leggere e trasmettere al filmato Flash che ne ha accesso sin dal primo fotogramma.
Poichè sono disponibili immediatamente si rivelano utili in quei progetti dove il contenuto del filmato può variare, per esempio pensiamo a un progetto multi-lingua: possiamo passare tramite FlashVars l'id del linguaggio scelto e fare in modo che il filmato mostri i testi a esso relativi.
Il modo in cui si leggono le FlashVar in Flash 9 è diverso da quello usato fino a Flash 8, mentre il metodo per scriverle rimane invariato.
Scrivere le FlashVar
Per prima cosa analizziamo come scrivere una o più variabili. Come detto FlashVars è un parametro da utilizzare nel tag html <object>
, per esempio in un tag esportato da un progetto di Flash 8 abbiamo un codice di questo tipo:
Listato 1. Esempio di codice per inserire SWF con FlashVar
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550"
height="400" id="Filmato" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="Filmato.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<param name="FlashVars" value="variabile1=valore&variabile2=valore&variabile3=valore3" />
</object>
Notiamo come, per passare più di una variabile, sia sufficiente utilizzare il carattere & per dividere le varie coppie nome=valore della variabile.
Questo è il metodo di scrittura delle FlashVars, ma in seguito ai problemi di validazione e al blocco del controllo ActiveX di Internet Explorer sono stati creati diversi metodi "alternativi" per la pubblicazione dell'SWF, generalmente basati su Javascript, che consentono di aggirare il blocco. Il metodo più conosciuto è probabilmente SWFObject, la cui sintassi nella pagina HTML è di questo tipo:
Listato 2. SWFObject per aggirare gli ActiveX di Internet Explorer
<script type="text/javascript" src="swfobject.js"></script>
<div id="flashcontent">
This text is replaced by the Flash movie.
</div>
<script type="text/javascript">
var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
so.write("flashcontent");
</script>
Fortunatamente SWFObject mette già a disposizione un metodo per aggiungere delle FlashVars al codice, senza che sia necessario andare a modificare manualmente il file Javascript. E' sufficiente scrivere so.addVariable("nome","valore")
per aggiungere una coppia nome-valore alle FlashVars; il codice per ottenere lo stesso risultato del tag <object> visto precedentemente risulta quindi così:
Listato 3. SWFObject con FlashVars
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
so.addVariable("variabile1", "valore1");
so.addVariable("variabile2", "valore2");
so.addVariable("variabile3", "valore3");
so.write("flashcontent");
</script>
Un altro metodo, offerto direttamente dalla Adobe, è l'Active Content Update, un'estensione per Flash che permette di sfruttare anch'essa un javascript per bypassare il blocco ActiveX di Internet Explorer. Il codice di una pagina html pubblicata con tale metodo è di questo tipo:
Listato 4. Active Content Update
<script src="AC_RunActiveContent.js" language="javascript"> </script>
<script language="javascript">
if (AC_FL_RunContent == 0) {
alert("This page requires AC_RunActiveContent.js. In Flash, run "Apply Active Content Update" in the Commands menu to copy
AC_RunActiveContent.js to the HTML output folder.");
} else {
AC_FL_RunContent(
'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0',
'width', '550',
'height', '400',
'src', 'ActiveContent',
'quality', 'high',
'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
'align', 'middle',
'play', 'true',
'loop', 'true',
'scale', 'showall',
'wmode', 'window',
'devicefont', 'false',
'id', 'ActiveContent',
'bgcolor', '#ffffff',
'name', 'ActiveContent',
'menu', 'true',
'allowScriptAccess','sameDomain',
'movie', 'ActiveContent',
'salign', ''
); //end AC code
}
</script>
Inserire una o più variabili è semplice, basta aggiungere in un punto a piacere tra i vari parametri il codice:
'FlashVars','variabile=valore&variabile2=valore2&variabile3=valore3',
FlashVars da linguaggi Server-side
Ovviamente le FlashVars possono essere scritte anche utilizzando linguaggi server-side in modo da rendere dinamico il valore, anzi è proprio questo il caso in cui tornano più utili.
L'importante è che il risultato finale a livello di output sia quello evidenziato negli esempi, ma il metodo di scrittura e la fonte di dati da cui vengono prese le variabili è indifferente.
Questi metodi di scrittura delle FlashVars possono essere utilizzati sia con Flash 9 che con le versioni precedenti; cambia invece il metodo di lettura.
Leggere le FlashVars
Come abbiamo detto le FlashVars sono disponibili fin da subito nel filmato, per cui già nel primo fotogramma possiamo farne uso.
Fino a Flash 8 non c'è un comando specifico che serva per recuperare i valori delle variabili dichiarate tramite FlashVars. Per esempio il codice:
prova.text = variabile
Mostrerà nel campo di testo con nome istanza "prova" il valore associato alla FlashVar "variabile", dichiarata nella pagina HTML.
Non è necessaria quindi nessuna dichiarazione o nessun comando per "recuperare" la variabile dalla pagina, ma queste vengono caricate direttamente nella timeline principale dell'SWF.
FlashVars in Flash 9
Con Flash 9 le cose cambiano leggermente, le FlashVars non sono caricate nella _root
, ma all'interno di un oggetto loaderInfo
, più precisamente nella proprietà parameters
. E' quindi consigliabile recuperare i valori in questo modo:
variabile = LoaderInfo(this.root.loaderInfo).parameters.variabile;
variabile2 = LoaderInfo(this.root.loaderInfo).parameters.variabile2;
Possiamo usare un codice del tipo:
prova.text = LoaderInfo(this.root.loaderInfo).parameters.variabile
ma è decisamente consigliabile associare il valore a una variabile presente nel progetto in modo da avere un riferimento più immediato.
Si tratta di un cambiamento semplice, ma non molto documentato al momento in cui scriviamo e che quindi poteva portare qualche problema a chi si cimentasse in qualche prova con la Flash 9 Public Alpha supponendo che il metodo di recupero delle FlashVars fosse rimasto invariato.
FlashVars in Flex 2
Anche Flex 2 può sfruttare le FlashVars, ma la sintassi per recuperarle differisce sia da quella di Flash 8 che da quella di Flash 9. Il comando da utilizzare è:
variabile = Application.application.parameters.variabile;
Tutte le FlashVars vengono memorizzate nella proprietà "parameters
", Flex non possiede una proprietà this.root
, quindi l'oggetto a cui bisogna fare riferimento è Application.application
(e non LoaderInfo(this.root.loaderInfo)
come invece accade per Flash 9).