Menù dinamico con categorie e sottocategorie

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

Come dovrebbe essere il risultato finaleCon una categoria centrale senza sottocategorieCon la categoria finale senza sottocategorie
corretto.pngsbagliato-categoria centrale senza figlie.pngsbagliato1-ultima categoria vuota.png

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
 

Vale2

Utente Attivo
28 Mag 2006
446
0
0
Livorno
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.
 

Sirio

Nuovo Utente
17 Nov 2011
28
1
1
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

  • allegato.zip
    57,6 KB · Visite: 318

Vale2

Utente Attivo
28 Mag 2006
446
0
0
Livorno
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.
 

Sirio

Nuovo Utente
17 Nov 2011
28
1
1
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:

Vale2

Utente Attivo
28 Mag 2006
446
0
0
Livorno
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.
 

Sirio

Nuovo Utente
17 Nov 2011
28
1
1
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
Autore Titolo Forum Risposte Data
L Menù dinamico con diverse lingue e visualizzazione pagina corrente PHP 5
B Creare menù dinamico con AJAX e PHP PHP 4
G Menù dinamico con XML e Javascript Javascript 7
M Form con menù dinamico da database PHP 10
F menù select dinamico da db in php PHP 3
W menù dinamico HTML e CSS 3
G Elementi Menù orizzontali HTML e CSS 2
psikolele Dropdown menù HTML e CSS 2
G Menù a tendina di ricerca con query PHP 1
L Menù con switch case C/C++ 1
J Richiama descrizione da menù PHP 11
Z Menù di navigazione responsivo HTML e CSS 0
R Barra del menù principale decentrata Joomla 4
M Stringa con spazi nel menù a tendina PHP 4
A Menù a tendina collegato a database PHP 13
D Aumentare i sublevel del menù del theme Webdesign e Grafica 1
Tommy03 Contenitore non si nasconde dietro al menù HTML e CSS 1
Tommy03 Due menù nella stessa app Sviluppo app per Android 0
C [PHP] Form con Inserimento dati dalla maschera e un menù a discesa che prende i dati dal db PHP 1
C [PHP] Form inserimento più menù a discesa PHP 9
V Menù CSS da file in cartella esterna HTML e CSS 4
W [Javascript] [HTML] menù responsive fisso Javascript 2
S [PHP] menù a tendina che stampi voce scelta in precedenza PHP 1
F [HTML] Responsive menù CMS (Content Management System) 0
A [PHP] menù con links esterni PHP 6
D Come inserire opzioni menù prelevandole dal database con PHP ? PHP 12
F [HTML] li menù width HTML e CSS 3
T [Javascript] un form con select dinamica che funzioni da menù... Javascript 2
ecosito [Wordpress] La barra del menù mi nasconde la parte alta delle pagine WordPress 0
greven [WordPress] [CSS3] Inserire Hover Effect sul menù WordPress 10
F Problema hover voce di menù Javascript 2
F Nascondere menù onclick sottovoce jQuery 0
F Active menù HTML e CSS 2
A menù a tendina aiuto PHP 1
M Menù a tendina editabile HTML e CSS 0
P problema con tendina del menù, scompare sotto i contenuti HTML e CSS 7
F Link menù attivo categoria PHP 2
MarcoGrazia Breadcrumbs, menù a briciole di pane Snippet PHP 2
I nav menù HTML e CSS 13
LuigiDonato Problema Visualizzazione Menù HTML e CSS 17
C Menù scomparso WordPress 2
V Posizionare Iframe e menù a discesa HTML e CSS 1
F z-index menù HTML e CSS 4
Tommi Script per menù Javascript 16
Licantropo esportare tags e menù Joomla 0
F Menù a tendina Joomla 4
L [PHP] 3 menù Select OPTION consecutivi PHP 1
Carlito's Menù jQuery 1
E Menù da modificare HTML e CSS 2
H Menù a discesa contenente dati db, la scelta dal menù deve essere inviata in un altro db. PHP 1

Discussioni simili