Articoli Referenze Script FAQ Downloads Menu Javascript Ricette Cocktail Corsi online Registrazione domini Area Aziende



Un guestbook in ASP, XML ed XSLT con XMLDOM

Home + Articoli + Messaggistica + Articolo # 113
Autore: Luca Ruggiero

Concesso in esclusiva a Mr.Webmaster. Vietata la riproduzione.


Un guestbook (in italiano libro degli ospiti ed in gergo chiamato anche muro) è un sistema utilizzato su moltissimi siti, per lo più amatoriali, per permettere ai propri utenti di lasciare un messaggio o un commento sul sito. Tutti i messaggi vengono esposti in sequenza in ordine di data decrescente, ovvero dal più recente al meno recente, in modo tale che tutti gli utenti abbiano la possibilità di leggere tutti i messaggi presenti, oltre al proprio.

Si tratta di un tipo di applicazione di input/output realizzabile e gestibile con un linguaggio di scripting lato server, in questo caso ASP, che si basa sulla memorizzazione dei dati su di una struttura stabile. In genere si utilizza un database per memorizzare i vari messaggi; alcuni utilizzano un file di testo; noi utilizzeremo una struttura XML, in modo sia da realizzare una simpatica utility per il nostro sito e per farci le ossa con l'utilizzo dell'XML, dell'XSLT e dell'XMLDOM, oggetto che fa da interfaccia tra ASP ed XML.

Struttura dell'applicazione

Un guestbook è composto, a livello di front-office, da un modulo di inserimento dati e da un'area riservata alla visualizzazione dei messaggi. A livello di back-office, invece, la questione è molto più complessa perchè c'è bisogno, oltre al modulo ed all'area di visualizzazione, anche di una struttura di dati e da uno script di controllo ed inserimento dei dati. Nello specifico dell'applicazione descritta in questo Articolo necessitiamo di
  • un modulo di registrazione dei messaggi;
  • un'area di visualizzazione dei messaggi;
  • uno script che verifichi la correttezza dei dati inseriti e provveda alla loro registrazione nel file XML;
  • un file XML in cui salvare i dati;
  • un file XSLT in cui mostrare tutti i dati contenuti nel file XML assegnando a ciascuno un template HTML ed un'eventuale stilizzazione CSS.
Il tutto si traduce in pratica negli argomenti trattati nei prossimi paragrafi. Per prima cosa create sul vostro Web Server la cartella xguest ed assicuratevi di assegnarle tutti i permessi necessari sia in lettura che in scrittura.

Il file di configurazione dell'applicazione

Per comodità e per buona norma di programmazione utilizzeremo un file di appoggio in cui inserire alcuni codici ed alcune notizie comuni a tutti i file ASP dell'applicazione. Create il file config.asp e salvatelo nella cartella xguest sul vostro Web Server. Di seguito il codice commentato del file
<%
    ' Impostazioni di base della pagina
    Option Explicit
    On Error Resume Next
    Response.Buffer = True

    ' Recupero i file XML ed XSLT dell'applicazione
    Dim file_xml, file_xsl
        file_xml = Server.MapPath("guestbook.xml")
        file_xsl = Server.MapPath("guestbook.xsl")
%>
Trattandosi di un file che verrà incluso in altri file ASP ricordo che è necessario non inserire la dichiarazione @LANGUAGE all'inizio della pagina.

Struttura del file XML

La struttura XML della nostra applicazione è piuttosto semplice e prevede i campi id, nome, email, commento e data. Di seguito il codice del file guestbook.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<database>
    <messaggio>
        <id>1</id>
        <nome>Nome Visitatore</nome>
        <email>account@server.ext</email>
        <commento>Testo del commento...</commento>
        <data>28/06/2005 19.47.31</data>
    </messaggio>
</database>
Salvate questo file nella cartella xguest sul vostro Web Server.

Struttura del file XSLT

