Repository 32bit  Forum
Repository 64bit  Wiki

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.

Menu a tendina con PHP

Messaggioda samiel » mar ago 30, 2011 22:07

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.
samiel
Staff
Staff
 
Messaggi: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Re: Menu a tendina con PHP

Messaggioda miklos » mar ago 30, 2011 22:47

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?!?!?!
ho visto cose che voi astemi non potete immaginare
miklos
Linux 3.x
Linux 3.x
 
Messaggi: 1277
Iscritto il: lun lug 16, 2007 16:39
Località: Roma
Slackware: 14.1 64bit
Kernel: 3.16.3
Desktop: openbox 3.5.2

Re: Menu a tendina con PHP

Messaggioda samiel » mar ago 30, 2011 23:26

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: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Re: Menu a tendina con PHP

Messaggioda samiel » mer ago 31, 2011 0:05

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.
samiel
Staff
Staff
 
Messaggi: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Re: Menu a tendina con PHP

Messaggioda miklos » mer ago 31, 2011 0:15

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
ho visto cose che voi astemi non potete immaginare
miklos
Linux 3.x
Linux 3.x
 
Messaggi: 1277
Iscritto il: lun lug 16, 2007 16:39
Località: Roma
Slackware: 14.1 64bit
Kernel: 3.16.3
Desktop: openbox 3.5.2

Re: Menu a tendina con PHP

Messaggioda samiel » mer ago 31, 2011 9:47

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.
samiel
Staff
Staff
 
Messaggi: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Re: Menu a tendina con PHP

Messaggioda ccts2002 » mer ago 31, 2011 13:11

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"
?>
Avatar utente
ccts2002
Linux 2.0
Linux 2.0
 
Messaggi: 155
Iscritto il: gio nov 09, 2006 23:20
Località: milano - trieste - catania

Re: Menu a tendina con PHP

Messaggioda samiel » mer ago 31, 2011 18:44

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.
samiel
Staff
Staff
 
Messaggi: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Re: Menu a tendina con PHP

Messaggioda miklos » mer ago 31, 2011 19:11

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
ho visto cose che voi astemi non potete immaginare
miklos
Linux 3.x
Linux 3.x
 
Messaggi: 1277
Iscritto il: lun lug 16, 2007 16:39
Località: Roma
Slackware: 14.1 64bit
Kernel: 3.16.3
Desktop: openbox 3.5.2

Re: Menu a tendina con PHP

Messaggioda aschenaz » mer ago 31, 2011 20:39

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&amp;sezione=$sezione\">$sezione</a></p></li>";
  }
  echo "
  </ul>
 </li>\n";
}
?>
</ul>

Naturalmente, il menu a tendina è gestito col css...
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4437
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.24
Desktop: KDE 4.10.5

Re: Menu a tendina con PHP

Messaggioda samiel » mer ago 31, 2011 22:41

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&amp;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!
samiel
Staff
Staff
 
Messaggi: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Re: Menu a tendina con PHP

Messaggioda miklos » mer ago 31, 2011 23:51

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
ho visto cose che voi astemi non potete immaginare
miklos
Linux 3.x
Linux 3.x
 
Messaggi: 1277
Iscritto il: lun lug 16, 2007 16:39
Località: Roma
Slackware: 14.1 64bit
Kernel: 3.16.3
Desktop: openbox 3.5.2

Re: Menu a tendina con PHP

Messaggioda aschenaz » gio set 01, 2011 7:00

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&amp;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... :)
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4437
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.24
Desktop: KDE 4.10.5

Re: Menu a tendina con PHP

Messaggioda miklos » gio set 01, 2011 9:30

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
ho visto cose che voi astemi non potete immaginare
miklos
Linux 3.x
Linux 3.x
 
Messaggi: 1277
Iscritto il: lun lug 16, 2007 16:39
Località: Roma
Slackware: 14.1 64bit
Kernel: 3.16.3
Desktop: openbox 3.5.2

Re: Menu a tendina con PHP

Messaggioda samiel » gio set 01, 2011 11:25

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.
samiel
Staff
Staff
 
Messaggi: 5500
Iscritto il: ven gen 16, 2004 0:00
Località: Venezia
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti