Menu a tendina con PHP

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Menu a tendina con PHP

Messaggio da samiel »

Vorrei creare un menu a tendina ricorrendo solo ai CSS.
Per impostare il menu orizzontale sono partito dal codice
di un menu le cuivoci apribano i sottomenu:

Codice: Seleziona tutto

<div id="navlist_wrapper">
<div id="navlist">
<ul>
<?php 	// creo i titoli lunghi del menu orizzontale
$barmenu=array("home"=>"Home","chisiamo"=>"Chi siamo","attività"=>"Attività",
"pensiero"=>"amici","Amici"=>"Opere","link"=>"Link","blog"=>"Blog","contatti"=>"Contatti");
foreach($barmenu as $vocemenu=>$valore) {
echo '<li>' . "| ";
if ( ( $sezione || $sottosezione ) && ( $vocemenu == $pagina ) ) {
$addstyle = "style='color:#AFAFAF; font-weight:none; text-decoration:none;'"; 		
} else
{ 		$addstyle = ""; 		}
if ($vocemenu == "home" ) {
echo "<a href=\".\" $addstyle>";
} else
{
echo "<a href=\"index.php?pagina=$vocemenu\" $addstyle>";
}
echo $valore;
echo '</a></li>'."\n";
}
?>
</ul>
</div><!--navlist-->
</div><!--navlist_wrapper--> </div><!--header-->
Ipotizziamo che il menu "Chi siamo" debba mostrare delle sottovoci
quando ci passa sopra il mouse (nel CSS ricorro a un effetto hover).
Riporto li codice HTML:

Codice: Seleziona tutto

<div id="hormenu">
<!-- Div che contiene il menu --> <ul>
<!-- Lista principale: definisce il menu nella sua interezza --> <li><a href="#">Menu 1</a>
<!-- Primo list-item, prima voce del menu --> <ul>
<!-- Lista annidata: voci del sotto-menu -->
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a>
</li> <li><a href="#">Submenu 1</a></li> </ul> <!-- Fine del sotto-menu -->
</li> <!-- Chiudo il list-item -->
<li><a href="#">Menu 2</a>
<!-- Primo list-item, prima voce del menu --> <ul>
<!-- Lista annidata: voci del sotto-menu --> <li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
</ul> <!-- Fine del sotto-menu -->
</li> <!-- Chiudo il list-item --> </div>
Come posso dire a PHP di recuperare i submenu?

Grazie
M.

ilmich
Master
Master
Messaggi: 1645
Iscritto il: lun 16 lug 2007, 17:39
Slackware: 15.0 64bit
Kernel: 5.15.27
Desktop: kde
Località: Roma

Re: Menu a tendina con PHP

Messaggio da ilmich »

prima di darti una risposta vorrei vedere se ho capito bene la domanda :)
samiel ha scritto:Per impostare il menu orizzontale sono partito dal codice
di un menu le cuivoci apribano i sottomenu:
il codice php che hai postato ad occhio mi pare crei un menu senza sottovoci(quindi un po' la tua affermazione mi confonde.. hai modificato il codice di partenza?!?!?!)
samiel ha scritto:Come posso dire a PHP di recuperare i submenu?
le voci di menu come sono memorizzate!?!?!? in un array come nell'esempio che hai postato?!?!?!
#LiveSimple and #ProgramThings
https://github.com/ilmich
http://ilmich6502.it/

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Menu a tendina con PHP

Messaggio da samiel »

Sì, quel codice crea solo il menu orizzontale principale.
VOrrei che, passando il mouse su ogni voce di menu,
si generassero i sottomenu con effetti a tendina.
Questa soluzione è efficace e semplice perché
non ricorre a java, ma solo al CSS.
Il codice HTML è questo:

Codice: Seleziona tutto

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it">
<head>
<title><?php echo $titles["$pagina"] ?></title>
<meta name="generator" content="Quanta Plus" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="layout.css" />
</head>

<body>

<div id="hormenu"> <!-- Div che contiene il menu -->
<ul> <!-- Lista principale: definisce il menu nella sua interezza -->
<li><a href="#">Menu 1</a> <!-- Primo list-item, prima voce del menu -->
<ul> <!-- Lista annidata: voci del sotto-menu -->
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 1</a></li>
</ul> <!-- Fine del sotto-menu -->
</li> <!-- Chiudo il list-item -->
<li><a href="#">Menu 2</a> <!-- Primo list-item, prima voce del menu -->
<ul> <!-- Lista annidata: voci del sotto-menu -->
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 2</a></li>
</ul> <!-- Fine del sotto-menu -->
</li> <!-- Chiudo il list-item -->
</div>

</body>
</html>
e il CSS questo:

Codice: Seleziona tutto

div#hormenu {
width: 100%;
float: left;
margin: 0;
padding: 0;
border-top: 1px solid black;
background: red;
}

