Menù dinamico con categorie e sottocategorie

  • Creatore Discussione Creatore Discussione Sirio
  • Data di inizio Data di inizio

Sirio

Nuovo Utente
17 Nov 2011
28
1
1
Buona sera, sto provando a sviluppare un menù dinamico che carichi dinamicamente categorie e sottocategorie.
Per semplificare la spiegazione del problema propongo 3 immagini d'esempio e il codice....in poche parole se una categoria in posizione centrale o in ultima posizione non ha sottocategorie mi sballa la visualizzazione del menù...purtroppo non riesco a capire dov'è il problema

[table="width: 500"]
[tr]
[td]Come dovrebbe essere il risultato finale[/td]
[td]Con una categoria centrale senza sottocategorie[/td]
[td]Con la categoria finale senza sottocategorie[/td]
[/tr]
[tr]
[td] corretto.png[/td]
[td]sbagliato-categoria centrale senza figlie.png[/td]
[td]sbagliato1-ultima categoria vuota.png[/td]
[/tr]
[/table]

Codice:
<% Call CnOpen() %>
<ul class="topnav">
    <li><a href="javascript:ajaxpage('pagine/home.asp', 'content'); loadobjs('css/css_pagine.css')">Home</a></li>
    <li><a href="javascript:ajaxpage('archivio.asp', 'content'); loadobjs('css/css_pagine.css')">News</a></li>
    <li><a href="javascript:ajaxpage('pagine/stagione.asp', 'content'); loadobjs('css/css_pagine.css')">Stagione</a></li>
	<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content')">Societ&agrave;</a>
		<ul>
			<li><a href="javascript:ajaxpage('pagine/storia.asp', 'content'); loadobjs('css/css_pagine.css')">Storia</a></li>
			<li><a href="javascript:ajaxpage('pagine/statuto.asp', 'content'); loadobjs('css/css_pagine.css')">Statuto</a></li>
		</ul>
    </li>
    <% rs.Open "SELECT sez_id, sez_nome FROM sezioni", cn, 1
		If rs.EOF Then %>
	<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content')">Squadre</a></li>
		<% Else %>
    <li><a href="javascript:ajaxpage('pagine/loading.asp', 'content')">Squadre</a>
    	<ul>
            <% While rs.EOF = False 
				dim s_id
				s_id = rs("sez_id") %>
			<% dim cn1, rs1
				Set cn1 = Server.CreateObject("ADODB.Connection")
				Set rs1 = Server.CreateObject("ADODB.Recordset")
				cn1.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("/fpdb/sm-db.mdb")
			    rs1.Open "SELECT subsez_id, subsez_nome, subsez_sez FROM sub_sezioni where subsez_sez = " & s_id, cn1, 1
			    If rs1.EOF Then 
			%>
            	<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')"><%= rs("sez_nome") %></a></li>      
                <% else %>
                <li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')"><%= rs("sez_nome") %></a>
    				<ul>
        				<% While rs1.EOF = False %> 
            			<li><a href="javascript:ajaxpage('pagine/squadra.asp', 'content'); loadobjs('css/css_pagine.css')"><%= rs1("subsez_nome")%></a></li>
						<% rs1.MoveNext
                           Wend 
                 End If
                 rs1.close
                 Set rs1 = Nothing
                 cn1.Close
                 Set cn1 = Nothing
                 %>
         			</ul>   
         		</li>                       
		<% rs.MoveNext
			Wend 
		end If
		rs.Close
		Call CnClose()%>
        
        </ul>
        </li>
          
    <li><a href="javascript:ajaxpage('pagine/calendario.asp', 'content'); loadobjs('css/css_pagine.css')">Calendario gare</a></li>
    <li><a href="javascript:ajaxpage('pagine/campionati.asp', 'content'); loadobjs('css/css_pagine.css')">Campionati</a></li>
    <li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')">Comitati</a>
    	<ul>
          	<li><a href="http://www.google.it" target="_new">Link1</a></li>
            <li><a href="http://www.google.it">Link2</a></li>
            <li><a href="javascript:ajaxpage('pagine/tessile.asp', 'content'); loadobjs('css/css_pagine.css')">Link3</a></li>
        </ul>
    </li>              
    <li><a href="javascript:ajaxpage('pagine/link.asp', 'content'); loadobjs('css/css_pagine.css')">Link</a></li>
    <li><a href="javascript:ajaxpage('pagine/sponsor.asp', 'content'); loadobjs('css/css_pagine.css')">Sponsor</a></li>            
    <li><a href="javascript:ajaxpage('pagine/contatti.asp', 'content'); loadobjs('css/css_pagine.css')">Contatti</a></li>                        
</ul>

Spero di essere stato abbastanza esplicativo anche se non mi sono dilungato troppo nel spiegarlo a parole, attendo vostre delucidazioni in merito
Grazie anticipatamente

Sirio
 
Ciao,

difficile trovare il problema con le informazioni postate e basarsi solo su immagini.

Anche per la configurazione di ajaxpage e loadobjs.

Usi più di una tabella per il tuo script?

usi sempre If rs.EOF Then

if rs.EOF si usa per indicare i record non trovati o inesistenti

If rs.EOF Then

response.write"Nessun Record Trovato"

else

...........



ES:


Codice:
sql = "SELECT cosa FROM TABELLA WHERE ......."
set rs = cn.Execute(sql)
if not rs.eof then
'Contiene
else
'Non contiene
end if
set rs = nothing

dopo If rs.EOF Then la connessione al DB e il recordset devi liberare le risorse, forzare a Nothing l'oggetto serve a liberare memoria...!

if rs.eof then
set rs = nothing
set cn = nothing

Per correttezza la configurazizone di una connessione al DB apertura DB e Recordset:

Codice:
<%

Dim strDB
strDB = "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("/fpdb/sm-db.mdb")


Set cn = Server.CreateObject("ADODB.Connection")
cn.Open(strDB)

Dim Sql
Sql = "SELECT * FROM pippo where IDpippo = IDpippo"

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open Sql, strDB, 1

if rs.eof then 
set rs = nothing
set cn = nothing
	
response.write"Record Non Trovato"
Response.end
end if

do while not rs.EOF
<%

<%= rs("tuo_record") %>


....................


<% 
rs.MoveNext
loop
rs.close
%>

Posta altre info oppure allega gli script che usi compreso il Database.

Valeria.
 
Ciao, grazie per la risposta, cercherò di essere più chiaro possibile ora.
Si, per caricare il menù uso 2 tabelle "sezioni" e "sub_sezioni", la prima contenente le categorie madri e la seconda contenete le categorie figlie relazionie con chiave esterna alla categoria superiore.

Ho usa il rs.EOF per i seguenti motivi:
- il primo che si individua mi determina se NON sono presenti categorie madri, in caso affermativo mi mostra a video solamente la voce di menù "squadre" quindi senza categorie madri, altrimenti, se presenti delle categorie inizia a stamparle a video...
- il secondo rs1.eof mi verifica che la categoria madre abbia delle sottocategorie e con la stessa logica (forse errata) descritta sopra, se NON sono presenti delle sottocategorie visualizza solamente il nome della categoria madre, altrimenti mostra sia la categoria madre che le figlie.

Si probabilmente ho fatto qualche casino aprendo una nuova connessione anche xkè nel file di configurazione ho già l'apertura di una connessione che utilizzo di default:
Codice:
<%
	Option Explicit
	'On Error Resume Next
	Response.Buffer = True
	Response.Expires = 0
	
	Dim cn, rs
	
	Function CnOpen()
		Set cn = Server.CreateObject("ADODB.Connection")
		Set rs = Server.CreateObject("ADODB.Recordset")
		cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("/fpdb/sm-db.mdb")
	End Function
	
	Function CnClose()
		Set rs = Nothing
		cn.Close
		Set cn = Nothing
	End Function
%>

In allegato il materiale che potrebbe servire per un aiuto migliore.
Grazie
 

Allegati

Ciao,

visto l'utilizzo di più tabelle, per collegarle (creare una relazione, un database relazionale) si usa JOIN - INNER JOIN

tu per il menu usi due tabelle sezioni (dove si trovano le categorie nel campo sez_nome) e usi il campo sez_id (che è un campo di tipo Contatore).

E una tabella sub_sezioni dove hai un campo Contatore subsez_id, un campo subsez_nome Testo dove hai i sottomenu e un campo subsez_sez Numerico.

Le relazioni per il menu sono tra il campo sez_id (Contatore) della tabella sezioni e il Campo subsez_sez (Numerico) della tabella sub_sezioni.

Il Campo sez_id si autoincrementa di 1 ogni volta che aggiungi una categoria, mentre il Campo subsez_sez essendo Numerico deve avere lo stesso Numero di zez_id e inserito manualmente.

Se sez_id ha come numero 1 tutti i valori di subsez_sez 10 campi con valore Numerico impostato a 1 ti mostrano quello scritto in subsez_nome a-1, a-2, a-3 ecc...

Per questo senza relazioni fra le due tabelle se uno o più campi della tabella sub_sezioni (subsez_nome e subsez_sez) sono vuoti il menu sballa.

Cambia solo:

Codice:
rs1.Open "SELECT subsez_id, subsez_nome, subsez_sez FROM sub_sezioni where subsez_sez = " & s_id, cn1, 1

Con:

Codice:
rs1.Open "SELECT * FROM sub_sezioni INNER JOIN sezioni ON sub_sezioni.subsez_sez = sezioni.sez_id where sub_sezioni.subsez_sez = " & s_id, cn1, 1

il resto può andare.

Valeria.
 
ciao vale, ho provato ad apportare la tua modifica utilizzando i JOIN, ma il problema persiste...se fai una prova, se ne hai la possibilità, eliminando ad esempio la sottosezione b-1, figlia della categoria b, la categoria b viene visualizzata in elenco correttamente, quindi senza il [+] che indica la presenza di sottosezioni, ma tutto quello che viene dopo, quindi la categoria c, la voce di menù calendario, gare ecc...è come se uscissero dalla classe topnav dell'ul...

Penso che + che essere un problema di relazioni, sia un problema di apertura, chiusura <ul> e <li>, anche se riguardando il codice + e + volte mi sembra corretto.


P.s.: ma che differenza c'è tra il mio tipo di relazione e l'utilizzo del join? il risulatato alla fine è il medesimo, no?
 
Ultima modifica:
ciao vale, ho provato ad apportare la tua modifica utilizzando i JOIN, ma il problema persiste...se fai una prova, se ne hai la possibilità, eliminando ad esempio la sottosezione b-1, figlia della categoria b, la categoria b viene visualizzata in elenco correttamente, quindi senza il [+] che indica la presenza di sottosezioni, ma tutto quello che viene dopo, quindi la categoria c, la voce di menù calendario, gare ecc...è come se uscissero dalla classe topnav dell'ul...

Penso che + che essere un problema di relazioni, sia un problema di apertura, chiusura <ul> e <li>, anche se riguardando il codice + e + volte mi sembra corretto.


P.s.: ma che differenza c'è tra il mio tipo di relazione e l'utilizzo del join? il risulatato alla fine è il medesimo, no?


Ciao,

il risultato con la sequel che ho scritto è lo stesso perchè il problema è un'altro, come sai INNER JOIN si usa per creare una relazione tra due tabelle dove i campi richiesti corrispondono all'operatore inserito =. <. >. <=. >=. <>, poi ci solo altri tipi di JOIN, RIGHT JOIN, LEFT JOIN UOTER JOIN, non inoltro.

Il tuo problema sta nei tag </ul> e </li>:

Codice:
</ul>
<!-- chiusura li categoria madre -->      
</li>


dato che sono in loop (ciclo) su tutte le sottocategorie RS1 se cancelli una sottogategoria, </ul> e </li> vengono inseriti anche nella categoria che non ha una sottogategoria.

se cancelli la sottocategoria b-1 (o tuttre) ti scrive ugualmente </ul> e </li>

Esempio con la sottocategoria b-1 cancellata

Codice:
<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')">categoria-b</a></li>      
</ul>
<!-- chiusura li categoria madre -->      
</li>
<!-- apertura li categoria madre --> continua per la categoria successiva

come vedi nella categoria categoria-b dove la sottocategoria b-1 è stata eliminata i tag </ul> e </li> sono presenti, il </li> no crea problemi, ma </ul> ti chiude l'elenco puntato e tutto quello che sta sotto lo visualizza come un normale elenco puntato con i
  • Testo

Per ovviare al problema basta una if dove dichiari che se una categoria non ha sottogategorie non scrivere nulla, altrimenti se esiste scrivi i tag </ul> e </li>

