8725 sujets

Développement web côté serveur, CMS

Bonjour a toutes et tous,
je voulais savoir si quelqu'un pouvait m'aider à faire un menu en PHP/SQL comme celui-ci :

Smiley url http://css.developpez.com/galerie/demo/menus/verticalderoulant2/#[/url]

En récupérant les titres "menu1","menu1",etc. à partir d'une SGBD SQL et les sous-menu également.

J'ai des notions en php/sql, il me faudrait juste un petit coup de pouce s'il vous plait.

J'ai deux tables comme cela :

CREATE TABLE rubrique (numrubrique INT not null, nomrubrique VARCHAR (20) NOT NULL, PRIMARY KEY (numrubrique));

CREATE TABLE ss_rubrique (numssrubrique INT not null AUTO_INCREMENT, nomssrubrique VARCHAR (40) NOT NULL, photossrubrique VARCHAR (40), numrubrique INT not null, PRIMARY KEY (numssrubrique));


Elles contiennent les données suivantes :

INSERT INTO rubrique (numrubrique, nomrubrique) VALUES ("1", "écrits"), ("2", "scènes"), ("3", "+"), ("4", "Actualités"), ("5", "biographie");;

INSERT INTO ss_rubrique (numssrubrique, nomssrubrique, photossrubrique, numrubrique) VALUES ("1", "théâtre", "fototheatre.gif", "1"), ("2", "enfance et jeunesse", "fotoenfance.gif", "1"), ("3", "poésie", "fototheatre.gif", "1"), ("4", "traduction", "fototraduction.gif", "1"), ("5", "autres publications", "fotoautrespubli.gif", "1"), ("6", "saison 2010-2011", "fotosaison201011.gif", "2"), ("7", "saison 2009-2010", "fotosaison200910.gif", "2"), ("8", "archives", "fotoarchive.gif", "2");


J'ai trois fichiers.

Un fichier appelé [u]functions.js[/u] qui contient la fonction pour le menu :

function afficheMenu(obj){
    
    var idMenu     = obj.id;
    var idSousMenu = 'sous' + idMenu;
    var sousMenu   = document.getElementById(idSousMenu);
    
    /*****************************************************/
    /**    on cache tous les sous-menus pour n'afficher    **/
    /** que celui dont le menu correspondant est cliqué **/
    /** où 4 correspond au nombre de sous-menus         **/
    /*****************************************************/
    for(var i = 1; i <= 20; i++){
        if(document.getElementById('sousmenu' + i) && document.getElementById('sousmenu' + i) != sousMenu){
            document.getElementById('sousmenu' + i).style.display = "none";
        }
    }
    
    if(sousMenu){
        //alert(sousMenu.style.display);
        if(sousMenu.style.display == "block"){
            sousMenu.style.display = "none";
        }
        else{
            sousMenu.style.display = "block";
        }
    }
    
}



Un fichier nommé [u]style.css[/u] qui contient les styles pour le menu :

*{
    margin:0;
    padding:0;
}
#menu{
    width:150px;
    margin:20px auto 0 auto;
}
.menu, .sousmenu{
    text-align:center;
}
.menu{
    height:18px;
    width:150px;
    padding:2px 0;
    background:#404040;
    color:#fff;
}
.sousmenu{
    height:18px;
    width:150px;
    padding:1px 0;
    background:#808080;
    color:#fff;
}
.menu a{
    display:block;
    width:100%;
    height:100%;
    color:#fff;
    font-family:arial,sans-serif;
    font-size:12px;
    font-weight:bold;
    text-decoration:none;
    background:#404040;
}
.sousmenu a{
    display:block;
    width:100%;
    height:100%;
    color:#123456;
    font-family:arial,sans-serif;
    font-size:12px;
    font-weight:bold;
    text-decoration:none;
}
.menu a:hover, .sousmenu a:hover, .menu a:active, .sousmenu a:active, .menu a:focus, .sousmenu a:focus{
    color:#654321;
}



La page sur laquelle j'appelle le menu dynamiquement ainsi que les fichiers "functions.js" et "style.css" :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="robots" content="index, follow" />
<meta name="keywords" content=" />
<meta name="description" content=" />
<title></title>
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
     <link rel="stylesheet" href="menu/style.css" type="text/css" />
     <script type="text/javascript" src="menu/functions.js"></script>
</head>
<body>
<table width="900" height="421" border="0" align="center" bgcolor="#000000">
  <tr>
    <td width="22">&nbsp;</td>
    <td width="145" valign="top"><br />
    <?php include"menu/menu.php" ?>; </td>
    <td width="682" valign="top"><br />



Puis, le fichier du menu :

<?php
require("identification/connexion_sql.php");
$db = mysql_connect($host_db,$login_db,$password_db) or die ("impossible de se connecter a la base".mysql_error());
mysql_select_db($name_db,$db) or die ("base inexistante".mysql_error());
$req = mysql_query("SELECT * FROM rubrique, ss_rubrique WHERE ss_rubrique.numrubrique = rubrique.numrubrique ORDER BY rubrique.numrubrique ASC, ss_rubrique.numssrubrique") or die ("impossible d'effectuer la requête");
$arrayFlag = array();
print'<div id="menu">';
while($shopone = mysql_fetch_array($req)){
$nomrubrique = stripslashes($shopone['nomrubrique']);
$nomssrubrique = stripslashes($shopone['nomssrubrique']);
$nomrubrique2 = utf8_encode($nomrubrique);
$nomssrubrique2 = utf8_encode($nomssrubrique);
if( !isset($arrayFlag[$shopone['numrubrique']])) // On vérifie que le champ n'a pas été déjà affiché
{

print'
	<div class="menu" id="menu'.$shopone['numrubrique'].'" onclick="afficheMenu(this)">
		<a href="#">'.$nomrubrique2.'</a>
	</div>';
	
$arrayFlag[$shopone['numrubrique']] = true;} // On signale qu'on a affiché cette catégorie au moins une fois

if( !isset($arrayFlag[$shopone['numrubrique']])) // On vérifie que le champ n'a pas été déjà affiché
{

print'<div id="sousmenu'.$shopone['numrubrique'].'" style="display:none">
					<div class="sousmenu">
					<a href="#">'.$nomssrubrique2.'</a>
		</div>';  
 }else{
 print'<div class="sousmenu">
					<a href="#">'.$nomssrubrique2.'</a>
		</div>';  
		}
 }
print'</div>';
 mysql_close();
?>


Pour l'instant, le résultat n'est pas terrible comme vous pourrez le constater, toutes les apparaissent, mais le menu ne fonctionne pas :

http://www.la-grange-sardieres.fr/site Fab/presentation.php

Je voudrai le même résultat que le menu pris en exemple, mais dans ce que j'ai fait il y a quelque chose qui ne va pas.

Merci beaucoup pour votre aide.
Modifié par quaresma (20 Oct 2010 - 22:55)
salut...

Bon je regarde pas plus loin pour l'instant....

L'erreur ne vient pas du php mysql .. du moins pour l'instant mais du js...

tu le fait tourner sur 20 ?? i <= 20 hors le nombre ici est très important car il s'agit du nombre exact de menus principaux.. dans ton cas 2.. pas 20
Personne pour m'aider SVP ?

J'ai effectué encore des modifications sur le code, mais le résultat n'est pas encore celui voulu... Smiley decu

<?php
require("identification/connexion_sql.php");
$db = mysql_connect($host_db,$login_db,$password_db) or die ("impossible de se connecter a la base".mysql_error());
mysql_select_db($name_db,$db) or die ("base inexistante".mysql_error());
$req = mysql_query("SELECT * FROM rubrique, ss_rubrique WHERE ss_rubrique.numrubrique = rubrique.numrubrique ORDER BY rubrique.numrubrique ASC, ss_rubrique.numssrubrique") or die ("impossible d'effectuer la requête");
$arrayFlag = array();
print'<div id="menu">';
while($shopone = mysql_fetch_array($req)){
$nomrubrique = stripslashes($shopone['nomrubrique']);
$nomssrubrique = stripslashes($shopone['nomssrubrique']);
$nomrubrique2 = utf8_encode($nomrubrique);
$nomssrubrique2 = utf8_encode($nomssrubrique);
if( !isset($arrayFlag[$shopone['numrubrique']])) // On vérifie que le champ n'a pas été déjà affiché
{

print'
	<div class="menu" id="menu'.$shopone['numrubrique'].'" onclick="afficheMenu(this)">
		<a href="#">'.$nomrubrique2.'</a>
	</div>
	<div id="sousmenu'.$shopone['numrubrique'].'" style="display:none">';
	
$arrayFlag[$shopone['numrubrique']] = true;} // On signale qu'on a affiché cette catégorie au moins une fois

print'
					<div class="sousmenu">
					<a href="#">'.$nomssrubrique2.'</a>
		</div>';  

 }

print'</div>';
 mysql_close();
?>



Pourriez-vous me donner un coup de pouce s'il vous plait ?
Je voudrai rester sur le modèle que j'avais pris.
Je suis sûr que le problème n'est pas énorme, mais je ne trouve pas d'où il provient Smiley decu

Merci
Bonsoir,
j'ai fait pas mal de modifications.

Voici le code de la page "presentation.php" :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="robots" content="index, follow" />
<meta name="keywords" content=" "/>
<meta name="description" content=" "/>
<title></title>
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	 <link rel="stylesheet" href="css/style_menu.css" type="text/css" />
	 <script type="text/javascript" src="js/functions.js"></script>
<style type="text/css">
<!--
body {
	margin-top: 0px;
}
-->
</style></head>
<body bgcolor="#333333">
<table width="1050" border="0" align="center" cellpadding="0" cellspacing="0" style="background: #000; height: 421px; min-height: 421px;">
<tr>
<td colspan="3" style="height: 50px; min-height: 50px; max-height: 50px;">&nbsp;</td>
</tr>
<tr>
<td width="183" valign="top" style="width: 145px;"><?php include"menu/menu.php" ?></td>
<td width="850" style="width: 682px; background: #fff;">contenu</td>
<td width="17" style="background: #000;">&nbsp;</td>
</tr>
</table>

</body>
</html>


Voici le code du CSS :

#menu { 
width: 150px;
background: #000;
margin: 0;
}
.menu_niv2 { display: none; }
.menu_niv1 a { 
display: block;
background: #333; 
color: #fff;
text-decoration: none;
text-align: center;
}
.menu_niv1 a:hover { 
display: block;
background: #666; 
color: #fff;
text-decoration: underline;
text-align: center;
}
.menu_niv2 a {
color: #333;
background: #ccc;
text-decoration: none;
text-align: center;
display: block;
}
.menu_niv2 a:hover {
color: #333;
background: #aaa;
text-decoration: underline;
text-align: center;
display: block;
}


Voici le code du js :

function afficheMenu(menu) {
// generation du nom du sous menu que l'on veut gerer (afficher / cacher)
var sousMenu='sous' + menu;
// on recupere son etat
var etatSousMenu=document.getElementById(sousMenu).style.display;
// on cree un array de tous les menus de niveau 1, donc ceux qui ont la classe 'menu_niv1'
var listeNiv1=document.getElementsByClassName('menu_niv1');
// on boucle sur ces elements
for (var i=0; i<listeNiv1.length; i++) {
// on recupere l'id du menu courant
var idCourant=listeNiv1[i].id;
// si l'id courant est le meme que le menu que l'on a clique alors on traite le sous menu
// sinon on le cache et on passe au suivant
if (idCourant==menu) {
if (etatSousMenu=='block') {
document.getElementById(sousMenu).style.display='none';
} else {
document.getElementById(sousMenu).style.display='block';
}
} else {
// attention, si on cache, on doit cacher le sous menu du menu courant, il faut donc creer une nouvelle variable pour cacher celui-ci
var sousMenuTemp='sous' + idCourant;
document.getElementById(sousMenuTemp).style.display='none';
}
}
}


Et, enfin le code du menu :

<div id="menu">
<?php
require("identification/connexion_sql.php");
// on attaque le php ici
// dans un premier temps on recupere les menus de niveau 1 donc ceux qui ont l'id_parent egal a 0
$req1 = "SELECT id_menu, lib_menu FROM menus WHERE id_parent='0' ORDER BY ordre_menu" or die ("impossible d'effectuer la requête");
$rep1 = mysql_query($req1);
while($row1 = mysql_fetch_array($rep1)) {
// on affiche le menu de niveau 1
echo "<div class=\"menu_niv1\" id=\"menu".$row1['id_menu']."\" onclick=\"afficheMenu(this.id)\"><a href=\"#\">".$row1['lib_menu']."</a></div>\n";
// ensuite on fait une seconde requete pour chercher les sous menus de ce niveau, s'il y en a on les affiche, sinon on ne fait rien
$req2="SELECT id_menu, lib_menu FROM menus WHERE id_parent='".$row1['id_menu']."' ORDER BY ordre_menu"  or die ("impossible d'effectuer la requête");
$rep2=mysql_query($req2);
$nb2=mysql_num_rows($rep2);
if (isset($nb2) && $nb2>0) {
echo "<div id=\"sousmenu".$row1['id_menu']."\" class=\"menu_niv2\">\n";
while ($row2=mysql_fetch_array($rep2)) {
echo "<a href=\"#\">".htmlentities($row2['lib_menu'])."</a>\n";
}
echo "</div>\n";
}
}
?>
</div>


le premier problème est le décalage du menu par rapport à la zone blanche.
Normalement, le menu doit être à la même hauteur que la zone blanche, mais ce n'est pas le cas Smiley decu
Je ne comprends pas pourquoi il y a ce problème.

Autre problème, le menu ne fonctionne pas du tout sous IE.

Pensez-vous pouvoir m'aider ?

Merci beaucoup et bonne soirée[/i]