div#hormenu ul {
margin: 0;
padding: 0;
list-style-type: none;
}

div#hormenu li {
width:100px;
float:left;
margin: 0;
padding: 0;
border-right: 1px solid black;
color:black;
}

div#hormenu a {
display: block;
padding: 5px;
color: #000;
text-decoration: none;
}
div#hormenu a:hover {
background-color: #000033;
color: #FFFFFF;
text-decoration: none;
}

div#hormenu li ul {display: none}

div#hormenu li:hover ul {
display: block;
position: absolute;
z-index:1;
width:150px;
padding: 0;
margin: 0 0 0 -1px;
border:1px solid black;
background: white;
}

div#hormenu li li {border: none; width: 150px;}
div#hormenu li li a {padding: 2px 2px 2px 10px;}
Il mio problema è come generare i sottomenu...

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Menu a tendina con PHP

Messaggio da samiel »

Mi sa che ho complicato inutilmente,
perché in effetti non mi serve che le voci del menu orizzontale
generino un menusinistro le cui voci generalo a loro volta,
quado selezionate, un menu destro. Mi basta che, passando
il mouse su una voce del menu orizzontale, questa apra
il sottomenu a tendina. Ho del codice che genera
un solo menu verticale, e mi basterebe che tale menu
fosse invece trasformato nelle sottovoci del menu a tendina

Codice: Seleziona tutto