Codice:
<% Call CnOpen() %>
<ul class="topnav">
    <li><a href="javascript:ajaxpage('pagine/home.asp', 'content'); loadobjs('css/css_pagine.css')">Home</a></li>
    <li><a href="javascript:ajaxpage('archivio.asp', 'content'); loadobjs('css/css_pagine.css')">News</a></li>
    <li><a href="javascript:ajaxpage('pagine/stagione.asp', 'content'); loadobjs('css/css_pagine.css')">Stagione</a></li>
	<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content')">Societ&agrave;</a>
		<ul>
			<li><a href="javascript:ajaxpage('pagine/storia.asp', 'content'); loadobjs('css/css_pagine.css')">Storia</a></li>
			<li><a href="javascript:ajaxpage('pagine/statuto.asp', 'content'); loadobjs('css/css_pagine.css')">Statuto</a></li>
		</ul>
    </li>
    <% rs.Open "SELECT sez_id, sez_nome FROM sezioni", cn, 1
		If rs.EOF Then %>
	<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content')">Squadre</a></li>
		<% Else %>
    <li><a href="javascript:ajaxpage('pagine/loading.asp', 'content')">Squadre</a>
    	<ul>
            <% While rs.EOF = False 
				dim s_id
				s_id = rs("sez_id") %>
			<% dim cn1, rs1
				Set cn1 = Server.CreateObject("ADODB.Connection")
				Set rs1 = Server.CreateObject("ADODB.Recordset")
				cn1.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("sm-db.mdb")			   
                                rs1.Open "SELECT subsez_id, subsez_nome, subsez_sez FROM sub_sezioni where subsez_sez = " & s_id, cn1, 1
			    If rs1.EOF Then 
			%>
            	<li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')"><%= rs("sez_nome") %></a></li>      
                <% else %>
                <!-- apertura li categoria madre --> 
                <li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')"><%= rs("sez_nome") %></a>
    				<ul>
        				<% While rs1.EOF = False %>
                        <!-- apertura li categoria figlia --> 
            			<li><a href="javascript:ajaxpage('pagine/squadra.asp', 'content'); loadobjs('css/css_pagine.css')"><%= rs1("subsez_nome")%></a></li>
						<% rs1.MoveNext
if not rs1.EOF then
response.write("")
else
response.write"</ul></li>"
end if                        

                        Wend 
                 End If
                 rs1.close
                 Set rs1 = Nothing
                 cn1.Close
                 Set cn1 = Nothing
                 %>
         			<!--</ul>-->
                         <!-- chiusura li categoria madre -->      
         		        <!--</li> -->                      
		<% 
                rs.MoveNext
			Wend 
		end If
		rs.Close
		Call CnClose()%>
        
        </ul>
        </li>
          
    <li><a href="javascript:ajaxpage('pagine/calendario.asp', 'content'); loadobjs('css/css_pagine.css')">Calendario gare</a></li>
    <li><a href="javascript:ajaxpage('pagine/campionati.asp', 'content'); loadobjs('css/css_pagine.css')">Campionati</a></li>
    <li><a href="javascript:ajaxpage('pagine/loading.asp', 'content'); loadobjs('css/css_pagine.css')">Comitati</a>
    	<ul>
          	<li><a href="http://www.google.it" target="_new">Link1</a></li>
            <li><a href="http://www.google.it">Link2</a></li>
            <li><a href="javascript:ajaxpage('pagine/tessile.asp', 'content'); loadobjs('css/css_pagine.css')">Link3</a></li>
        </ul>
    </li>              
    <li><a href="javascript:ajaxpage('pagine/link.asp', 'content'); loadobjs('css/css_pagine.css')">Link</a></li>
    <li><a href="javascript:ajaxpage('pagine/sponsor.asp', 'content'); loadobjs('css/css_pagine.css')">Sponsor</a></li>            
    <li><a href="javascript:ajaxpage('pagine/contatti.asp', 'content'); loadobjs('css/css_pagine.css')">Contatti</a></li>                        
</ul>


Valeria.
 
Ciao Valeria, devo dire che funziona alla perfezione con l'aggiunta di quel controllo da te suggerito, non l'avevo valutato quell'if.

Ringrazio sia te che paolo per l'aiuto datomi, a buon rendere, se possibile :fonzie:
 

Discussioni simili