Come anticipato nei paragrafi precedenti utilizzeremo XSLT per accedere ai dati del file XML del nostro guestbook
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table align="center" width="450">
    <xsl:for-each select="database/messaggio">
    <xsl:sort select="id" order="descending"/>
    <tr>
    <td>
        <b>Messaggio di
        <a href="mailto:{./email}">
            <xsl:value-of select="nome"/>
        </a></b>
        <br/><br/>
        <xsl:value-of select="commento"/><br/><br/>
        <i>Inserito in data <xsl:value-of select="data"/></i>
    </td>
    </tr>
    <tr><td><hr/></td></tr>
    </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
La struttura è semplice: utilizziamo come template una tabella HTML per visualizzare i dati del file XML; effettuiamo un ciclo xsl:for-each per estrarre tutti i dati; ordiniamo i dati in modo discendente specificandolo nel comando xsl:sort ed estraiamo i singoli nodi dal file XML utilizzando il comando xsl:value-of, stampando a video i risultati nel punto del template che ci interessa.

Il modulo di registrazione e la visualizzazione dei messaggi

Alcuni guestbook utilizzano due file differenti per il modulo di inserimento dei messaggi e per la visualizzazione di questi ultimi; noi utilizzeremo un unico file per entrambe le cose. Create il file index.asp e salvatelo nella cartella xguest sul vostro Web Server. Di seguito il codice opportunamente commentato
<%@LANGUAGE = VBScript%>
<!--#include file="config.asp"-->
<%
    ' Dichiaro le variabili della pagina
    Dim oggetto, stile, errore

    ' Apro una connessione con file XML
    Set oggetto = Server.CreateObject("Microsoft.XMLDOM")
        oggetto.async = False
        oggetto.load file_xml

    ' Apro una connessione col file XSLT
    Set stile = Server.CreateObject("Microsoft.XMLDOM")
        stile.async = False
        stile.load file_xsl

    ' Recupero la variabile per parametrizzare eventuali
    ' messaggi di errore in fase di inserimento
    errore = Request.QueryString("errore")
%>
<html>
    <head>
        <title>Un guestbook in ASP, XML ed XSLT</title>
    </head>
<body>

<h1 align="center">Un guestbook in ASP, XML ed XSLT</h1>

<form method="post" action="nuovo.asp">
<table align="center" width="450">
<tr>
    <td>
        Nome<br>
        <input
        type="text"
        name="nome"
        value="<%=Session("nome")%>"
        style="width: 100%;">
        <br>
        Email<br>
        <input
        type="text"
        name="email"
        value="<%=Session("email")%>"
        style="width: 100%;">
        <br>
        Commento
        <textarea
        name="commento"
        rows="10"
        style="width: 100%;"><%=Session("commento")%></textarea>
    </td>
</tr>
<tr>
    <td align="right"><input type="submit" value=" OK "></td>
</tr>
</table>
</form>

<p align="center" style="color: #FF0000;">
<%
    ' Mostro a video un messaggio qualora si verifichi
    ' un errore durante l'inserimento dei dati
    If errore > 0 Then
        Select Case errore
            Case 1
                Response.Write "Inserisci il tuo nome"
            Case 2
                Response.Write "Inserisci il tuo indirizzo email"
            Case 3
                Response.Write "Inserisci un commento"
            Case Else
                Response.Write "&nbsp;"
        End Select
    End If
%>
</p>

<%
    ' Effettuo la trasformazione in XSLT
    Response.Write oggetto.transformNode(stile)
%>

</body>
</html>
<%
    ' Un po di pulizia...
    Set oggetto = Nothing
    Set stile = Nothing
%>
Inserimento dei messaggi nel file XML

Siamo arrivati alla parte finale e maggiormente articolata dell'applicazione, ovvero la fase di controllo ed inserimento dei messaggi del guestbook nel file XML. Create il file nuovo.asp (a cui punta il modulo di inserimento contenuto nel file index.asp esaminato nel paragrafo precedente) e salvatelo nella cartella xguest nel vostra Web Server. Il suo scopo è semplice: controlla i dati inseriti ed una volta soddisfatte tutte le condizioni procede alla creazione di un nuovo nodo nel file XML; in fine effettua un redirect al file index.asp in cui verrà visualizzato il nuovo messaggio. Di seguito il codice opportunamente commentato
<%@LANGUAGE = VBScript%>
<!--#include file="config.asp"-->
<%
' Recupero i dati dal modulo
Dim nome, email, commento
nome = Request.Form("nome")
email = Request.Form("email")
commento = Request.Form("commento")

