Redazione
a- a+

Creare un blog in ASP

Vediamo come fare a creare un blog in ASP. Guida con codici ed esempi.

Introduzione
Il Blog è uno strumento molto recente che permette di realizzare in pochi minuti un sito web personale dove poter esprimere la propria opinione su un qualsiasi argomento, in qualsiasi momento. In pochi minuti perchè ne esistono molti in circolazione quasi tutti gratuiti e opensource.

Nel 2003 si è verificato un vero boom, per questo dedichiamo questa lezione all'analisi delle principali funzioni che possiede un blog. Con l'utilizzo del Blog vedremo come utilizzare tutto ciò che abbiamo studiato fino ad ora.

Analisi
Il Blog che prendiamo in considerazione è molto semplice, ne esistono molti, completi e open source (codice libero) per la Rete...
Il cuore del Blog si trova tutto in un unico file che contiene 2 Sub che visualizzano i messaggi e l'archivio.

Il Database
Il database è molto semplice e contiene una unica tabella: messaggi con i seguenti campi:

  • id_m
  • titolo
  • testo
  • autore_nome
  • autore_email
  • data
  • ora

HomePage
La HomePage contiene essenzialmente:

  • quasi esclusivamente codice HTML
  • 2 inclusioni di file .asp
  • 2 istruzioni Asp per richiamare 2 Sub

I 2 file di inclusione sono:

  • config.asp
  • funzioni.asp

La loro funzione la vedremo subito, ma prima analiziamo le due istruzioni Asp:

<% Call Archivio() %><% Call Messaggi() %>

Entrambe richiamano delle Sub che si trovano nel file funzioni.asp

Il file Config.asp
Questo file contiene l'indirizzo del database e le 2 funzioni per trasformare le date che abbiamo studiato precedentemente. Inoltre crea la data e l'ora attuale in formato numerico aaaammgg.

Codice19.1

<%dbase = "provider=microsoft.jet.oledb.4.0;"dbase = dbase & "data source=c:scriptasplog2dblog.mdb"'Connessione al databaseSet Conn = Server.CreateObject("ADODB.Connection")Conn.Open dbase'Impostazioni italianeSESSION.LCID = 1040'Autore e propretario del blogautore_blog = "Lorenzo Pascucci"'Trasforma un numero aaaammgg in una data gg/mm/aaaaFunction NumInData(dataris)NumInData = Right(dataris,2) & "/" & Mid(dataris,5,2) &_ "/" & Left(dataris,4)End Function'Trasforma un numero hhmmss in hh:mm:ssFunction NumInOra(Ora)If Len(ora) = 6 thenNumInOra = Left(Ora,2) & ":" & Mid(Ora,3,2) & ":" & Right(Ora,2)ElseNumInOra = Left(Ora,1) & ":" & Mid(Ora,2,2) & ":" & Right(Ora,2)End IfEnd Function' Creo la data di oggidataoggi = Year(date()) mese = Month(date()) If mese < 10 then mese = 0 & meseEnd Ifgiorno = Day(date())If giorno < 10 thengiorno = 0 & giornoEnd Ifdataoggi = dataoggi & mese & giorno'Creo l'ora attualeoraoggi = Hour(Time()) + 6If oraoggi < 10 thenoraoggi = 0 & oraoggiEnd Ifminutioggi = Minute(time())If minutioggi < 10 thenminutioggi = 0 & minutioggiEnd Ifsecondioggi = Second(time())If secondioggi < 10 thensecondioggi = 0 & secondioggiEnd Iforaoggi = oraoggi & minutioggi & secondioggi%>

Conosciamo bene il funzionamento delle istruzioni presenti in questa pagina, da notare:

SESSION.LCID = 1040

Questa istruzione permette di impostare i valori di data, ora, valuta in base agli standard in Italia, quindi: gg/mm/aaaa, hh:mm:ss e €. In questo caso ci serve soprattutto nella Sub Funzioni.asp quando andiamo ad utilizzare la funzione MonthName(), che ci restituirà il nome del mese in italiano. 1040 è il codice che identifica l'Italia.

autore_blog = "Lorenzo Pascucci"