<div id="container">
<div id="header">
<h1>Circolo Culturaleh1>
<h2>Venezia</h2>
<div id="navlist_wrapper">
<div id="hormenu">
<ul>
<?php
isset($_REQUEST["pagina"]) ? $pagina=$_REQUEST["pagina"] : $pagina="home";
$submenu=array("etica"=>array("etica"=>"Bioetica
cattolica","recensione01"=>"Gianni Vattimo","recensione02"=>"Vittorio
Possenti"),
"laicita"=>array("laicita"=>"Laicit&agrave; debole", "recensione_a"=>"Gian
Enrico Rusconi<br />(La Stampa)","recensione_b"=>"Elisabetta Ambrosi<br />(La
Repubblica)"),
"news"=>array("news"=>"News")
);
$activemenu=0;
$folder="home";
foreach($submenu as $kmenu=>$vmenu) {
if(array_key_exists($pagina,$vmenu) | $pagina==$kmenu) {
$activemenu=$submenu[$kmenu];
$folder=$kmenu;
}
}
$vocimenu=array("home"=>"Home","etica"=>"Bioetica
cattolica","laicita"=>"Laicit&agrave; debole","news"=>"News");
foreach($vocimenu as $voce=>$vocevisualizzata) {
echo "
<li>";
if($pagina!=$voce) {
echo $voce=="home" ? '<a href=".">' : '<a
href="index.php?pagina='.$voce.'">';
}
echo $vocevisualizzata;
if($pagina!=$voce) echo "</a>";
echo "</li>";
}
echo "\n";
?>
</ul>
</div><!--hormenu-->
</div><!--navlist_wrapper-->
</div><!--header-->
<?php
if($pagina!="home") include("moduli/submenu.php");
?>
<?php
if(file_exists("$folder/$pagina.php")) include("$folder/$pagina.php");
else include("moduli/nondisp.php");
?>
</div><!--container-->
M.

ilmich
Master
Master
Messaggi: 1645
Iscritto il: lun 16 lug 2007, 17:39
Slackware: 15.0 64bit
Kernel: 5.15.27
Desktop: kde
Località: Roma

Re: Menu a tendina con PHP

Messaggio da ilmich »

partendo dal presupposto che il menu ti serve a 2 livelli e non di più, la soluzione più semplice e efficiente per me è questa (ti posto la logica di generazione del menu, senza codice html insomma)

Codice: Seleziona tutto

        $menus = array('main_menu' => array('home' => 'Home',
										'chisiamo' => 'Chi Siamo'),
				   'chisiamo_menu' => array('subLink1' => 'SubLink 1',
											'subLink2' => 'SubLink 2')
				);
				
	foreach ($menus['main_menu'] as $key => $menu) { //scorri il menu principale
		echo $menu."<br>"; //mostra menu
		if (isset($menus[$key."_menu"])) //se esiste una chiave formata da nomevoceprincipale_menu allora esiste un submenu
			foreach ($menus[$key."_menu"] as $subKey => $submenu) { //scorri subito il submenu
				echo '-->'.$submenu."<br>"; //mostra submenu
			}
	}
l'output che ho ottenuto lanciando questo script banale è

Codice: Seleziona tutto

Home
Chi Siamo
-->SubLink 1
-->SubLink 2
credo che sia più o meno quello che vuoi ottenere tu :D
#LiveSimple and #ProgramThings
https://github.com/ilmich
http://ilmich6502.it/

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Menu a tendina con PHP

Messaggio da samiel »

L'HTML e il CSS li sistemo io, è il codice PHP il problema.
Ma questo codice:

Codice: Seleziona tutto

<div id="header">
<h1>Circolo Culturale <br />
WALTER TOBAGI</h1>
<h2>Venezia-Mestre</h2>
<div id="navlist_wrapper">
<div id="hormenu">
<ul>
<?php
$menus = array('main_menu' => array('home' => 'Home',
'chisiamo' => 'Chi Siamo'),
'chisiamo_menu' => array('subLink1' => 'SubLink 1',
'subLink2' => 'SubLink 2')
);
foreach ($menus['main_menu'] as $key => $menu) { //scorri il menu principale
echo $menu."<br>"; //mostra menu
if (isset($menus[$key."_menu"])) //se esiste una chiave formata
// da nomevoceprincipale_menu allora esiste un submenu
foreach ($menus[$key."_menu"] as $subKey => $submenu) { //scorri il submenu
echo '-->'.$submenu."<br>"; //mostra submenu
}
?>
</ul>
</div><!--hormenu-->
</div><!--navlist_wrapper-->
</div><!--header-->
<?php
if($pagina!="home") include("moduli/submenu.php");
?>

<?php
if(file_exists("$folder/$pagina.php")) include("$folder/$pagina.php");
else include("moduli/nondisp.php");
?>
</div><!--container-->
non mi funziona ... Dov'è l'inghippo che non vedo?

Grazie!
M.

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Re: Menu a tendina con PHP

Messaggio da ccts2002 »

mi sembra manchi una parentesi alla fine.
a me il codice di seguito funziona.

Codice: Seleziona tutto

<?php
$menus = array('main_menu' => array('home' => 'Home',
 'chisiamo' => 'Chi Siamo'),
 'chisiamo_menu' => array('subLink1' => 'SubLink 1',
 'subLink2' => 'SubLink 2')
);
echo "<ul> <!-- Lista principale: definisce il menu nella sua interezza -->\n";
foreach ($menus['main_menu'] as $key => $menu) { //scorri il menu principale
 echo "<li><a href=\"#\">".$menu."</a> <!-- Primo list-item, prima voce del menu -->\n"; //mostra menu
 if (isset($menus[$key."_menu"])) {//se esiste una chiave formata
  // da nomevoceprincipale_menu allora esiste un submenu
  echo "<ul> <!-- Lista annidata: voci del sotto-menu -->\n";
  foreach ($menus[$key."_menu"] as $subKey => $submenu) { //scorri il submenu
   echo "<li><a href=\"#\">".$submenu."</a></li>\n"; //mostra submenu
  }
  echo "</ul> <!-- Fine del sotto-menu -->\n";
 }
 echo "</li> <!-- Chiudo il list-item -->\n";
}
echo "</ul><!-- finisce il menu-->\n"
?>

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Menu a tendina con PHP

Messaggio da samiel »

Ci siamo quasi! Ecco il codice PHP

Codice: Seleziona tutto

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it">

<head>
<meta name="generator" content="Quanta Plus" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="<?php echo ($descriptions["$pagina"]) ?>" />
<meta name="keywords" content="<?php echo $keywords["$pagina"] ?>" />
<meta name="robots" content="index,follow" />
<meta name="author" content="mauro sacchetto" />
<meta name="reply-to" content="mauro.sacchetto@gmail.com" />
<link rel="stylesheet" type="text/css" href="stylesheets/layout.css" />
<script src="stylesheets/blank.js" type="text/javascript"></script>
<meta name="verify-v1" content="t/mCgRFHARQ75XFphfZRhlqYGIG5P+eRXDkpiROIH6s=" />
</head>

<body>
<div id="container">

<div id="header">
<h1>Circolo Culturale <br />
WALTER TOBAGI</h1>
<h2>Venezia-Mestre</h2>
<div id="navlist_wrapper">
<div id="hormenu">
<ul>
<?php
$menus = array('main_menu' => array('home' => 'Home',
'chisiamo' => 'Chi Siamo'),
'chisiamo_menu' => array('chisiamo' => 'Chi siamo',
'dovesiamo' => 'Dove siamo')
);
echo "<ul> \n";
foreach ($menus['main_menu'] as $key => $menu)
{
echo "<li><a href=\"#\">".$menu."</a> \n";
if (isset($menus[$key."_menu"]))
{
echo "<ul> \n";
foreach ($menus[$key."_menu"] as $subKey => $submenu)
{
 echo "<li><a href=\"#\">".$submenu."</a></li>\n";
}
echo "</ul> \n";
}
echo "</li> \n";
}
echo "</ul> \n"
?>
</ul>
</div><!--navlist_wrapper-->
</div><!--hormenu-->
</div><!--header-->

<?php
if(file_exists("$folder/$pagina.php")) include("$folder/$pagina.php");
else include("moduli/nondisp.php");
?>

<div id="footer">
<?php
print ($pagina == "home") ?
"<img id=\"piclog1\" src=\"pics/valid_xhtml11.png\" alt=\"Valid XHTML 1.1\"
title=\"Logo W3C Valid XHTML 1.1\" />
<img id=\"piclog3\" src=\"pics/php5-power-micro.png\" alt=\"Logo Powered by
PHP5\" title=\"Logo Powered by PHP5\" />
<img id=\"piclog2\" src=\"pics/valid_css2.png\" alt=\"Valid CSS2\"
title=\"Logo W3C Valid CSS2\" />
<p>&copy; Circolo Culturale Walter Tobagi - 2011</p>" : "<p>&copy; Circolo
Culturale Walter Tobagi - 2011</p>";
?>
</div><!--footer-->
</div><!--container-->
</body>
</html>
e il relativo CSS:

Codice: Seleziona tutto

/*stili per il layout fluido*/
html{margin:0; padding:0; background-color:black}
body{margin:0px 190px; padding:0; font-family:Verdana,Tahoma,Arial,sans-serif;
color:#FF9900}
#container{position:relative; width:100%; margin:0 auto; text-align:left}

/*stili su header*/
#header{margin:0 auto; padding:0; text-align:left}

/*stili specifici per il layout*/
#leftmenu{float:left; width:120px; margin-left:8px; padding:5px 15px 0 15px;
border: 1px solid #969696; border-top:25px solid #3485B4}
#rightmenu{float:right; width:120px; margin-right:8px;
padding:5px 15px 0 15px; line-height:1.2; border: 1px solid #969696;
border-top:25px solid #3485B4}
#wrapper{padding:0}
#content{padding:15px 5px 40px; color:#FF9900; background-color:black}

/*stili su footer*/
#footer {clear:both; height:60px; padding:0; text-align:center;
color:#FF9900; background-color:black; position:relative;
font-family:Verdana,Verdana,Arial,sans-serif;
font-size:80%}

/*stili per la sezione navlist*/
#navlist_wrapper {width:100%; height:60px; margin:0}
#navlist{padding:0; margin:0; font-weight:bold}
#navlist ul{color:white; list-style:none; margin:auto; padding:0; text-align:left}
#navlist li{list-style:none; margin:0 auto; display:inline; color:#FF9900; background-color:black}
#navlist li a{margin:0; border-bottom:none; color:#FF9900; text-decoration:none}
#navlist li a:hover{text-decoration:underline}

/*stili per la sezione rightmenu*/
#rightmenu ul{margin:0; padding:0; list-style-type:none}
#rightmenu li{font-size:80%; color:#060E9B; font-weight:bold; margin:0; padding:20px 0}
#rightmenu a{color:#060E9B; font-weight:normal; text-decoration:none}
#rightmenu a:hover{color:#060E9B; text-decoration:underline}

/*stili per la sezione leftmenu*/
#leftmenu ul{margin:0; padding:0; list-style-type:none}
#leftmenu li{font-size:80%; color:#060E9B; font-weight:bold; margin:0; padding:20px 0}
#leftmenu a{color:#060E9B; font-weight:normal; text-decoration:none}
#leftmenu a:hover{color:#060E9B; text-decoration:underline}

/*stili speciali caratteri*/
.bold{font-weight:bold}
.italic{font-style:italic}
.apice {vertical-align:super; font-size:55%}
.evid{color:#D32C20; font-weight:bold}

/*stili speciali testo*/
.superscript{padding-bottom:1.2em; font-size:75%; color:white}
.bord{border:2px solid #000080; margin-bottom:20px; padding:10px; color:black; background-color:#C1C1C1; font-size:0.8em}
.bord2{border:2px solid #000080; margin-bottom:20px; padding:10px; color:black; background-color:#C1C1C1; font-size:0.8em}
.double{font-style:italic; border-top:double #1E247C; border-bottom:double #1E247C}
#header h3{padding-bottom:1.5em}
.note p{font-size:70%}
img{border:0}
.bord ol li{font-weight:bold}
.bord ol ol li{font-weight:normal}
h2{line-height:1.1em}
.emph{line-height:1.5; padding:5px 0 10px; font-weight:bold; color:white; background-color:#021394; text-align:right}
p.emph{padding-right:2.5em}

/*stili speciali tabelle*/
table,td,th{margin-bottom:30px; border:0; border-collapse:collapse}
td,th{padding:5px 10px}

/*stili speciali immagini*/
.picleft{float:left; text-align:right; padding:0 1em 0 0}
.picright{float:right; text-align:right; padding:0.8em 0 0 0.8em}
#piclog1{position:absolute; top:90px; right:290px}
#piclog2{position:absolute; top:90px; right:200px}
#piclog3{position:absolute; top:90px; right:110px}





div#hormenu {
width: 100%;
float: left;
margin: 0;
padding: 0;
border-top: 1px solid black;
background: red;
}

div#hormenu ul {
margin: 0;
padding: 0;
list-style-type: none;
}

div#hormenu li {
width:100px;
float:left;
margin: 0;
padding: 0;
border-right: 1px solid black;
color:black;
}

div#hormenu a {
display: block;
padding: 5px;
color: #000;
text-decoration: none;
}
div#hormenu a:hover {
background-color: #000033;
color: #FFFFFF;
text-decoration: none;
}

div#hormenu li ul {display: none}

div#hormenu li:hover ul {
display: block;
position: absolute;
z-index:1;
width:150px;
padding: 0;
margin: 0 0 0 -1px;
border:1px solid black;
background: white;
}

div#hormenu li li {border: none; width: 150px;}
div#hormenu li li a {padding: 2px 2px 2px 10px;}
I vari file sono distribuiti in subdirectory, ad ec
nella subdir "chisiamo" ci sono "chisiamo.php" e "dovesiamo.php".
Solo che il menu adesso appare come desiderato,
ma non mi apre alcuna pagina... Il problema
dev'essere il richiamo sbagliato in

Codice: Seleziona tutto

<?php
if(file_exists("$folder/$pagina.php")) include("$folder/$pagina.php");
else include("moduli/nondisp.php");
?>
M.

ilmich
Master
Master
Messaggi: 1645
Iscritto il: lun 16 lug 2007, 17:39
Slackware: 15.0 64bit
Kernel: 5.15.27
Desktop: kde
Località: Roma

Re: Menu a tendina con PHP

Messaggio da ilmich »

Codice: Seleziona tutto

echo "<li><a href=\"#\">".$submenu."</a></li>\n";
credo che tu debba correggere il link col giusto href
Offtopic: mi permetto di suggerirti, dato che ho visto come stai sviluppando il sito http://staceyapp.com/, in pratica un cms leggerissimo dove le pagine sono file di testo semplici.. io lo uso per siti dove la parte dinamica è irrisoria
#LiveSimple and #ProgramThings
https://github.com/ilmich
http://ilmich6502.it/

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: Menu a tendina con PHP

Messaggio da aschenaz »

Ciao Mauro.

Non so se ho capito bene. Io, in un caso analogo, ho usato questo semplice codice:

Codice: Seleziona tutto

<ul id="menuatendina">
<?php
$pagine=array(
 "pagina1"=>array("pagina1-1","pagina1-2"),
 "pagina2"=>array("pagina2-1","pagina2-2","pagina2-3"),
 "pagina3"=>array("pagina3-1")
);
foreach($pagine as $pagina=>$sezioni) {
 echo "
 <li id=\"$pagina\"><a href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$pagina</a>
  <ul>";
 foreach($sezioni as $sezione) {
  echo "
   <li><p><a href=\"index.php?pagina=$pagina&sezione=$sezione\">$sezione</a></p></li>";
  }
  echo "
  </ul>
 </li>\n";
}
?>
</ul>
Naturalmente, il menu a tendina è gestito col css...

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Menu a tendina con PHP

Messaggio da samiel »

Ciao ANtonino,quanto tempo! Tutto bene?
Cme ho provato a utilizzare il codice in questo modo:

Codice: Seleziona tutto

<div id="hormenu_wrapper">
<div id="hormenu">
<ul id="hormenu">
<?php
$pagine=array(
"home"=>array(""),
"chi"=>array("chisiamo"=>"Chi siamo","dovesiamo"=>"Dove siamo"),
"cosa"=>array("attivita"=>"Attività")
);
foreach($pagine as $pagina=>$sezioni) {
echo "
<li id=\"$pagina\"><a
href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$pagina</a>
  <ul>";
foreach($sezioni as $sezione) {
  echo "
   <li><p><a
href=\"index.php?pagina=$pagina&sezione=$sezione\">$sezione</a></p></li>";
  }
  echo "
  </ul>
</li>\n";
}
?>
</ul>
</div><!--navlist-->
</div><!--navlist_wrapper-->
</div><!--header-->

<!--includo le pagine-->
<div id="content">
<?php
$includepath="$pagina/$sezione.php";
if(file_exists($includepath)) include($includepath);
else @include("moduli/nondisp.php");
?>
ma non inserisce in ogni caso le pagine...
Inoltre, la voce home del menu orizzontale principale
non dovrebbe presentare nessuna tendina (l'attuale
risulta in ogni caso ovviamente vuota...)

Grazie
M.

PS @ miklos
Grazie della segnalazione, domani ci do un'occhiata!

ilmich
Master
Master
Messaggi: 1645
Iscritto il: lun 16 lug 2007, 17:39
Slackware: 15.0 64bit
Kernel: 5.15.27
Desktop: kde
Località: Roma

Re: Menu a tendina con PHP

Messaggio da ilmich »

l'algoritmo mio e quello di aschenaz sono simili in quanto entrambi si basano su due cicli for annidati.
le uniche due differenze sono l'organizzazione dell'array multidimensionale e il fatto che il mio algoritmo testa l'esistenza di una chiave con le sottovoci (in quello di aschenaz manca il controllo di array vuoto).
per questo ti ritrovi che la voce principale ti mostra una tendina vuota.
comunque se ti posso dare un consiglio, per una migliore leggibilità e manutenzione del codice dividi le righe php dal codice html.
qualcosa tipo

Codice: Seleziona tutto

<?php foreach($pagine as $pagina=>$sezioni) { ?>
<li id='<?php echo $pagina; ?>'>
        <a href='index.php?pagina=<?php echo $pagina; ?>'>
              <span>&nbsp;</span><?php echo $pagina; ?>
        </a>
<ul>
<?php ?>
per quanto riguarda il caricamento delle pagine, il tuo problema può dipendere dal fatto che, a meno che non hai un php con il flag register_globals a on(cosa sconsigliabile e comunque deprecata nelle nuove versioni) per accedere ai parametri che passi via url devi pescare i valori dall'array globale $_GET.
in altre parole, se io ho una url così composta

Codice: Seleziona tutto

pagina.php?pagina=chisiamo
per recuperare il parametro pagina devo usare il codice

Codice: Seleziona tutto

$pagina = $_GET['pagina'];
questo codice nel tuo script non l'ho visto, ma hai postato solo dei pezzi, quindi magari non lo vedo per questo motivo
#LiveSimple and #ProgramThings
https://github.com/ilmich
http://ilmich6502.it/

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: Menu a tendina con PHP

Messaggio da aschenaz »

Scusa miklos, in effetti non è che avessi letto tutto il thread (andavo un po'
di fretta). Il codice che ho postato è volutamente semplice: è però aperto
ad ogni eventuale implementazione.

@ Mauro

Tutto ok, grazie, e tu?

Per quanto riguarda le voci senza tendina, puoi inserirle direttamente nel
codice html, senza scomodare php. Ad esempio:

Codice: Seleziona tutto

<ul id="hormenu">
  <li id="home"><a href="index.php"></li>
<?php //etc. ?>
  <li id="contatti"><a href="index.php?pagina=contatti"></li>
</ul>
Inoltre, se tu negli array delle sottopagine inserisci coppie chiave=>valore (per
differenziare i nomi), nel foreach devi richiamarle così:

Codice: Seleziona tutto

<?php
//...
 foreach($sezioni as $chiavesezione=>$nomesezione) {
  echo "
   <li><p><a
href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
 }
//...
?>
Per il resto, come ti ha detto miklos, in testa alla pagina devi verificare se è
settata la variabile globale di pagina e quindi richiamarla. Io, in genere, faccio così:

Codice: Seleziona tutto

<?php
isset($_GET["pagina"]) ? $pag=$_GET["pagina"] : $pag="home";
// poi, al momento opportuno
if(file_exists("percorso/$pag")) include("percorso/$pag");
?>
Il controllo sulle sezioni, secondo me, conviene farlo all'interno delle singole pagine,
così da settare per ognuna un'eventuale sezione di default.

Come al solito, io vado sul minimale... :)

ilmich
Master
Master
Messaggi: 1645
Iscritto il: lun 16 lug 2007, 17:39
Slackware: 15.0 64bit
Kernel: 5.15.27
Desktop: kde
Località: Roma

Re: Menu a tendina con PHP

Messaggio da ilmich »

aschenaz ha scritto:Scusa miklos, in effetti non è che avessi letto tutto il thread (andavo un po'
di fretta). Il codice che ho postato è volutamente semplice: è però aperto
ad ogni eventuale implementazione.
figurati :D

una cosa che mi sono scordato di aggiungere ieri è di fare molta attenzione ai parametri che si prendono in input.
per esempio, visto come viene usato il parametro pagina un malintenzionato con una url del tipo

Codice: Seleziona tutto

index.php?pagina=../../../etc/passwd
potrebbe tranquillamente recuperare qualunque file.
perciò bisogna come minimo scrivere una cosa del genere

Codice: Seleziona tutto

$pagina = stripslashes($_GET['pagina'])
che elimina gli slashes e, per esempio, la url maligna di poco fa non ha più il suo effetto.
anche per questo ti ho consigliato quell'applicazione php, perchè è un cms per nerd, in quanto non ha interfaccia di amministrazione e le pagine si creano tramite editor testuale(più o meno come stai facendo tu), è scritto in 600linee di codice, ha funzionalità di caching e templating, ma soprattutto è ben testato e non 'soffre' di questo tipo di distrazioni :D
#LiveSimple and #ProgramThings
https://github.com/ilmich
http://ilmich6502.it/

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Menu a tendina con PHP

Messaggio da samiel »

Grazie moltissime a entrambi.
Andiamo per gradi, Considero prima il codice di miklos.

Codice: Seleziona tutto

<body>
<div id="container">
<div id="wrapper">
<div id="header">
<h1>Circolo Culturale</h1>

<div id="navlist_wrapper">
<div id="navlist">
<?php
$menus = array('main_menu' => array('home' => 'Home',
                              'chisiamo' => 'Chi Siamo'),
               'chisiamo_menu' => array('subLink1' => 'SubLink 1',
                                 'subLink2' => 'SubLink 2')
            );
   foreach ($menus['main_menu'] as $key => $menu) {
      echo $menu."<br>"; //mostra menu
      if (isset($menus[$key."_menu"]))
         foreach ($menus[$key."_menu"] as $subKey => $submenu) {
            echo '-->'.$submenu."<br>";
         }
   }
?>
</div><!--navlist-->
</div><!--navlist_wrapper-->
</div><!--header-->

<!--includo le pagine-->
<div id="content">
<?php
$includepath="$pagina/$sezione.php";
if(file_exists($includepath)) include($includepath);
else @include("moduli/nondisp.php");
?>
</div><!--content-->
Ho messo l'include, ma ci sono errori e omissioni, I suppose...

M.

Rispondi