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).