autore_blog è una variabile in cui memorizzo il proprietario del blog.

La pagina Funzioni.asp
E' questa la pagina cuore del Blog. Al suo interno ci sono due Sub che permettono di visualizzare i messaggi del blog.

Codice19.2

<%' SUB Visualizzazione messaggiSub Messaggi()vis = Request("vis")If Trim(vis) <> "" thendata_ini = visdata_fin = vis + 32'Query che visualizza i messaggi di un mese (richiesta da link archivio)SQL = "SELECT * FROM messaggi WHERE data > " & data_ini SQL = SQL & " AND data < " & data_fin & " ORDER BY data, ora DESC;"Else' Query che preleva gli ultimi 10 messaggi postatiSQL = "SELECT TOP 10 * FROM messaggi ORDER BY data, ora DESC;"End IfSet Rs = Conn.Execute(SQL)' Se sono presenti dei messaggi... If Not rs.EOF Then' Vai al primo messaggio da visualizzare (ultimo inserito)rs.MoveFirst' Visualizza finchè i messaggi sono finiti o fino al ' raggiungimento di 10 messaggi visualizzatiWhile Not rs.EOF'Visualizza autoreautore_nome = rs("autore_nome")autore_email = rs("autore_email")If Trim(autore_email) <> "" thenautore = "<a href=""mailto:" & autore_email & """>" & autore_nome & "</a>"Elseautore = autore_nomeEnd If%><p><font face="Verdana" size="2"><b><%=rs("titolo")%></b><br>Testo</font><p><font face="Verdana" size="1">di <b><%=autore%></b> @ <b><%=NumInData(rs("data"))%> <%=NumInOra(rs("ora"))%></b></font></p><br /><br /><%' Vai al record successivors.MoveNextWend'Se non ci sono messaggielseresponse.Write("<p>Non sono stati pubblicati messaggi.</p>")End ifrs.Closeset rs = NothingEnd Sub' SUB Visualizza archivio messaggi disponibiliSub Archivio()mese_old = 0' Query che preleva i mesi in cui ci sono messaggiSQL2 = "SELECT * FROM messaggi ORDER BY data DESC"Set Rs2 = Conn.Execute(SQL2)' Se sono presenti dei messaggi... If Not rs2.EOF Then' Vai al primo messaggio (ultimo inserito)rs2.MoveFirst' Ciclo finchè i messaggi sono finitiWhile Not rs2.EOFdata = rs2("data")' Prelevo il mese in cui il messaggio è stato pubblicatomese = Mid(data,5,2)' Prelevo l'anno il cui il messaggio è stato pubblicatoanno = Left(data,4)' Controllo se il mese è già stato visualizzato, se non lo è stato' lo visualizzaIf mese <> mese_old thenResponse.Write("<br /><a href=""default.asp?vis=" & anno & mese & "00"">" &_ MonthName(mese,false) & "</a> - " & anno)End If' Memorizzo il mese del messaggio appena letto per fare confronto,' al prossimo ciclomese_old = mesers2.MoveNextWend'Se non ci sono messaggielseresponse.Write("<p>Non sono stati pubblicati messaggi.</p>")End if End Sub %>

La prima Sub Messaggi() non presenta particolarità, tranne il seguente codice:

vis = Request("vis")If Trim(vis) <> "" thendata_ini = visdata_fin = vis + 32'Query che visualizza i messaggi di un mese (richiesta da link archivio)SQL = "SELECT * FROM messaggi WHERE data > " & data_iniSQL = SQL & " AND data < " & data_fin & " ORDER BY data, ora DESC;"Else' Query che preleva gli ultimi 10 messaggi postatiSQL = "SELECT TOP 10 * FROM messaggi ORDER BY data, ora DESC;"End If

che permette di effettuare 2 azioni in base al tipo di visualizzazione che si vuol effettuare.

Infatti la pagina default.asp che richiama la Sub Messaggi() permette di visualizzare sia gli ultimi 10 messaggi postati, sia tutti i messaggi di un mese. La prima visualizzazione avviene se si carica la homepage, mentre la seconda avviene quando si sceglie un mese dall'archivio. Infatti l'unica differenza è nella query SQL.

Con la variabile vis e la condizione IF si individua se la richiesta avviene dall'archivio o meno. Nel primo caso utilizziamo la query:

SQL = "SELECT * FROM messaggi WHERE data > " & data_iniSQL = SQL & " AND data < " & data_fin & " ORDER BY data, ora DESC;"

Questa query preleva tutti i messaggi compresi tra due date, in particolare dal 1° al 31° del mese scelto. Infatti data_ini ha come valore:

aaaamm00

mentre data_fin = data_ini + 32, quindi:

aaaamm32

In questo modo verranno presi tutti i messaggi di un mese, senza problemi di mesi con 28 o 30 giorni.

Nella Sub Archivio() c'è una serie d'istruzioni molto interessante all'interno del ciclo WHILE:

While Not rs2.EOFdata = rs2("data")' Prelevo il mese in cui il messaggio è stato pubblicatomese = Mid(data,5,2)' Prelevo l'anno il cui il messaggio è stato pubblicatoanno = Left(data,4)' Controllo se il mese è già stato visualizzato, se non lo è stato' lo visualizzaIf mese <> mese_old thenResponse.Write("<br /><a href=""default.asp?vis=" & anno & mese & "00"">" &_ MonthName(mese,false) & "</a> - " & anno)End If' Memorizzo il mese del messaggio appena letto per fare confronto,' al prossimo ciclomese_old = mesers2.MoveNext

Questa Sub ha il compito di visualizzare tutti i mesi in cui sono presenti dei messaggi. Solo che nel database non memorizziamo il mese in un campo a parte, ma memorizziamo tutta la data. Quindi non è possibile fare un GROUP BY nella query SQL, ma dobbiamo raggruppare per mese con Asp.

Quindi è necessario recuparare la data di pubblicazione del messaggio dal database e prelevare il mese e l'anno:

data = rs2("data")mese = Mid(data,5,2)anno = Left(data,4)

Confronto la variabile mese con la variabile mese_old e in caso sia diverse visualizzo in output (con codice HTML) il nome del mese con MonthName():

If mese <> mese_old thenResponse.Write("<br /><a href=""default.asp?vis=" & anno & mese & "00"">" &_ MonthName(mese,false) & "</a> - " & anno)End If

memorizzo in mese_old il mese del messaggio presente nel record appena analizzato e si ripete il ciclo.
Quindi ogni volta che ci sono 2 messaggi consecutivi con diverso mese, viene visualizzato il mese del nuovo messaggio che si sta analizzando con rispettivo anno.

Nuovi messaggi
Infine ci sono 2 pagine:

  • messaggio.asp
  • messaggio1.asp

La prima contiene il modulo per inserire un nuovo messaggio, la seconda contiene il codice che recupera i valori dei campi del modulo e la query SQL per l'inserimento.

autore_nome = Trim(Request.Form("autore"))autore_email = Trim(Request.Form("email"))titolo = Trim(Request.Form("titolo"))testo = Request.Form("testo")SQL = "INSERT INTO messaggi (autore_nome,autore_email,titolo,testo,data,ora) VALUES('" & autore_nomeSQL = SQL & "','" & autore_email & "','" & titolo & "','" & testo & "'," & dataoggi & "," & oraoggi & ")"Set rs = Conn.Execute(SQL)

Infine viene eseguito il redirect alla home del Blog che visualizzerà il nuovo messaggio inserito:

Response.Redirect "default.asp"

Riflessioni
In questo script quasi tutte le istruzioni Asp vengono utilizzare come Sub Routine. Questo per permettere una migliore "leggibilità" del codice oltre al fatto che con progetti grandi e generalizzando le Sub è possibile risparmiare anche molte migliaia di righe di codice.

Potenzialità di un blog
Questo è un semplice esempio di un Blog, in realtà un Blog può possedere molte funzioni:

  • commenti per ciascun messaggio
  • voto dei messaggi
  • possibilità di scrivere messaggi solo per l'autore eo altre persone con permessi
  • feed RSS (standard per far diffondere i propri messaggi in altri blog o siti)
  • dividire i messaggi per categoria
  • creare photo-blog

e molte altre caratteristiche.