In breve: la categoria e` memorizzata come una serie di stringhe separate da
punto e virgola (;). Per mostrarle bisognera` lanciare le query appropriate sul
DB. Nella pagina inc_funzioni.asp ho aggiunto le funzioni qui sotto. Di
particolare importanza sono CaricaListaCategorie (che genera un array
bidimensionale ordinato per categorie, di categorie e il numero di articoli
associati) e GeneraLinkCategorie che viene usata dalle varie pagine per generare
il link alle varie categorie partendo dalla stringa spezzettata.
In CaricaListaCategorie eseguo due query: la prima cerco tutte le stringhe
distinte nel campo Sezione che non contengono il punto-e-virgola (e`
praticamente l'elenco delle categorie dei post taggati in una sola categoria).
Poi 'arricchisco' questo array con le altre stringhe opportunamente spezzettate.
Clicca qui per le modifiche agli altri files.
' restituisce la posizione di ilValore all'interno dell'array
Function IndiceInArray(ByVal lArray, ByVal ilValore)
Dim intLB, intUB
Dim i
Dim intMatch
intMatch = -1
intLB = LBound(lArray,2)
intUB = UBound(lArray,2)
For i = intLB To intUB
If CStr(lArray(0,i)) = CStr(ilValore) Then
intMatch = i
Exit For
End If
Next
IndiceInArray = intMatch
End Function
Sub SwapRows(ary,row1,row2)
'== This proc swaps two rows of an array
Dim x,tempvar
For x = 0 to Ubound(ary, 1)
tempvar = ary(x, row1)
ary(x, row1) = ary(x, row2)
ary(x, row2) = tempvar
Next
End Sub 'SwapRows
Sub QuickSort(vec,loBound,hiBound,SortField)
'==--------------------------------------------------------==
'== Sort a 2 dimensional array on SortField ==
'== ==
'== This procedure is adapted from the algorithm given in: ==
'== ~ Data Abstractions & Structures using C++ by ~ ==
'== ~ Mark Headington and David Riley, pg. 586 ~ ==
'== Quicksort is the fastest array sorting routine for ==
'== unordered arrays. Its big O is n log n ==
'== ==
'== Parameters: ==
'== vec - array to be sorted ==
'== SortField - The field to sort on (2nd dimension value) ==
'== loBound and hiBound are simply the upper and lower ==
'== bounds of the array's 1st dimension. It's probably ==
'== easiest to use the LBound and UBound functions to ==
'== set these. ==
'==--------------------------------------------------------==
Dim pivot(),loSwap,hiSwap,temp,counter
Redim pivot (Ubound(vec,1))
'== Two items to sort
if hiBound - loBound = 1 then
if vec(SortField,loBound) > vec(SortField,hiBound) then Call SwapRows(vec,hiBound,loBound)
End If
'== Three or more items to sort
For counter = 0 to Ubound(vec,1)
pivot(counter) = vec(counter,int((loBound + hiBound) / 2))
vec(counter,int((loBound + hiBound) / 2)) = vec(counter,loBound)
vec(counter,loBound) = pivot(counter)
Next
loSwap = loBound + 1
hiSwap = hiBound
do
'== Find the right loSwap
while loSwap < hiSwap and vec(SortField,loSwap) <= pivot(SortField)
loSwap = loSwap + 1
wend
'== Find the right hiSwap
while vec(SortField,hiSwap) > pivot(SortField)
hiSwap = hiSwap - 1
wend
'== Swap values if loSwap is less then hiSwap
if loSwap < hiSwap then Call SwapRows(vec,loSwap,hiSwap)
loop while loSwap < hiSwap
For counter = 0 to Ubound(vec,1)
vec(counter,loBound) = vec(counter,hiSwap)
vec(counter,hiSwap) = pivot(counter)
Next
'== Recursively call function .. the beauty of Quicksort
'== 2 or more items in first section
if loBound < (hiSwap - 1) then Call QuickSort(vec,loBound,hiSwap-1,SortField)
'== 2 or more items in second section
if hiSwap + 1 < hibound then Call QuickSort(vec,hiSwap+1,hiBound,SortField)
End Sub 'QuickSort
'restituisce un array bidimensionale (2 x N) in cui c'e'
'la lista delle categorie e il totale degli articoli per categoria
Function CaricaListaCategorie()
Dim SQLCategorieArticoli, RSCategorieArticoli
Dim MaxSize
Dim Categorie()
Dim nomeCategoria
Dim i
MaxSize = 25
ReDim Categorie(1, MaxSize)
i=0
SQLCategorieArticoli = " SELECT Articoli.Sezione, COUNT(Articoli.Data) as totale FROM Articoli WHERE Articoli.Data & Articoli.Ora <= '"& DataToStr(Date()) & OraToStr(Time()) &"' AND Articoli.Bozza = False AND Articoli.Sezione NOT LIKE '%;%' GROUP BY Articoli.Sezione ORDER BY Articoli.Sezione"
Set RSCategorieArticoli = Server.CreateObject("ADODB.Recordset")
RSCategorieArticoli.Open SQLCategorieArticoli, Conn, 1, 3
If NOT RSCategorieArticoli.EOF Then
Do While NOT RSCategorieArticoli.EOF
nomeCategoria = RSCategorieArticoli("Sezione")
Categorie(0,i) = nomeCategoria
Categorie(1,i) = RSCategorieArticoli("Totale")
i=i+1
If i = MaxSize Then
Redim Preserve Categorie(1, MaxSize+25)
MaxSize = MaxSize + 25
End If
RSCategorieArticoli.MoveNext
Loop
End If
SQLCategorieArticoli = " SELECT Articoli.Sezione, COUNT(Articoli.Data) as totale FROM Articoli WHERE Articoli.Data & Articoli.Ora <= '"& DataToStr(Date()) & OraToStr(Time()) &"' AND Articoli.Bozza = False AND Articoli.Sezione LIKE '%;%' GROUP BY Articoli.Sezione ORDER BY Articoli.Sezione"
Set RSCategorieArticoli = Server.CreateObject("ADODB.Recordset")
RSCategorieArticoli.Open SQLCategorieArticoli, Conn, 1, 3
If NOT RSCategorieArticoli.EOF Then
Do While NOT RSCategorieArticoli.EOF
nomeCategoria = RSCategorieArticoli("Sezione")
Dim listaCategorie, j, max, k
listaCategorie = Split (nomeCategoria, ";")
max = UBound (listaCategorie)
for j= 0 to max
k = IndiceInArray(Categorie, listaCategorie(j))
if k>-1 then
Categorie(1, k) = Categorie(1, k)+RSCategorieArticoli("Totale")
Else
Categorie(0,i) = listaCategorie(j)
Categorie(1,i) = RSCategorieArticoli("Totale")
i=i+1
End if
If i = MaxSize Then
Redim Preserve Categorie(1, MaxSize+25)
MaxSize = MaxSize + 25
End If
Next
RSCategorieArticoli.MoveNext
Loop
End If
Redim Preserve Categorie(1, i-1)
RSCategorieArticoli.Close
Call QuickSort(Categorie, 0, i-1, 0)
Set RSCategorieArticoli = Nothing
Set SQLCategorieArticoli = Nothing
Set MaxSize = Nothing
Set i = nothing
CaricaListaCategorie = Categorie
End Function
'Genera link per Categorie
Function GeneraLinkCategorie(stringaCategoria)
Dim listaCategorie
Dim risultato,i
risultato = ""
listaCategorie = Split(stringaCategoria, ";")
for i= 0 to UBound(listaCategorie)
Risultato = Risultato & "<a href='storico.asp?s="
Risultato = Risultato & Server.URLEncode(listaCategorie(i)) & "'>" & listaCategorie(i) & "</a>, "
next
Set listaCategorie = nothing
Set i = nothing
GeneraLinkCategorie = risultato
End Function Nel file inc_modulo_articoli.asp bisogna poi sostituire il loop che mostra le categorie con questo:
<%
'Visualizzo le sezioni e gli articoli in esse contenuti
Dim catArray
catArray = CaricaListaCategorie()
i=0
Dim j
i = UBound(catArray,2)
for j= 0 to i
%>
<a href="storico.asp?s=<%=Server.URLEncode(catArray(0,j))%>"><%=catArray(0,j)%></a> (<%=catArray(1,j)%>)<br />
<%
Next
%>Nei seguenti files (articolo.asp, autori.asp, classifica.asp, commenti_invio.asp, default.asp, fotografia.asp, pubblicazioni.asp, storico.asp) bisogna cambiare la riga che mostra il link alla categoria. Di solito significa cambiare questo pezzo:
<%=Pubblicato_In%> <a href="storico.asp?s=<%=Server.URLEncode(RSArticoli("Sezione"))%>"><%=RSArticoli("Sezione")%></a>,
in
<%=Pubblicato_In%> <%=GeneraLinkCategorie(RSArticoli("Sezione"))%>
(la stringa evidenziata e in grassetto potrebbe cambiare da pagina a pagina)
Infine in storico.asp bisogna cambiare
SQLArticoli = "SELECT Articoli.ID, Articoli.Sezione, Count(Commenti.ID) AS ConteggioID, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.Podcast FROM Commenti RIGHT JOIN Articoli ON Commenti.IDArticolo = Articoli.ID WHERE Articoli.Data <= '"& DataToStr(Date()) &"' AND Articoli.Sezione = '"& DoppioApice(QSSezioneStorico) &"' AND NOT Articoli.Bozza GROUP BY Articoli.ID, Articoli.Sezione, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.Podcast "
in
SQLArticoli = "SELECT Articoli.ID, Articoli.Sezione, Count(Commenti.ID) AS ConteggioID, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.Podcast FROM Commenti RIGHT JOIN Articoli ON Commenti.IDArticolo = Articoli.ID WHERE Articoli.Data <= '"& DataToStr(Date()) &"' AND ((Articoli.Sezione = '"& DoppioApice(QSSezioneStorico) &"') OR (Articoli.Sezione LIKE '"& DoppioApice(QSSezioneStorico) & ";%') OR (Articoli.Sezione LIKE '%;"& DoppioApice(QSSezioneStorico) & ";%') OR (Articoli.Sezione LIKE '%;"& DoppioApice(QSSezioneStorico) & "')) AND NOT Articoli.Bozza GROUP BY Articoli.ID, Articoli.Sezione, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.Podcast "
TO DO: In futuro c'e' da modificare ancora il file sezioni_articoli_elenco.asp per fare in modo che mostri le corrette categorie (io non uso il pop-up per niente).