Tagging multiplo in DBLOG

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%>&nbsp;<a href="storico.asp?s=<%=Server.URLEncode(RSArticoli("Sezione"))%>"><%=RSArticoli("Sezione")%></a>, 

in

<%=Pubblicato_In%>&nbsp;<%=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).