Premessa
La cosa più interessante per creare contenuti Flash altamente dinamici è sicuramente l'utilizzo di un Data Base. Interfacciare Flash con un Data Base non è una cosa difficile. Prima di tutto bisogna precisare che Flash non ha la possibilità di collegarsi direttamente ad un DataBase per prenderne i dati memorizzati al suo interno ed elaborarli. Tuttavia possiamo utilizzare Flash con degli script lato server che ci permettono di leggere i dati dal Data Base e quindi elaborarli.
Nei precedenti Tutorial abbiamo visto come Flash possa tranquillamente caricare e salvare dei dati sfruttando la formattazione XML. Memorizzare i dati su un file di testo o su un Data Base è solo una questione di scelte.
Bisogna analizzare i pro e i contro di ciascuna scelta. Sicuramente l'utilizzo di una Data Base è consigliato quando si ha a che fare con una quantità di dati che è destinata a crescere sensibilmente nel tempo. Utilizzare un Data Base per memorizzare un grosso numero di informazioni ci permette di ottimizzare le pagine del nostro sito web e di effettuare ricerche complesse per visualizzare i nostri dati secondo determinati criteri che possiamo stabilire a priori.
Lo scopo comunque di questo Tutorial è quello di vedere il funzionamento di Flash con una Data Base Access utilizzando degli script ASP e la formattazione XML per comunicare i dati al nostro filmato Flash. Per eventuali approfondimenti si invita il lettore a documentarsi ulteriormente sull'utilizzo dei Data Base.
La scelta di utilizzare script ASP e un DataBase Access è dovuta esclusivamente ad un fatto personale legato al server su cui si trova il mio sito (e quindi dove posso testare i miei lavori). Si potrebbe usare tranquillamente un Database MySQL con script PHP ma è una cosa che personalmente non ho mai sperimentato. Non è quindi una scelta dovuta al fatto che una soluzione sia migliore dell'altra, anzi.
Forse il Data Base Access non è stato progettato per lavorare sul web e le sue prestazioni sono sicuramente limitate. Tuttavia risulta essere molto semplice da utilizzare e configurare per cui si adatta benissimo alle nostre esigenze di sperimentare Flash con un Data Base.
Il Progetto e la struttura
Il nostro progetto è quello di creare un Forum in Flash simile a quello creato in precedenza utilizzando però un Data Base anziché files di testo per memorizzare le informazioni relative alle discussioni degli utenti. Avremmo quindi un Data Base con una tabella dove possiamo tranquillamente memorizzare tutti i dati.
Apriamo quindi Microsoft Access e creiamo un Data Base di Access vuoto, lo salviamo su disco e creiamo una tabella che chiamiamo "tabmsg". All'interno della tabella avremmo i seguenti campi:
- ID campo di tipo contatore
- Nome campo di tipo testo
- Titolo campo di tipo testo
- Messaggio campo di tipo memo
- Data campo di tipo data/ora
- IDpadre campo di tipo numerico
Cerchiamo di capire la struttura del nostro Data Base. Il campo ID contiene un numero progressivo che viene inserito e incrementato automaticamente dal Data Base ogni volta che viene aggiunta una riga alla tabella, è quindi una chiave di ricerca che indica in modo univoco ciascuna riga. Il campo Nome e Titolo conterranno il nome dell'utente ed il titolo della discussione aperta, mentre il campo Messaggio conterrà il testo della discussione.
Il campo della Data la data della discussione mentre il campo IDpadre conterrà il numero dell'ID della discussione a cui è legato questo messaggio nel caso esso sia una risposta di partecipazione di una discussione già aperta.
Quindi se vogliamo fare un esempio poniamo il caso che un utente accede al forum e vuole partecipare ad una discussione aperta. Mettiamo il caso che questa discussione abbia l'ID 3. Quando l'utente inserirà il suo messaggio di partecipazione questo verrà memorizzato sul Data Base e nel campo IDpadre ci sarà il valore 3. Questo campo sarà invece uguale a 0 (zero) nel caso la discussione non sia una risposta ad una discussione aperta da qualche altro utente ma sia stata aperta per la prima volta.
Nella nostra tabella del Data Base verranno quindi memorizzate sia i messaggi di apertura discussione sia i messaggi di risposta alle varie discussioni.
Si sarebbero potute creare anche diverse tabelle nel nostro Data Base, ma in questo caso era superfluo. Quando però si ha a che fare con dei dati che hanno un'organizzazione più complessa si possono creare più tabelle nel Data Base in modo da avere una struttura più complessa ma anche più efficace e veloce, riducendo i tempi di accesso e lettura al Data Base.
Scaricando questo tutorial avrete comunque il Data Base già creato e pronto da utilizzare, quindi potete provare a crearne uno da soli seguendo le istruzioni fin qui lette senza paura di sbagliare .
Pensiamo ora al modo di comunicare i dati al nostro filmato Flash. Sostanzialmente il modo non cambia rispetto all'utilizzo dei file di testo. Utilizzando l'XML passeremo al nostro filmato Flash i dati con dei TAG XML che indicheranno appunto il tipo di dato che si sta passando.
Esempio:
<nome>Enrico Lai</nome>
<titolo>Discussione su Flash MX</titolo>
<data>26/05/2002</data>
<msg>Cosa ne pensate di Flash MX?</msg>
In questo modo sarà molto semplice con Flash creare delle funzioni per eseguire il Parsing dell'XML e mettere i dati dentro a degli Array.
La struttura del nostro Forum sarà quindi la seguente:
- Data Base Access
- Filmato Principale che mostra le discussioni presenti sul Forum
- Script ASP che permette al filmato Flash di leggere dal Data Base quali sono le discussioni aperte
- Script ASP che permette di aprire una nuova discussione o di partecipare ad essa inserendo i dati nel Data Base
- Filmato Flash secondario che visualizza i messaggi relativi ad una specifica discussione
- Script ASP che comunica al Filmato secondario quale discussione deve visualizzare
- Script ASP che legge dal Data Base i messaggi relativi ad una specifica discussione e li invia al Filmato secondario
Funzionamento
Come abbiamo detto in apertura i filmati Flash utilizzati in questo Tutorial sono molto simili a quelli utilizzati nel Tutorial relativo al Forum in Flash che utilizzava però dei file di testo per memorizzare i dati delle discussioni. Questo perché effettivamente il passaggio all'utilizzo di un Data Base è stato un passo successivo per quanto riguarda il mio lavoro di sperimentazione e per tale motivo ho voluto riproporre in questo modo la mia esperienza. Credo sia inutile scaricare e utilizzare un tutorial o dei file open source di Flash senza capire cosa si sta facendo. È molto meglio invece andare per passi in modo da assimilare determinati concetti e avere il tempo per sperimentare e capire come funzionano i filmati flash.
Procediamo con la realizzazione del filmato principale che si chiama forumdb. Apriamo il sorgente. In questo filmato abbiamo creato due aree: la prima serve per visualizzare fino ad un massimo di 63 cartelle per pagina che indicano le discussioni aperte e l'altra area contiene un form che serve all'utente per aprire una nuova discussione sul nostro forum.
Andiamo a vedere il codice Action Script che troviamo sul primo fotogramma nel livello "AS":
controlla = "basta";
// Il file XML viene creato dallo script ASP read_db.asp
// che poi passa a flash i dati in formato XML
// PageNumber indica invece allo script ASP quale pagina aprire
// Ogni pagina corrisponde a gruppi con un massimo di 63 discussioni
filexml = "read_db.asp?PageNumber=1";
paginainiziale="01";
ApriXML();
function ApriXML()
{
_root.loading = "LOADING XML DATA...";
mioxml = new XML();
apparray = new Array();
mioxml.load(filexml + "&ranq=" + random(999999));
//mioxml.load(filexml);
mioxml.onLoad = Metti;
// Funzione principale
function Metti (success) {
if (mioxml.loaded) {
apparray = mioxml.childNodes;
// Chiamo la funzione Dati che esegue il parsing dell'XML
// e mette i dati in degli Array
Dati();
// Chiamo la funzione MenuPag che crea un menu per accedere
// alle varie pagine del forum in base al numero di discussioni
// aperte presenti nel forum stesso
MenuPag();
// Chiamo la funzione CreaTabelle che mette sul filmato
// i Clip delle Cartelle ciascuna delle quali rappresenta
// una discussione aperta
CreaTabelle();
_root.loading = undefined;
delete mioxml;
delete apparray;
};
};
}
// Funzione che rimuove tutti i Clip Cartella
// viene richiamata prima del refresh dei dati XML
function Rimuovi(){
for (a=0; a<63; a++){
_root["clipmsg"+a].removeMovieClip();
};
};
// Funzione che crea il menu delle pagine
function MenuPag(){
numero = Math.floor((totrec-1)/63)+1;
nmaxpag = numero;
for (i=0; i<numero; i++){
attachMovie("page", "pagine"+i,i+100);
_root["pagine"+i]._x=360;
_root["pagine"+i]._y=120+i*20;
k=i+1;
if (k<=9){app="0"+k}else{app=k};
_root["pagine"+i].pagina=app;
_root["pagine"+i].PageNumber = k;
if (k<=9){nmaxpag ="0"+ k;} else {nmaxpag=k};
_root.pagina = paginainiziale+"/"+nmaxpag+" - TOT DISCUSSIONI "+ totrec ;
};
};
// Funzione che dispone sul filmato i clip Cartella
function CreaTabelle () {
Rimuovi();
k = 0;
conteggio = 0;
for (i=0; i<63; i++) {
if (Nomi[i] != 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[i];
_root["clipmsg"+i].nome = Nomi[i];
_root["clipmsg"+i].titolo = Titolo[i];
_root["clipmsg"+i].nomefile = ID[i];
_root["clipmsg"+i].numero = i+1;
inizio++
conteggio++;
if (conteggio>=7) {
k++;
conteggio = 0;
}
;
}
;
}
;
}
;
// Funzione che mette i Dati XML restituiti dallo Script ASP
// in degli Array
function Dati () {
Nomi = new Array();
Titolo = new Array();
Data = new Array();
ID = 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 == "numero") {
ID.push(apparray[k].childNodes.toString());
}
else if (apparray[k].nodeName == "totrec") {
_root.totrec=apparray[k].childNodes.toString();
};
};
};
Appena lo script viene avviato c'è subito la chiamata al nostro script ASP (filexml = "read_db.asp?PageNumber=1";) che legge i dati dal Data Base, li formatta con dei TAG XML e li restituisce a Flash. Vediamo quindi lo script ASP:
<%
' Parametri di lettura del Data Base
Const adOpenKeyset = 1
Const adLockReadOnly = 1
' °°°°°°°°°°°°°°°°° Attenzione°°°°°°°°°°°°°°°°°
' Qui di seguito c'è indicato il percorso del Data Base. Modificatelo con
'quello che utilizzarete voi.
StrConnessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & server.MapPath("/mdb-database") & "dataforum.mdb"
' Magari provate a modificare questo qui sotto e commentate
' la riga sopra in modo da non dover cancellare del codice
'StrConnessione = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" & server.MapPath("/Forum DB/mdb-database/dataforum.mdb")
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open StrConnessione
' Selezioni da Data Base solo le discussioni che hanno IDpadre=0 e che sono quindi
' le discussioni aperte per la prima volta! non sono quindi risposte di eventuali discussioni
' già aperte. Inoltre ordino questi dati dall'ID più grande (discussione più recente) all'ID più piccolo.
SQL = "SELECT * FROM tabmsg WHERE IDpadre=0 order by tabmsg.id desc"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open SQL, Conn, adOpenKeyset,adLockReadOnly
' Suddivido i dati per pagine composte da max 63 Record e prendo la pagina richiesta dal filmato Flash
PageNumber = 1
if not isnull(request("PageNumber")) and request("PageNumber") <> "" then
PageNumber = cint(request("PageNumber"))
RsIn = (Pagenumber - 1) * 63
rs.move(RsIn)
end if
numrec=63
Do while not rs.eof and numrec > 0
' Formatto i dati con dei Tag XML
Response.Write "<nome>" & rs("nome") & "</nome><titolo>" & rs("titolo") & "</titolo><data>" & rs("Data") & "</data><numero>" & rs("ID") & "</numero>"
rs.movenext
numrec = numrec -1
Loop
' Restituisco un valore che indica quante discussioni aperte ci sono nel Forum in modo che Flash possa
' Calcolare il numero di pagine e creare il relativo menu delle pagine
response.write "<totrec>"& rs.recordcount &"</totrec>"
' Libero risorse e chiudo la connessione al DataBase
rs.close
set rs=nothing
Conn.Close
set Conn=nothing
%>
Come abbiamo potuto notare è stato in fin dei conti molto semplice prendere dei dati da un Data Base. Per di più la cosa importante e che possiamo decidere quanti dati prendere dal Data Base, mentre quando utilizziamo un file di testo ciò non è possibile e siamo costretti a leggere tutto il contenuto del file.
Vediamo adesso come poter scrivere sul nostro Data Base per aprire una nuova discussione sul Forum.
Aprire una nuova discussione
Il filmato principale forumdb.swf ha sulla destra un form per l'inserimento delle informazioni necessarie per aprire una nuova discussione.
Ci sono tre campi di testo di input che sono il nome (newname), il titolo (title), il messaggio (themsg) e un pulsante "INVIA" per inviare le informazioni allo script ASP che dovrà inserire nel Data Base i dati relativi alla nuova discussione.
Il codice Action Script associato al pulsante "INVIA" è il seguente:
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...";
_root.padre = Number(0);
loadVariablesNum ("add_disc.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;
}
;
}
}
}
Anche in questo caso l'utente non può inserire i caratteri "<" e ">" perché altrimenti si creerebbero problemi di lettura dei dati XML. Utilizziamo quindi una funzione che verifica questa condizione; se i dati inseriti sono corretti viene effettuata la seguente chiamata loadVariablesNum ("add_disc.asp", 0, "POST");. Dobbiamo quindi vedere cosa fa lo script ASP "add_disc.asp":
<%
' L'apice singolo nelle variabili in arrivo da Flash viene sostituito col doppio apice per evitare errori nella stringa
' di inserimento dati nel Data Base
data = Now()
nome = Replace(request("newname"),"'", "''")
titolo = Replace(request("title"),"'", "''")
messaggio = Replace(request("themsg"),"'", "''")
ilpadre =Cint( request("padre"))
' Modificare il percorso del Data Base se necessario
StrConnessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & server.MapPath("/mdb-database") & "dataforum.mdb"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open StrConnessione
SQL = "insert into tabmsg (nome,titolo,messaggio,Data,IDpadre)"
SQL = SQL & " values ('" & nome & "','" & titolo & "','" & messaggio & "','" & data & "','" & ilpadre & "')"
'response.write SQL
Conn.execute SQL
Conn.Close
set Conn=nothing
Response.Write("att=ok")
%>
Dopo che lo script ha inserito i dati con successo viene restituita una variabile di controllo a Flash att=ok. Sul Filmato Flash abbiamo un clip filmato vuoto chiamato controller che contiene il seguente codice Action Script:
onClipEvent(enterFrame){
if ( _root.controlla == "vai"){
if ( _root.att == "ok") {
_root.filexml= "read_db.asp?PageNumber=1";
_root.Rimuovi();
_root.ApriXML();
_root.paginainiziale="01";
_root.controlla = "basta";
_root.att = "MESSAGGIO INVIATO, GRAZIE! :-)";
// Rimetto tutte le variabili in stand by
_root.newname = undefined;
_root.themsg = undefined;
_root.title = undefined;
}
}
}
Il Clip Controller viene avviato quando clicchiamo sul Pulsante "INVIA" e ciò indica che l'utente ha inviato i dati per aprire una nuova discussione e appena lo script ASP "add_disc.asp" setta la variabile "att" su "ok" il Clip Controller effettua il refresh del file XML richiamando lo script ASP che legge i dati dal Data Base.
Leggere una discussione
Cosa succede invece quando vogliamo leggere una discussione?
Quando il filmato Flash principale forumdb.swf viene aperto questo (come abbiamo detto in precedenza) crea diversi Clip "Cartella" che indicano appunto ciascuno una discussione aperta. Quando passiamo col mouse sopra ogni cartella si apre una sorta di finestra tipo etichetta che ci mostra delle informazioni relative a quella discussione (titolo della discussione, data di apertura e nome di chi l'ha aperta). Questo effetto viene ottenuto utilizzando il seguente codice Action Script associato ad un pulsante trasparente che si trova dentro ogni Clip "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 = "viewdisc.asp?nomefile="+this.nomefile;
getURL ( url, _self );
}
Il Clip "show" che si trova sullo stage avrà invece il seguente codice Action Script sul secondo fotogramma:
stop ();
this.startDrag();
_root.show._x = _root._xmouse+190;
_root.show._y = _root._ymouse-20;
_root.show.swapDepths(1000);
Quando clicchiamo però su un Clip "Cartella" andiamo a leggere i messaggi legati a quella discussione. In questo caso viene richiamato un URL che è il seguente : viewdisc.asp?nomefile="+this.nomefile; Stiamo richiamando quindi una pagina ASP. Vediamo il codice di viewdisc.asp:
<%
nomefile = request("nomefile")
%>
<html>
<head>
<title>::: ENRICO LAI ::: FORUM ASP-DB Exp > - v.0.2 </title>
</head>
<body bgcolor="#FF99CC" leftmargin=0 topmargin=0>
<p>
<object type="application/x-shockwave-flash" data="discussionedb.swf?chiave=<%=nomefile%>" width="780" height="500">
<param name="movie" value="discussionedb.swf?chiave=<%=nomefile%>" />
<param name="quality" value="high" />
</object>
</p>
</body>
</html>
Il parametro "nomefile" è l'ID della discussione aperta. Questo viene passato alla pagina ASP che lo ripassa al filmato Flash discussionedb.swf.
Questo perché come abbiamo detto prima se noi vogliamo aprire tutti i messaggi relativi ad una discussione che ha come ID sul Data Base il numero 13 dobbiamo ricercare sul Data Base tutti i messaggi che hanno come valore nel campo IDpadre il numero 13 !!!
Apriamo il file discussione.fla e vediamo il codice al suo interno:
controlla = "basta";
paginainiziale="01";
filexml = "opendisc_db.asp?chiave="+chiave+"&PageNumber=1";
ApriXML();
function ApriXML (r) {
_root.loading = "LOADING XML DATA...";
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.floor((totrec-1)/4)+1;
nmaxpag = numero;
if (nmaxpag<=9){nmaxpag ="0"+ nmaxpag};
_root.pagina = paginainiziale+"/"+nmaxpag;
conteggio=0;
j=0;
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].PageNumber= k;
conteggio++;
if (conteggio>=21) {
j++;
conteggio = 0;
};
};
};
function CreaTabelle () {
Rimuovi();
k = 0;
conteggio = 0;
if (paginainiziale == "01"){
_root.iniziatada = Nomi[0] + " - in data - "+ Data[0];
_root.titolodisc = Titolo[0];
};
for (i=0; i<4; i++) {
if (Nomi[i] != 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[i];
_root["clipmsg"+i].nome = Nomi[i];
_root["clipmsg"+i].titolo = Titolo[i];
_root["clipmsg"+i].msg = Msg[i];
_root["clipmsg"+i].numero = i+1;
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());
} elseif (apparray[k].nodeName == "data") {
Data.push(apparray[k].childNodes.toString().toUpperCase());
}
elseif (apparray[k].nodeName == "msg") {
Msg.push(apparray[k].childNodes.toString().toUpperCase());
}
elseif (apparray[k].nodeName == "totrec") {
totrec=apparray[k].childNodes.toString();
};
};
};
Il Codice Action Script utilizzato è molto simile a quello utilizzato nel file Flash principale. In effetti anche il funzionamento e la logica sono identiche!
Appena aperto il filmato viene richiamato uno script ASP (filexml = "opendisc_db.asp?chiave="+chiave+"&PageNumber=1";) che legge dal Data Base i dati richiesti per restituirceli in formato XML e visualizzarli sul Flash creando delle tabelle con la funzione CreaTabelle()
.
Ecco il codice dello script ASP:
<%
Const adOpenKeyset = 1
Const adLockReadOnly = 1
StrConnessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & server.MapPath("/mdb-database") & "dataforum.mdb"
'StrConnessione = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" & server.MapPath("/Forum DB/mdb-database/dataforum.mdb")
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open StrConnessione
chiave = Request("chiave")
' Selezioni i Record dove l'ID o l'IDpadre è uguale alla chiave. Ordino i dati dall'ID più piccolo (che sarà uguale alla chiave e
' corrisponderà quindi alla discussione aperta per la prima volta) al più grande (l'ultima risposta inserita)
SQL = "SELECT * FROM tabmsg WHERE IDpadre=" & chiave & " Or ID=" & chiave & " order by ID ASC"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open SQL, Conn, adOpenKeyset,adLockReadOnly
PageNumber = 1
' La pagine questa volta sono composte da max 4 record
if not isnull(request("PageNumber")) and request("PageNumber") <> "" then
PageNumber = cint(request("PageNumber"))
RsIn = (Pagenumber - 1) * 4
rs.move(RsIn)
end if
numrec=4
Do while not rs.eof and numrec > 0
Response.Write "<nome>" & rs("nome") & "</nome><titolo>" & rs("titolo") & "</titolo><data>" & rs("Data") & "</data><msg>" & rs("messaggio") & "</msg>"
rs.movenext
numrec = numrec -1
Loop
response.write "<totrec>"& rs.recordcount &"</totrec>"
rs.close
set rs=nothing
Conn.Close
set Conn=nothing
%>
Il funzionamento dello script è simile allo script usato in precedenza. Ci sono solo delle piccole differenze legate al numero di record per pagina (che in questo caso sono 4) e al tipo di ricerca che viene eseguita.
L'utente può quindi leggere tranquillamente le risposte relative alla discussione aperta. Se vuole cambiare pagina cliccherà sulla pagina desiderata. Il codice associato ad ogni Clip "Pagina" è il seguente:
on (release) {
_root.filexml= "opendisc_db.asp?chiave="+ _root.chiave+"&PageNumber="+this.PageNumber;
_root.Rimuovi();
_root.ApriXML();
if (PageNumber <=9) {app="0"+PageNumber} else {app=PageNumber};
_root.paginainiziale = this.app;
}
e il suo compito è quello di richiamare lo stesso script ASP che legge dal Data Base indicando però un numero diverso di pagina.
Partecipare ad una discussione
Per partecipare ad una discussione l'utente cliccherà sul pulsante Partecipa che lo porta ad un form che è praticamente identico a quello utilizzato sul filmato Flash principale (forumdb.swf). Il codice associato al pulsante INVIA è il seguente:
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...";
_root.padre = Number(chiave);
loadVariablesNum ("add_disc.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 lo script ASP richiamato per l'inserimento dei dati sul Data Base è sempre lo stesso. In questo caso però verrà inserito anche l'IDpadre che altro non è che il valore della variabile "chiave" che abbiamo passato al filmato prima della sua apertura, in modo da collegare questa risposta alla sua relativa discussione sul Forum.
Anche in questo filmato abbiamo il Clip Controller con il seguente codice Action Script:
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! :-)";
// Rimetto tutte le variabili in stand by
_root.newname = undefined;
_root.themsg = undefined;
_root.title = undefined;
_root.gotoAndStop(1);
}
}
}
Che esegue il refresh dei dati e ci riporta sul fotogramma 1 dove possiamo leggere i messaggi della discussione.
Conclusioni e suggerimenti
Prima di procedere nella modifica del codice e/o della grafica del Forum si consiglia di accertarsi prima di tutto che il server supporti le pagine ASP e che siano settati i permessi di scrittura nella cartella dove andrà a risiedere il Data Base.Dopo questa verifica si dovrà modificare negli script ASP il percorso relativo al Data Base inserendo quello corretto che utilizzerete. Fatto questo installate i file e testate il tutto. Vi ricordo inoltre che è bene che la cartella che contiene il Data Base non sia visibile in lettura dal Browser perché altrimenti chiunque potrà leggere e vedere il contenuto del vostro Data Base e nel caso ci siano delle PassWord memorizzate la cosa può risultare dannosa.