' Memorizzo in una serie di variabili di sessione
' i dati recuperati dal modulo in modo da mostrarli
' all'interno dei relativi campi in fase di errore
' evitando all'utente di dover compilare di nuovo
' anche i campi già inseriti correttamente
Session("nome") = nome
Session("email") = email
Session("commento") = commento

' Espressione regolare per l'indirizzo email
Dim stringa, re
stringa = "^[\w\-\.]*[\w\.]\@[\w\.]*[\w\-\.]"
stringa = stringa & "+[\w\-]+[\w]\.+[\w]+[\w $]"
Set re = New RegExp
re.Pattern = stringa
re.IgnoreCase = True

' Controllo che i valori immessi siano validi
If Len(Trim(nome)) = 0 Then
    Set re = Nothing
    Response.Redirect "index.asp?errore=1"
ElseIf re.Test(email) = False Then
    Set re = Nothing
    Response.Redirect "index.asp?errore=2"
ElseIf Len(Trim(commento)) = 0 Then
    Set re = Nothing
    Response.Redirect "index.asp?errore=3"
Else
    ' Dichiaro le variabili che utilizzeremo
    ' in fase di inserimento dei dati
    Dim oggetto, quanti, id, root
    Dim nodoId, nodoNome, nodoEmail, nodoComm, nodoData

    ' Creo l'oggetto XMLDOM
    Set oggetto = Server.CreateObject("Microsoft.XMLDOM")
    oggetto.async = False
    oggetto.load file_xml
    ' Creo dinamicamente il campo ID che funge da contatore
    Set quanti = oggetto.getElementsByTagName("messaggio/id")
    id = CInt(quanti.length + 1)

    ' Creo l'elemento madre per il recupero dei dati
    Dim percorso
    percorso = oggetto.createElement("messaggio")
    Set root = oggetto.documentElement.appendChild(percorso)

    ' Creo i singoli nodi associati all'elemento madre
    Set nodoId = root.appendChild(oggetto.createElement("id"))
    nodoId.text = id
    Set nodoNome = root.appendChild(oggetto.createElement("nome"))
    nodoNome.text = nome
    Set nodoEmail = root.appendChild(oggetto.createElement("email"))
    nodoEmail.text = email
    Set nodoComm = root.appendChild(oggetto.createElement("commento"))
    nodoComm.text = commento
    Set nodoData = root.appendChild(oggetto.createElement("data"))
    nodoData.text = Now()

    ' Salvo il nuovo messaggio
    oggetto.save file_xml

    ' Un po di pulizia...
    Session.Abandon()
    Set re = Nothing
    Set oggetto = Nothing
    Set root = Nothing
    Set nodoId = Nothing
    Set nodoNome = Nothing
    Set nodoEmail = Nothing
    Set nodoComm = Nothing
    Set nodoData = Nothing

    ' Riporto l'utente sulla pagina principale
    Response.Redirect "index.asp"
End If
%>
© 2008 ASP Center di Luca Ruggiero - P. IVA 05564851219 - Utenti online: 28 - Disclaimer | Pubblicità | Supportaci | Staff | Contatti
  Appunti PHP | Giornale Webmaster | Mr.Webmaster | Download | DevSpy.com | ASPCode.it | ClaudioGarau.it | Webmaster Facile | Come Faccio | AlVerde.net | CodiceFacile.it | I Programmatori | By Luciani | VoiceXML Italian User Group | Giochi | Extro Web Site | Morpheus Web | AG Web Solutions | Net-Free | PC Sicuro | PC Self | Tutorial Web | Dablones