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

Re: Menu a tendina con PHP

Messaggio da samiel »

Mmmmm... Altre due cose, una "teorica" e una pratica
(l'appetito vien mangiando).

1.
Perché i controlli sull'esistenza delle pagine come
isset($_GET["pagina"]) ? $pag=$_GET["pagina"] : $pag="home";
vanno posti proprio in testa alla pagina, cioè anche sopra la dichiarazione
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
e sopra lo head, e non in apertura del body del documento?

2.
Poiché il codice inizia con

Codice: Seleziona tutto

<ul id="hormenu">
<?php
$pagine=array(
    "home"=>array(),
    "chi"=>array("chisiamo"=>"Chi siamo","dovesiamo"=>"Dove siamo"),
    "cosa"=>array("attivita"=>"Attivit&agrave;")
    );
se volessi attribuire titoli più leggibili anche alle voci principali,
ad es non "cosa", ma "Che cosa facciamo", posso lavorare
all'interno dello stesso array o devo aggiungere altro codice
e sconvolgere tutto (vi prego, ditemi di nooooo)?

M.

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 »

1. Non è obbligatorio porli all'inizio della pagina, ma sicuramente prima di una
qualsiasi invocazione di una delle variabili. Io in genere li metto in testa per
non sbagliare...

2. L'array delle pagine, come valore, è già "occupato" dall'array delle sezioni;
allora, per assegnare un nome più leggibile alle pagine, puoi dichiarare un
ulteriore array per i nomi:
$nomepagina=array("home"=>"Home","chi"=>"Chi siamo","cosa"=>"Cosa facciamo");
Poi, all'interno del foreach del menu...

Codice: Seleziona tutto

<li id=\"$pagina\"><a href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$nomepagina[$pagina]</a>";
Se, invece, devi visualizzare il nome al di fuori del menu, userai $nomepagina[$pag]...

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 »

samiel ha scritto:1.
Perché i controlli sull'esistenza delle pagine come
isset($_GET["pagina"]) ? $pag=$_GET["pagina"] : $pag="home";
vanno posti proprio in testa alla pagina, cioè anche sopra la dichiarazione
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
e sopra lo head, e non in apertura del body del documento?
non vi è nessun motivo tecnico, il codice php lo puoi mettere dove ti pare.
è buona regola però cercare di evitare il più possibile di mischiare codice php con codice html (come hai potuto constatare tu stesso è facile dimenticare punti e virgola e chiusure di parentesi).

per il punto due mi sa che devi rimettere mano al codice, la mia soluzione era ottimale in questo senso (tonnellate di siti alle spalle ;) )
#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, adesso vedo di sistemare questa "versione aschkenaz".
Poi, se miklos ha un po' di tempo da perdere, vedo di fare
la stessa cosa col suo codice, così poi tento di studiarli entrambi

Intanto grazie mille ancora
M.

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 »

Il codice di miklos è ottimo: in effetti, è una via più elegante per raggiungere lo
stesso scopo. Io, come al solito, cerco di raggiungere il risultato col minimo sforzo,
ma spesso, poi, mi rendo conto che sarebbe meglio perderlo prima un po' di tempo... :)

Comunque, una cosa che sento spesso consigliare è quella di tenere separati i codici
tra (x)html e php. È certamente preferibile, ma, se si pone un po' d'attenzione, anche
se mescolato, il tutto funziona lo stesso alla meraviglia. Ho diversi siti che sono
online da 7/8 anni e non hanno mai sofferto di problemi di sorta... Una cosa, invece,
che mi sono sempre domandato e se siano proficue tutte quelle "entrate e uscite " da
php, che si hanno necessariamente tenendo separati i codici...

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 »

I due array sarebbero

Codice: Seleziona tutto

// creo i nomi lunghi del menu principale
$vocimenu=array("home"=>"Home","chi"=>"Chi siamo","cosa"=>"Cosa facciamo");
foreach($vocimenu as $voce) {
  echo "
  <li>";
  if($pagina!=$voce) echo '<a href="index.php?pagina='.$voce.'">';
  echo $voce;
  if($pagina!=$voce) echo "</a>";
  echo "</li>";
}
echo "\n";

// creo il menu
$pagine=array(
    "home"=>array(),
    "chi"=>array("chisiamo"=>"Chi siamo","dovesiamo"=>"Dove siamo"),
    "cosa"=>array("attivita"=>"Attivit&agrave;")
    );
foreach($pagine as $pagina=>$sezioni) {
echo "
<li id=\"$pagina\"><a
href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$pagina</a>";
if( count($sezioni) ) {
echo "<ul>\n";
foreach($sezioni as $chiavesezione=>$nomesezione) {
echo "
<li><p><a
href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
}
echo "
</ul>";
}}
Ma per non avere i menu doppi e integrare il primo con le voci "leggibili"
devo cambiare le variabili nel secondo o modificare tutto?

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 »

No, non devi lanciare un foreach per le voci di menu! Le devi richiamare direttamente
come ho scritto prima:

Codice: Seleziona tutto

// creo i nomi lunghi del menu principale
$vocimenu=array("home"=>"Home","chi"=>"Chi siamo","cosa"=>"Cosa facciamo");
/* tolto foreach */
// creo il menu
$pagine=array(
    "home"=>array(),
    "chi"=>array("chisiamo"=>"Chi siamo","dovesiamo"=>"Dove siamo"),
    "cosa"=>array("attivita"=>"Attivit&agrave;")
    );
foreach($pagine as $pagina=>$sezioni) {
echo "
<li id=\"$pagina\"><a
href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$vocimenu[$pagina]</a>"; // sostituito $pagina con $vocimenu[$pagina]
if( count($sezioni) ) {
echo "<ul>\n";
foreach($sezioni as $chiavesezione=>$nomesezione) {
echo "
<li><p><a
href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
}
echo "
</ul>";
}}
Comunque, prova anche la versione di miklos (molto sfiziosa!)...

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 »

Perfetto adesso! Ho modificato il CSS, ed è venuto molto carino.
Adesso vedo il codice di miklos, il quale dovrà prepararsi
e un sacco di domande! :-)

Grazie mille!
M.

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 »

Allora passiamo a questo codice economicissimo:

Codice: Seleziona tutto

<?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>";
if (isset($menus[$key."_menu"]))
foreach ($menus[$key."_menu"] as $subKey => $submenu) {
echo $submenu. "<br>";
   }
}
?>
Per trasformare le voci del menu in <li> devo operare distintamente
sui due echo o basta una stringa unica?

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 »

Il validatore W3C così si lamenta:

Codice: Seleziona tutto

Line 40, Column 18: document type does not allow element "li" here; missing one of "ul", "ol" start-tag
<li id="chisiamo"><a
The mentioned element is not allowed to appear in the context in which you've placed it; the other mentioned elements are the only ones that are both allowed there and can contain the element mentioned. This might mean that you need a containing element, or possibly that you've forgotten to close a previous element.
One possible cause for this message is that you have attempted to put a block-level element (such as "<p>" or "<table>") inside an inline element (such as "<a>", "<span>", or "<font>").

Error Line 42, Column 18: document type does not allow element "li" here; missing one of "ul", "ol" start-tag
<li id="attivita"><a
E le righe incriminate sono:

Codice: Seleziona tutto

<div id="hormenu_wrapper">
<div id="hormenu">
<ul>


<li id="home"><a
href="index.php?pagina=home"><span>&nbsp;</span>Home</a>
<li id="chisiamo"><a
href="index.php?pagina=chisiamo"><span>&nbsp;</span>Chi siamo</a>
<li id="attivita"><a
href="index.php?pagina=attivita"><span>&nbsp;</span>Attività</a><ul>

<li><p><a
href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></li>
<li><p><a
href="index.php?pagina=attivita&sezione=concluse">Concluse</a></p></li>
</ul>

<li id="contatti"><a
href="index.php?pagina=contatti"><span>&nbsp;</span>Contatti</a><ul>
Che fare?

M.

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, avevo dimenticato il li di chiusura delle pagine principali:

Codice: Seleziona tutto

    // creo i nomi lunghi del menu principale
    $vocimenu=array("home"=>"Home","chi"=>"Chi siamo","cosa"=>"Cosa facciamo");
    /* tolto foreach */
    // creo il menu
    $pagine=array(
        "home"=>array(),
        "chi"=>array("chisiamo"=>"Chi siamo","dovesiamo"=>"Dove siamo"),
        "cosa"=>array("attivita"=>"Attivit&agrave;")
        );
    foreach($pagine as $pagina=>$sezioni) {
    echo "
    <li id=\"$pagina\"><a
    href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$vocimenu[$pagina]</a></li>"; //aggiunto </li>
    if( count($sezioni) ) {
    echo "<ul>\n";
    foreach($sezioni as $chiavesezione=>$nomesezione) {
    echo "
    <li><p><a
    href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
    }
    echo "
    </ul>";
    }}
Occhio anche a mettere l'/ul finale del menu principale (che qui non compare)...

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 »

Ma non dovrebbe essere ua cosa del genere?

Codice: Seleziona tutto

<ul>
<?php
    // creo i nomi lunghi del menu principale
$vocimenu=array("home"=>"Home","chisiamo"=>"Chi siamo","attivita"=>"Attività",
"contatti"=>"Contatti");
    // creo il menu
$pagine=array(
    "home"=>array(),
    "chisiamo"=>array(),
    "attivita"=>array("inprogramma"=>"In programma","concluse"=>"Concluse"),
    "contatti"=>array("dovesiamo"=>"Dove siamo","scrivici"=>"Scrivici")
    );
    foreach($pagine as $pagina=>$sezioni) {
    echo "
    <li id=\"$pagina\"><a
    href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$vocimenu[$pagina]</a></li>";
if( count($sezioni) ) {
    echo "
    <ul>";
    foreach($sezioni as $chiavesezione=>$nomesezione) {
    echo "
    <li><p><a
    href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
    }
    echo "
    </ul>";
    }}
// invece per visualizzare il nome al di fuori del menu: $nomepagina[$pag]
?>
</ul>
M.

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 »

Il codice sopra produceva un menu tutto sballato.
COsì sembra funzionare

Codice: Seleziona tutto

<ul>
<?php
    // creo i nomi lunghi del menu principale
$vocimenu=array("home"=>"Home","chisiamo"=>"Chi siamo","attivita"=>"Attività",
"contatti"=>"Contatti");
    // creo il menu
$pagine=array(
    "home"=>array(),
    "chisiamo"=>array(),
    "attivita"=>array("inprogramma"=>"In programma","concluse"=>"Concluse"),
    "contatti"=>array("dovesiamo"=>"Dove siamo","scrivici"=>"Scrivici")
    );
    foreach($pagine as $pagina=>$sezioni) {
    echo "
    <li id=\"$pagina\"><a
    href=\"index.php?pagina=$pagina\"><span> </span>$vocimenu[$pagina]</a>";
if( count($sezioni) ) {
    echo "
    <ul>";
    foreach($sezioni as $chiavesezione=>$nomesezione) {
    echo "
    <li><p><a
    href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
    }
    echo "
    </ul>";
    }
    echo '</li>';
    }
?>
</ul>
ma m iproduce una sfilza di errori:

Codice: Seleziona tutto

Line 45, Column 37: cannot generate system identifier for general entity "sezione"

    href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></…

✉

An entity reference was found in the document, but there is no reference by that name defined. Often this is caused by misspelling the reference name, unencoded ampersands, or by leaving off the trailing semicolon (;). The most common cause of this error is unencoded ampersands in URLs as described by the WDG in "Ampersands in URLs".

Entity references start with an ampersand (&) and end with a semicolon (;). If you want to use a literal ampersand in your document you must encode it as "&" (even inside URLs!). Be careful to end entity references with a semicolon or your entity reference may get interpreted in connection with the following text. Also keep in mind that named entity references are case-sensitive; &Aelig; and &aelig; are different characters.

If this error appears in some markup generated by PHP's session handling code, this article has explanations and solutions to your problem.

Note that in most documents, errors related to entity references will trigger up to 5 separate messages from the Validator. Usually these will all disappear when the original problem is fixed.
Error Line 45, Column 37: general entity "sezione" not defined and no default entity

    href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></…

✉

This is usually a cascading error caused by a an undefined entity reference or use of an unencoded ampersand (&) in an URL or body text. See the previous message for further details.
Warning Line 45, Column 44: reference not terminated by REFC delimiter

… href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></li>

✉

If you meant to include an entity that starts with "&", then you should terminate it with ";". Another reason for this error message is that you inadvertently created an entity by failing to escape an "&" character just before this text.
Warning Line 45, Column 44: reference to external entity in attribute value

… href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></li>

✉

This is generally the sign of an ampersand that was not properly escaped for inclusion in an attribute, in a href for example. You will need to escape all instances of '&' into '&'.
Error Line 45, Column 44: reference to entity "sezione" for which no system identifier could be generated

… href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></li>

✉

This is usually a cascading error caused by a an undefined entity reference or use of an unencoded ampersand (&) in an URL or body text. See the previous message for further details.
Info Line 45, Column 36: entity was defined here

    href="index.php?pagina=attivita&sezione=inprogramma">In programma</a></p></…

M. ;.(

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 »

Ho dato una sistematina al codice. Ma perché non usi l'indentazione, non ti confondi?
Comunque, avevo fatto un po' di confusione anch'io (eh sì, sono un po' arrugginito...):

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&agrave;")
        );
$nomepagina=array("home"=>"Home","chi"=>"Chi siamo","cosa"=>"Cosa facciamo");
    foreach($pagine as $pagina=>$sezioni) {
    echo "
      <li id=\"$pagina\">
	<a href=\"index.php?pagina=$pagina\"><span>&nbsp;</span>$nomepagina[$pagina]</a>";
      if( count($sezioni) ) {
	echo "
	<ul>";
	foreach($sezioni as $chiavesezione=>$nomesezione) {
	  echo "
	  <li><p><a href=\"index.php?pagina=$pagina&sezione=$chiavesezione\">$nomesezione</a></p></li>";
	}
	echo "
	</ul>";
      }
      echo "
      </li>";
    }
    echo "\n";
    ?>
    </ul>
    </div><!--navlist-->
    </div><!--navlist_wrapper-->
    </div><!--header-->
Così sulle liste non dovrebbe più darti errore. Ho migliorato anche la formattazione
dell'output.
Per il resto, però, avrai ancora errori:
1. Devi modificare i richiami della pagina nei meta (sostituisci $pagina con $pag);
2. Cambia il nome al div o all'ul "hormenu" (non puoi avere due id con lo stesso
nome).

Questi, almeno quelli che ho visto io (può darsi che ce siano altri...)

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 »

No no, così mi pare perfetto e supera la valdazione.
Ho modificato anche altre cose del CSS
ed è venuta fuori una cosa mi sembra davvero carina.
Mille grazie, come sempre, per l'enorme aiuto

M.

Rispondi