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.

Re: Menu a tendina con PHP

Messaggioda samiel » sab set 03, 2011 18:48

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.
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 aschenaz » sab set 03, 2011 20:03

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

Re: Menu a tendina con PHP

Messaggioda miklos » sab set 03, 2011 20:05

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 ;) )
ho visto cose che voi astemi non potete immaginare
miklos
Linux 3.x
Linux 3.x
 
Messaggi: 1265
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 » sab set 03, 2011 22:50

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.
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 aschenaz » dom set 04, 2011 8:24

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

Re: Menu a tendina con PHP

Messaggioda samiel » dom set 04, 2011 9:05

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&amp;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?
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 aschenaz » dom set 04, 2011 11:20

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

Comunque, prova anche la versione di miklos (molto sfiziosa!)...
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4434
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.18
Desktop: KDE 4.10.5

Re: Menu a tendina con PHP

Messaggioda samiel » dom set 04, 2011 12:40

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: 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 » dom set 04, 2011 16:57

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: 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 » mar set 06, 2011 19:12

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&amp;sezione=inprogramma">In programma</a></p></li>
<li><p><a
href="index.php?pagina=attivita&amp;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.
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 aschenaz » mer set 07, 2011 6:57

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

Occhio anche a mettere l'/ul finale del menu principale (che qui non compare)...
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4434
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.18
Desktop: KDE 4.10.5

Re: Menu a tendina con PHP

Messaggioda samiel » mer set 07, 2011 18:34

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&amp;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: 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 set 07, 2011 18:51

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 "&amp;" (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 '&amp;'.
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. ;.(
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 aschenaz » mer set 07, 2011 19:23

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

Re: Menu a tendina con PHP

Messaggioda samiel » gio set 08, 2011 12:32

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.
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

PrecedenteProssimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite