Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Forum in Flash utilizzando ASP, PHP e XML

Come costruire un forum in Flash per il nostro sito utilizzando ASP, PHP e XML
Come costruire un forum in Flash per il nostro sito utilizzando ASP, PHP e XML
Link copiato negli appunti

Premessa

In questo tutorial passeremo alla realizzazione di un Forum in Flash utilizzando script ASP, PHP e dei file di testo XML.

Prima di tutto facciamo un piccolo approfondimento sull'interazione tra Flash e ASP o altro linguaggio di scripting come ad esempio il PHP. Soffermiamoci maggiormente sul fatto di dover caricare delle variabili sul nostro filmato flash dall'esterno, viste le numerose richieste che ho ricevuto su questo argomento.

Questo è utile per capire come funziona l'XML e come flash riesca a comunicare tramite gli altri ambienti di sviluppo utilizzando questo standard di comunicazione.

Analizziamo i seguenti casi:

Variabili lette da un file di testo

In questo caso all'interno del file di testo ci saranno le nostre variabili dichiarate in questo modo:

_root.variabile1=Prova&_root.myClip.variabile2=Seconda Prova;

Supponendo che il nostro file si chiami varibili.txt all'interno del filmato Flash ci sarà una chiamata tramite l'azione:

loadVariablesNum ("variabili.txt", 0);

Possiamo già intuire che all'interno del filmato c'è una variabile sulla linea temporale principale che si chiama variabile1 e un'altra variabile all'interno del clip filmato myClip, che si trova sempre sulla linea temporale principale, che si chiama variabile2.

Dopo aver eseguito il caricamento (loadVariablesNum), variabile1 sarà uguale a "Prova" e myClip.variabile2 sarà uguale a "Seconda Prova".

Varibili impostate tramite script ASP

In questo caso all'interno del filmato ci sarà una chiamata di questo tipo:

loadVariablesNum ("variabili.asp", 0);

e all'interno dello script ASP ci avremo la seguente istruzione:

Response.Write("_root.variabile1=Prova&_root.myClip.variabile2=Seconda Prova")

Il risultato finale è lo stesso dell'esempio precedente.

Variabili lette da un file XML

Come possiamo notare dagli esempio precedenti c'è sempre una corrispondenza tra nome variabile esterna e nome variabile all'interno del filmato Flash. Questo metodo però appare subito poco dinamico e poco flessibile. Supponiamo di dover caricare una quantità di dati più complessi e articolati come ad esempio i dati relativi alle discussioni di un forum.

Il metodo sopra utilizzato si rivela subito obsoleto e inefficiente. Attraverso l'XML abbiamo la possibilità di formattare le nostre informazioni come vogliamo e creare all'interno di Flash delle funzioni che prendo dai dati XML caricati i valori da attribuire alle varibili che ci interessano. Facciamo subito un esempio:

<nome>Enrico Lai</nome>
<titolo>Flash e ASP</titolo>
<msg>Lo sapevate che bla bla bla</msg>
<data>20 Aprile 2002</data> 

Formattando i dati in questo modo, l'informazione del tipo di variabile che si sta prendendo viene specificata dal tag che racchiude la variabile stessa. All'interno di Flash creeremo quindi una funzione per eseguire il parsing dell'XML, ovvero leggere le informazioni presenti all'interno dei TAG e utilizzarle per valorizzare le variabili del nostro filmato.

Struttura del Forum e Funzionamento

Passiamo alla realizzazione grafica della struttura del nostro Forum. Decidiamo subito che il nostro Forum sarà un po' diverso dai soliti forum, visto che stiamo usando Flash e abbiamo la possibilità di creare delle interazioni grafiche di forte impatto visivo.

Il nostro Forum avrà una schermata principale, ovvero la pagina di accesso al forum, dove ci sarà un'area con tutte le discussioni aperte presenti sul nostro forum, rappresentate graficamente da una cartellina e un piccolo form dove il visitatore può aprire una nuova discussione.

Faremo in modo che l'utente, passando il mouse sulle cartelline, possa visualizzare per ciascuna di esse il titolo della discussione, la data di apertura ed il nome dell'utente che la ha aperta.

Ora quando l'utente clicca su una cartella dobbiamo fare in modo che questo entri in una seconda pagina con un'altra interfaccia Flash dove ci saranno tutte le risposte lasciate dagli untenti del forum relative a quella specifica discussione. Quindi ci saranno i messaggi degli utenti i quali avranno lasciato il loro nome, il titolo della loro risposta, la data e il messaggio vero e proprio. Anche in questa seconda interfaccia ci sarà un form, che permetterà all'untente di partecipare alla discussione in questione.

Poiché abbiamo deciso di lavorare con i file di testo dobbiamo organizzare i nostri dati in modo da poterli recuperare in modo semplice, veloce e soprattutto senza creare confusione. Con un data base i dati vengono organizzati e indicizzati secondo una struttura ben definita e risulta più facile eseguire delle ricerche su di essi. Con i file di testo invece no. Effettuare un ricerca su un file di testo significa in ogni caso aprire e caricare tutti i dati presenti nel file. Quest'operazione diventa dispendiosa quando i dati memorizzati all'interno del file hanno una dimensione considerevole.

Ad ogni modo le operazioni di lettura/scrittura dei dati sui file di testo sono molto più veloci rispetto a quelle su Data Base, a meno chè non si abbia a che fare con una quantità di dati elevata. Non è comunque questo il nostro caso specifico, vista la natura sperimentale del nostro progetto.

Abbiamo quindi subito individuato i seguenti punti:

  • Ci saranno due interfacce Flash che chiamiamo una forum e l'altra discussione, per capire che la prima è l'interfaccia generale e la seconda è l'interfaccia che mostra i messaggi relativi ad una discussione specifica che l'utente ha selezionato
  • L'utente quando apre o partecipa ad una discussione deve sempre inserire il suo nome, il titolo,il messaggio e la data (che effettivamente verrà inserita in modo automatico dallo script ASP)
  • Avremmo un file di testo XML, chiamato titoli, dove inseriremo solo le informazioni relative all'interfaccia generale del forum (ovvero titolo, nome e data) e tanti file di testo che verranno creati dallo script ASP uno per ogni discussione aperta, dove ci saranno i dati relativi appunto alla discussione in questione
  • Due script ASP: uno per aprire una discussione sul forum, l'altro per partecipare all'interno di una discussione
  • Una pagina PHP che ci permetterà di accedere all'interfaccia flash “discussione” con tutti i messaggi relativi alla discussione selezionata
  • Un file di testo chiamato counter dove memorizziamo il numero delle discussioni aperte sul nostro forum

Funzionamento (apertura nuova discussione)

Procediamo ora con la descrizione del funzionamento del nostro forum facendo subito degli esempi. Partiamo con la situazione iniziale ovvero quella in cui ci troviamo appena abbiamo installato tutti i file relativi al forum sul nostro spazio web. Apriamo la pagina forum.html che ha al suo interno il seguente codice:

<html>
<head>
<title>Flash Forum v.01</title>
</head>

<body style="background-color:#FF99CC; margin:0;">

<p>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
        codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
          />
<param name="movie" value="forum.swf" />
<param name="menu" value="false" />
<param name="quality" value="high" />
<param name="bgcolor" value="#FF99CC" />
</object>
</p>
</body>
</html>

La pagina HTML richiama il filmato flash forum.swf. Il filmato SWF carica il file XML titoli.xml che però è vuoto in quanto non ci sono ancora discussioni aperte. Procediamo quindi con l'aprire una nuova discussione sul forum. Sul form presente sulla destra dell'interfaccia flash inseriamo quindi il nostro nome, il titolo della discussione ed il messaggio e clicchiamo sul pulsante invia. Il pulsante invia ha associato il seguente codice Actionscript di controllo:

on (release)
{
  if (newname.length != 0 & themsg.length != 0 & title.length != 0 & newname != undefined & themsg != undefined & title != undefined)
  {
    Verifica();
    if (trovato == "si") { 
      att = "I CARATTERI < E > NON SONO AMMESSI";
    } else {
      att = "connessione...";
      loadVariablesNum ("newdisc.asp", 0, "POST");
      _root.controlla = "vai";
    }
  } 
  else 
  {
    att = "COMPILA I CAMPI";
  }
  
  function Verifica () 
  {
    trovato = "no";

    stringa = newname;
    for (i=0; i<stringa.length; i++) 
    {
      if (stringa.substring(i, i+1) == ">" | stringa.substring(i, i+1) == "<") 
      {
        trovato = "si";
        return;
      }
    }
    
    stringa = title;
    for (i=0; i<stringa.length; i++) 
    {
      if (stringa.substring(i, i+1) == ">" | stringa.substring(i, i+1) == "<") 
      {
        trovato = "si";
        return;
      }
    }
    
    stringa = themsg;
    for (i=0; i<stringa.length; i++) 
    {
      if (stringa.substring(i, i+1) == ">" | stringa.substring(i, i+1) == "<") 
      {
        trovato = "si";
        return;
      }
    }
  }
}

Come possiamo intuire dal codice sopra abbiamo verificato che l'utente abbia effettivamente inserito dei dati sulle caselle di testo di input newname, themsg e title che poi sono le variabili che inviamo al nostro script ASP (tramite l'azione loadVariablesNum ("newdisc.asp", 0, "POST");) per l'inserimento della nuova discussione. Verifichiamo anche che l'utente non abbia inserito i caratteri '<' e '>' poiché questi caratteri non sono ammessi in quanto creano problemi all'interno della struttura del file XML.

I dati sono stati inviati allo script ASP newdisc.asp. Vediamo il codice di questo file e capiamo cosa fa questo script:

<%
Dim strLinea, FileObject, Instream, totDiscussioni, intTipo, OutStream

newname = Trim(Request("newname"))
title = Trim(Request("title"))
themsg = Trim(Request("themsg"))
dataflash = FormatDateTime( Now(),1)
strFile = Server.MapPath("counter.txt")

' crea l'oggetto
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")

' apre il file
intTipo = 1 ' lettura
Set InStream = FileObject.OpenTextFile(strFile, intTipo, true)

' ciclo che legge tutte le linee
totDiscussioni = InStream.ReadLine()
totDiscussioni = Cint(totDiscussioni) + 1

' libera risorse
InStream.Close
Set InStream = Nothing

intTipo = 2 ' scrittura
Set OutStream = FileObject.OpenTextFile(strFile, intTipo, true)
OutStream.WriteLine (totDiscussioni)

' Crea il file in base al numero letto
nomeFile = totDiscussioni&".txt"
strFile = Server.MapPath(nomeFile)
Set OutStream = FileObject.CreateTextFile(strFile, true)

' Inserisce i dati 
OutStream.Write("<nome>"&newname&"</nome><titolo>"&title&"</titolo><msg>"&themsg&"</msg><data>"&dataflash&"</data>")

'Apre titoli.xml per metterci il titolo della nuova discussione
strFile = Server.MapPath("titoli.xml")
intTipo = 8
Set OutStream = FileObject.OpenTextFile(strFile, intTipo, true)
OutStream.Write("<nome>"&newname&"</nome><titolo>"&title&"</titolo><data>"&dataflash&"</data><file>"&nomeFile&"</file>")

' libera risorse
OutStream.Close
Set OutStream = Nothing
Set FileObject = Nothing

Response.Write("att=ok")
%>

Esaminiamo in dettaglio questo script. Prima di tutto riceve tramite POST le variabili newname, title e themsg dal filmato Flash forum.swf. A questo punto lo script apre in lettura il file di testo counter.txt (che contiene il numero delle discussioni aperte presenti sul nostro forum) e legge il suo contenuto, lo incrementa di uno e lo memorizza sostituendo il vecchio valore. Nel nostro caso specifico, poiché siamo all'inserimento della prima discussione, il numero memorizzato su counter.txt è 0; quindi prenderà 0 aggiungerà 1 e counter.txt avrà quindi ora il nuovo valore, cioè 1.

A questo punto lo script crea un file di testo XML che avrà come nome il numero che c'è su counter.txt, ovvero crea il file 1.txt.

All'interno di questo file lo script ASP memorizza le informazioni presenti nelle varibili passategli da flash, aggiungendo i tag <nome>, <titolo>, <msg> e <data> in modo da formattare i dati in XML.

Ecco che i dati memorizzati all'interno del file 1.txt saranno così organizzati:

<nome>Enrico Lai</nome>
<titolo>Flash e ASP</titolo>
<msg>Lo sapevate che bla bla bla... bla bla bla... e così via il testo del messaggio</msg>
<data>20 Aprile 2002</data>

Allo stesso modo bisogna però anche aggiornare il file titoli.xml inserendo il titolo, il nome, la data e il file di testo a cui è associata la nuova discussione. Lo script ASP apre quindi il file titoli.xml e inserisce i seguenti dati:

<nome>Enrico Lai</nome>
<titolo>Flash e ASP</titolo>
<data>20 Aprile 2002</data>
<file>1.txt</file>  

Codice Action Script nel filmato generale

L'ultima riga dello script newdisc.asp (Response.Write("att=ok")) imposta la variabile att del filmato forum.swf con il valore 'ok'. In altre parole, comunica al nostro filmato flash che lo script ha terminato il proprio lavoro e che quindi tutti i file sono stati aggiornati.

Un Clip filmato all'interno del filmato flash ha il seguente codice:

onClipEvent(enterFrame)
{
  if (_root.controlla == "vai")
  {
    if (_root.att == "ok")
    {
      trace(_root.att);
      _root.loading = "LOADING XML...";
      _root.ApriXml(random(999999));
      _root.controlla = "basta";
      _root.att = "MESSAGGIO INVIATO, GRAZIE! :-)";
      
      // Rimette tutte le variabili in stand by
      _root.newname = undefined;
      _root.themsg = undefined;
      _root.title = undefined;
    }
  }
}

In questo modo può ricaricare le informazioni aggiornate dal file titoli.xml (infatti c'è il richiamo alla funzione sulla root ApriXml). Vediamo il codice Actionscript che ci permette di leggere i dati XML presenti nel file:

controlla = "basta";
filexml = "titoli.xml";
puntatore = 63;

ApriXML();


function ApriXML (r)
{
  mioxml = new XML();
  apparray = new Array();
  
  mioxml.load(filexml + "?ranq=" + random(999999));
  
  //mioxml.load(filexml);
  mioxml.onLoad = Metti; 
  
  function Metti (success)
  {
    if (mioxml.loaded) {
      apparray = mioxml.childNodes;
      Dati();
      MenuPag();
      CreaTabelle();
      _root.loading = undefined;
      delete mioxml;
      delete apparray;
    }
  }
} 

// Funzione che rimuove tutti I Clip delle cartelline
function Rimuovi()
{
  for (a=0; a<63; a++)
    _root["clipmsg"+a].removeMovieClip();
}

// Funzione che crea il menu per scrorrere le varie pagine
function MenuPag()
{
  numero = Math.abs(Nomi.length/63);
  //trace (numero);
  //trace (Url.length);  
  
  for (i=0; i// funzione che crea le Cartelline che corrispondono
// alle discussioni del forum
function CreaTabelle () 
{
  Rimuovi();
  k = 0;
  conteggio = 0;
  inizio=puntatore-63;
  
  //trace(inizio);         
  if( inizio<0) { inizio=0; }
  
  for (i=0; i<63; i++)
  {
    if (Nomi[inizio] != undefined)
    {
      attachMovie("clipmsg", "clipmsg"+i, i);
      _root["clipmsg"+i]._x = 40+conteggio*45;
      _root["clipmsg"+i]._y = 120+k*35;
      _root["clipmsg"+i].data = Data[inizio];
      _root["clipmsg"+i].nome = Nomi[inizio];
      _root["clipmsg"+i].titolo = Titolo[inizio];
      _root["clipmsg"+i].nomefile = nFile[inizio];
      _root["clipmsg"+i].numero = inizio+1;
      
      inizio++;
      conteggio++;
      
      if (conteggio>=7)
      {
        k++;
        conteggio = 0;
      }
    }
  }
}

//Funzione che mette i dati dal file XML in degli Array
//in modo da manipolarli più rapidamente
function Dati ()
{
  Nomi = new Array();
  Titolo = new Array();
  Data = new Array();
  nFile = new Array();
  
  // trace(apparray);
  for (k=0; k<=apparray.length; k++)
  {
    if (apparray[k].nodeName == "nome")
    {
      Nomi.push(apparray[k].childNodes.toString().toUpperCase());
      //trace(apparray[k].childNodes.toString().toUpperCase());
    } else if (apparray[k].nodeName == "titolo"){
      Titolo.push(apparray[k].childNodes.toString());
    } else if (apparray[k].nodeName == "data") {
      Data.push(apparray[k].childNodes.toString().toUpperCase());
    } else if (apparray[k].nodeName == "file") {
      nFile.push(apparray[k].childNodes.toString());
    }
    
    // Capovolge gli array in modo da avere le informazioni in ordine
    // cronologico a partire dalla discussione più recente
  }
  
  Nomi.reverse();
  Titolo.reverse();
  Data.reverse();
  nFile.reverse();
}

Finalmente il nostro filmato visualizzerà una icona a forma di cartellina che è appunto la discussione che abbiamo appena aperto.

I Clip filmato all'interno del filmato generale

Dal codice presente nella parte precedente abbiamo visto che sul nostro filmato generale appaiono diversi MovieClip. In base alle discussioni aperte verranno creati tanti clip cartellina per ogni discussione. Il numero massimo visualizzabile per pagina è 63, quindi nel caso ci sia un numero maggiore di discussioni, creeremo degli altri MovieClip pagina per permettere all'utente di accedere a tutte le discussioni presenti sul forum cambiando pagina.

Come abbiamo detto prima dobbiamo fare in modo che l'utente quando passa il mouse sopra un MovieClip cartellina visualizzi le informazioni relative a quella data discussione. Ecco il codice Actionscript associato ai diversi clip filmato:

Clip filmato cartella

on (rollOver) 
{
  _root.show.gotoAndStop(2);
  _root.show.number = "DISCUSSIONE N. > "+this.numero+" <";
  _root.show.titolo = this.titolo;
  _root.show.nome = this.nome;
  _root.show.data = this.data;
}

on (rollOut)
{
  _root.show.gotoAndStop(1);
}

on (release)
{
  url = "discussione.php?nomefile="+this.nomefile;
  getURL ( url, _self );
}

Clip filmato pag

on (release)
{
  _root.puntatore = valore;
  // trace(valore);	
  _root.CreaTabelle();
  _root.pagina = this.pagina+"/"+ _root.nmaxpag;
}

Clip filmato shower (fotogramma 2)

stop ();
this.startDrag();
_root.show._x = _root._xmouse + 190;
_root.show._y = _root._ymouse - 20;
_root.show.swapDepths(1000);

Accedere ad una discussione

Abbiamo quindi inserito una nuova discussione e sul nostro forum abbiamo una icona cartellina associata ad essa.

Come possiamo notare dal codice AS associato ai clip filmato cartella:

on (release)
{
  url = "discussione.php?nomefile="+this.nomefile;
  getURL ( url, _self );
}

quando clicchiamo sulla cartellina richiamiamo una pagina PHP chiamata discussione.php e passiamo a questa pagina la variabile nomefile che altro non è che il nome del file di testo associato a quella discussione. Vediamo il codice della pagina discussione.php:

<?
head();
oggettoflash();
footer();

function oggettoflash()
{
  global $nomefile;
  print "<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=780 HEIGHT=500>
<PARAM NAME=movie VALUE="discussione.swf?filexml=".$nomefile."">
<PARAM NAME=menu VALUE=false> <PARAM NAME=quality VALUE=high>
<EMBED src="discussione.swf?filexml=".$nomefile."" menu=false quality=high WIDTH=780 HEIGHT=500 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
</OBJECT>";
}

function head() {
?>


<?
}

function footer() {
?>



<?
}
?>

La pagina PHP apre il filmato discussione.swf, passandogli il nome del file di testo XML che deve aprire. Nel nostro caso gli verrà passato il valore 1.txt ovvero il file di testo associato alla discussione n°1 che abbiamo creato.

Il filmato discussione.swf

Andiamo a vedere il filmato discussione.swf che è stato aperto dalla pagina discussione.php. Il codice presente all’interno di questo filmato flash è il seguente (è molto simile al precedente anche nei nomi delle funzioni. Quando si lavora con l’xml è molto facile scrivere degli script riutilizzabili che permettono un risparmio di tempo di sviluppo notevole):

Codice Actionscript

controlla = "basta";
puntatore = 4;

ApriXML();

function ApriXML(r)
{
  mioxml = new XML();
  apparray = new Array();
  mioxml.load(filexml + "?ranq=" + random(999999));
  //mioxml.load(filexml);
  mioxml.onLoad = Metti;
  
  function Metti (success)
  {
    if (mioxml.loaded)
    {
      apparray = mioxml.childNodes;
      Dati();
      MenuPag();
      CreaTabelle();
      _root.loading = undefined;
      delete mioxml;
      delete apparray;
    }
  }
}

function Rimuovi()
{
  for (a=0; a<4; a++)
    _root["clipmsg"+a].removeMovieClip();
}

function MenuPag()
{
  numero = Math.abs(Nomi.length/4);
  conteggio=0;
  j=0;
  //trace (numero);
  //trace (Url.length);
  for (i=0; i<numero; i++)
  {
    attachMovie("page", "pagine"+i,i+100);
    _root["pagine"+i]._x=30+conteggio*35;
    _root["pagine"+i]._y=65+j*15;

    k = i + 1;
    if (k<=9) { app="0"+k; } else { app=k; }

    _root["pagine"+i].pagina=app;
    _root["pagine"+i].valore= k*4;
    //trace(k*4-1);
    if (k<=9){ nmaxpag ="0"+ k; } else { nmaxpag=k; }
    _root.pagina = "01/"+nmaxpag;
    conteggio++;
    if (conteggio>=21)
    {
      j++;
      conteggio = 0;
    }
  }
}

function CreaTabelle()
{
  Rimuovi();
  k = 0;
  conteggio = 0;
  inizio=puntatore-4;
  //trace(inizio);
  
  if(inizio < 0) { inizio=0; }
  
  totn = Nomi.length-1;
  _root.iniziatada = Nomi[totn] + " - in data - "+ Data[totn];
  _root.titolodisc = Titolo[totn];
  
  for (i=0; i<4; i++)
  {
    if (Nomi[inizio] != undefined)
    {
      attachMovie("clipmsg", "clipmsg"+i, i);
      _root["clipmsg"+i]._x = 170+conteggio*380;
      _root["clipmsg"+i]._y = 180+k*175;
      _root["clipmsg"+i].data = Data[inizio];
      _root["clipmsg"+i].nome = Nomi[inizio];
      _root["clipmsg"+i].titolo = Titolo[inizio];
      _root["clipmsg"+i].msg = Msg[inizio];
      _root["clipmsg"+i].numero = inizio+1;
      inizio++;
      conteggio++;
      if (conteggio >= 2)
      {
        k++;
        conteggio = 0;
      }
    }
  }
}

function Dati () 
{
  Nomi = new Array();
  Titolo = new Array();
  Data = new Array();
  Msg = new Array();
  
  // trace(apparray);
  
  for (k=0; k<=apparray.length; k++)
  {
    if (apparray[k].nodeName == "nome")
    {
      Nomi.push(apparray[k].childNodes.toString().toUpperCase());
      //trace(apparray[k].childNodes.toString().toUpperCase());
    } else if (apparray[k].nodeName == "titolo") {
      Titolo.push(apparray[k].childNodes.toString());
    } else if (apparray[k].nodeName == "data") {
      Data.push(apparray[k].childNodes.toString().toUpperCase());
    } else if (apparray[k].nodeName == "msg") {
      Msg.push(apparray[k].childNodes.toString().toUpperCase());
    }
  }
  
  Nomi.reverse();
  Titolo.reverse();
  Data.reverse();
  Msg.reverse();
}

Il filmato carica quindi i dati dal file di testo XML specificato (in questo caso è 1.txt) e li visualizza con delle tabelle con un massimo di 4 messaggi per pagina. In ciascuna tabella c’è indicato il nome, il titolo, la data e il messaggio inserito dall’utente. Allo stesso modo del filmato generale creeremo dei pulsanti per poter visualizzare tutti i messaggi relativi alla discussione.

Partecipare ad una discussione

All'interno del filmato discussione.swf sul secondo fotogramma abbiamo il solito form per permettere all'utente di partecipare alla discussione. L'utente inserirà il suo nome, il titolo e il suo messaggio e cliccherà sul tasto invia. Il tasto invia contiene lo stesso codice Action Script che abbiamo usato nel filmato forum.swf:

on (release)
{
  if (newname.length != 0 & themsg.length != 0 & title.length != 0 & newname != undefined & themsg != undefined & title != undefined) 
  {
    Verifica();
    if (trovato == "si") {
      att = "I CARATTERI < E > NON SONO AMMESSI";
    } else {
      att = "connessione...";
      loadVariablesNum ("resp.asp", 0, "POST");
      _root.controlla = "vai";
    }
  } else {
    att = "COMPILA I CAMPI";
  }
  
  function Verifica ()
  {
    trovato = "no";
    stringa = newname;
    
    for (i=0; i<stringa.length; i++)
    {
      if (stringa.substring(i, i+1) == ">" | stringa.substring(i, i+1) == "<")
      {
        trovato = "si";
        return;
      }
    }
    
    stringa = title;
    for (i=0; i<stringa.length; i++)
    {
      if (stringa.substring(i, i+1) == ">" | stringa.substring(i, i+1) == "<")
      {
        trovato = "si";
        return;
      }
    }
    
    stringa = themsg;
    
    for (i=0; i<stringa.length; i++)
    {
      if (stringa.substring(i, i+1) == ">" | stringa.substring(i, i+1) == "<")
      {
        trovato = "si";
        return;
      }
    }
  }
}

come possiamo notare il pulsante invia richiama lo script resp.asp, passandogli le variabili relative al nome, titolo e messaggio inserite dall'utente nei campi di testo di input. Inoltre sarà passata allo script anche la variabile filexml che altro non è che il nome del file di testo XML che il filmato discussione.swf ha aperto. Questo dato indicherà allo script ASP il file da aprire per aggiungere la nostra risposta di partecipazione alla discussione.

Lo script ASP avrà quindi il seguente codice:

<%
Dim strLinea, FileObject, Instream, intVisite, intTipo, OutStream
newname = Trim(Request("newname"))
title = Trim(Request("title"))
themsg = Trim(Request("themsg"))
dataflash = FormatDateTime( Now(),1)
filexml = Request("filexml")
strFile = Server.MapPath(filexml)

' crea l'oggetto
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")

' apre il file
intTipo = 8
Set OutStream = FileObject.OpenTextFile(strFile, intTipo, true)

' Inserisce i dati
OutStream.Write("<nome>"&newname&"</nome><titolo>"&title&"</titolo><msg>"&themsg&"</msg><data>"&dataflash&"</data>")

' libera risorse
OutStream.Close
Set OutStream = Nothing
Set FileObject = Nothing
Response.Write("att=ok")
%>

Questo script è molto simile allo script utilizzato per aprire una nuova discussione, anzi è molto più semplice. Riceve le variabili dal filmato discussione.swf, apre il file indicato dalla variabile filexml (nel nostro caso 1.txt) e aggiunge i dati inseriti dall'utente inserendoli tra i soliti tag <nome>, <titolo>, <msg> e <data> per avere la formattazione XML.

Anche in questo caso lo script ASP attraverso l'istruzione Response.Write("att=ok") comunica al nostro filmato Flash che i dati sono stati inseriti correttamente. Sul fotogramma 2 del filmato discussione.swf abbiamo un clip filmato al quale abbiamo associato il seguente codice Actionscript:

onClipEvent (load)
{
  _root.att = "PARTECIPA ALLA DISCUSSIONE! :-)";
}

onClipEvent (enterFrame)
{
  if (_root.controlla == "vai")
  {
    if (_root.att == "ok")
    {
      trace (_root.att);
      _root.loading = "LOADING XML...";
      _root.ApriXml(random(999999));
      _root.controlla = "basta";
      _root.att = "MESSAGGIO INVIATO, GRAZIE! :-)";
      
      // Rimette tutte le variabili in stand by
      _root.newname = undefined;
      _root.themsg = undefined;
      _root.title = undefined;
      _root.gotoAndStop(1);
    }
  }
}

Questo MovieClip controlla la variabile att e quando questa è uguale al valore "ok" ci riporta sul fotogramma 1, effettua il refresh del file XML e ci mostra tutti i messaggi relativi alla discussione tra i quali quello che abbiamo appena inserito. Le stesse operazioni verranno ora eseguite per l'inserimento delle nuove discussioni.

Conclusioni e considerazioni

Il forum in Flash che abbiamo realizzato è sicuramente molto veloce e semplice da utilizzare. Il fatto di creare un file di testo per ogni discussione aperta ci permette di non appesantire i file e di tenerli separati e ordinati. L'unico file che tenderà ad appesantirsi di più rispetto agli altri col passare del tempo è il file titoli.xml.

Quando Flash apre un file di testo XML per caricarne il suo contenuto questo viene caricato e messo su degli array. Quando sul forum ci saranno aperte 500 discussioni il nostro file di testo sarà un po' pesantuccio e il filmato Flash ne risentirà perché sarà costretto a caricare ogni volta tutto il file, anche se effettivamente le discussioni visualizzate in apertura saranno solo le prime 63, senza cosiderare il fatto che l'utente difficilmente sarà interessato a visitare le discussioni aperte 6 mesi prima! La soluzione, che vedremo nei prossimi tutorial, sarà l'utilizzo di un data base.

Nota: Installate tutti i file relativi al forum in una cartella sul vostro server dove siano settati i permessi di scrittura, dopo esservi accertati che sia presente sul server stesso il supporto per le pagine ASP e PHP.

Attenzione: per visualizzare correttamente il contenuto del file FLA siete invitati ad installare sul vostro sistema gli Small Fonts utilizzati in questo progetto che potete scaricare gratuitamente dal seguente sito: http://www.minimil.com (per maggiori informazioni sugli Small Fonts: "Tutto sulle Pixel Font").

Ti consigliamo anche