Menu déroulant modifiable ... [AUTRE QUESTION]

Eléphanteau du PHP | 27 Messages

27 déc. 2005, 20:57

Bonjour à tous!

Je vais vous expliquer mon problème...

Je dois être capable d'afficher des menus déroulant avec le contenu de ma base de donnée. Le problème c'Est que chaque menu et sous menu doivent pouvoir être modifié a partir d'une page d'administration bien sur.

Une chose est sûre, je ne vous demande pas de créé le script pour moi. Tout ce que je veux c'est un model de menu déroulant dynamique comme celui la:
/*
Insérer ce script entre les balises <Head> </Head>
*/

<SCRIPT LANGUAGE="JavaScript">
<!--Javascript fourni par-->
<!-- [Script Masters.com]--> 
<!-- http://www.script-masters.com/ --> 


/****************************************
*Menu dynamique vertical		*
*Daniel Fabien21-05-2002		*
*http://www.script-masters.com		*
*Prière de conserver ce message		*
****************************************/


<!-----------------------Edition des caractèristiques du menu ----------------------------->

var largeur = 120;//Largeur du menu
var gauche = 50;//nombre de pixe de la gauche de l'écran
var top = 100;//Nombre de pixels du haut de la page
var couleur_police_cat="#FFFFFF";//Couleur du texte des categories
var couleur_police_scat="#000000";//Couleur du texte des sous-categories
var couleur_cat="#959EAD";//Couleur de fond des categories
var couleur_scat="#C3C9D4";//Couleur de fond des sous-categories


/********************************************************
*Attention : la modification des 2 variables ci-dessous	*
*peut provoquer d'important bug d'affichages		*
*Il est fortement conseillé de les conserver en état.	*
*********************************************************/
var taille = 11;//Police de caractères
var police = "Arial";//Type de police



<!-----------------------Texte et lien des menus et sous menus---------------------------->

var nb_elem = 4;//Nombre de categorie dans le menu

var nb_souscat = new Array(nb_elem);//Nb_souscat contient le nombre de sous categorie pour chaque categorie

nb_souscat[0] = 3;//Nombre de sous categorie 1
nb_souscat[1] = 3;//Nombre de sous categorie 2
nb_souscat[2] = 2;//Nombre de sous categorie 3
nb_souscat[3] = 3;//Nombre de sous categorie 4
//répeter aussi souvent qu'il y a de categorie... 


var categorie = new Array(nb_elem);
var soustab = new Array;

var tab0 = new Array(nb_souscat[0]);
var tab1 = new Array(nb_souscat[1]);
var tab2 = new Array(nb_souscat[2]);
var tab3 = new Array(nb_souscat[3]);
//répeter aussi souvent qu'il y a de categorie... 


<!-------Edition PREMIERE categorie et sous categorie------------>
categorie[0] = " Javascript"; //Titre de la categorie

tab0[0] = " Script|http://www.script-masters.com|_blank";//Premier sous-titre|liens|cible
tab0[1] = " Tutoriaux|http://www.script-masters.com|_blank";//Second sous-titre|liens|cible
tab0[2] = " Liens|http://www.script-masters.com|_blank";//Troisième sous-titre|liens|cible


<!-------Edition SECONDE categorie et sous categorie------------>
categorie[1] = " Php";//Titre de la categorie

tab1[0] = " Liens|http://www.script-masters.com|_blank";//Premier sous-titre|liens|cible
tab1[1] = " Forums|http://www.script-masters.com|_blank";//Second sous-titre|liens|cible
tab1[2] = " Livres|http://www.script-masters.com|_blank"; //Troisième sous-titre|liens|cible


<!-------Edition TROISIEME categorie et sous categorie------------>
categorie[2] = " MySql";//Titre de la categorie

tab2[0] = " Bases|http://www.script-masters.com|_blank";//Premier sous-titre|liens|cible
tab2[1] = " Livres|http://www.script-masters.com|_blank";//Second sous-titre|liens|cible


<!-------Edition QUATRIEME categorie et sous categorie------------>
categorie[3] = " Forum"; //Titre de la categorie

tab3[0] = " Javascript|http://www.script-masters.com|_blank";//Premier sous-titre|liens|cible
tab3[1] = " Php/MySQL|http://www.script-masters.com|_blank";//Second sous-titre|liens|cible
tab3[2] = " Webmasters|http://www.script-masters.com|_blank";//Troisième sous-titre|liens|cible


soustab[0] = tab0;
soustab[1] = tab1;
soustab[2] = tab2;
soustab[3] = tab3;
//répeter aussi souvent qu'il y a de categorie... 


<!------------------------------------Fonctions-------------------------------------------->
<!------------------------------NE PLUS RIEN MODIFIER-------------------------------------->

var conf = -1;
function Init(){
    var hauteur = top;
    for(i=1;i<=nb_elem;i++){
        document.getElementById("menu"+i+"").style.top = hauteur;
        hauteur = hauteur + 17;
    }
}

function voir(z){
    if(conf==z){
        document.getElementById("sousmenu"+z+"").style.visibility = 'hidden';
        Init();
        conf=conf+nb_elem;
    }else{
        conf=z;
        
        //Calcul de la hauteur dont doit se baisser le menu
        haut=0;
        var haut = 15*nb_souscat[z-1]+z*18+top;
        
        
        //On retracte tous les éléments
        for(i=1;i<=nb_elem;i++){
            document.getElementById("sousmenu"+i+"").style.visibility = 'hidden';
        }
        
        //on les remets tous à leur place
        Init();
        
        //on cale le sous menu sous la categorie
        document.getElementById("sousmenu"+z+"").style.top = 16;
        dec = haut;
        
        //On peut alors baisser tous les autre menus
        for(i=z+1;i<=nb_elem;i++){
            
            document.getElementById("menu"+i+"").style.top = dec;
            dec=dec+18;
        }
        
        //Enfin, on rend le menu visible
        document.getElementById("sousmenu"+z+"").style.height = 15*nb_souscat[z-1];
        document.getElementById("sousmenu"+z+"").style.visibility = 'visible';
        
    }
    
}

function affiche(){
    
    //feuille de style
     document.write('<style>');
    document.write('div.menu{visibility:visible; border-width: 1px; border-style: solid; border-color: #000000;background-color: '+couleur_cat+'}');
    document.write('div.sousmenu{position:absolute; left:-1; height:20; visibility:hidden; width:'+ largeur +'; border-width: 1px; border-style: solid; border-color: #000000;background-color: '+couleur_scat+'}');
    document.write('a.menu{font-family: '+ police +'; color: '+couleur_police_cat+'; font-size: '+taille+'px; font-weight:bold; text-decoration: none;}');
    document.write('a.smenu{font-family: '+ police +'; color: '+couleur_police_scat+'; font-size: '+taille+'px; font-weight:bold; text-decoration: none;}');
    document.write('</style>');
    document.write('<div>');
    
    for(i=0;i<nb_elem;i++){
        boucle = nb_souscat[i];
        
        
        document.write('<div id="menu'+(i+1)+'" style="position:absolute; left:'+ gauche +'px; width:'+ largeur +'px;" class="menu">');
        document.write('<a href="#" class="menu" onClick="javascript:voir('+(i+1)+')">'+categorie[i]+'</a>');
        
        document.write('<div width="'+ largeur +'" id="sousmenu'+(i+1)+'" class="sousmenu">');
        
        
        for(z=0;z<boucle;z++){
            elem=soustab[i][z].split("|");
            document.write('<div height="15"><a href="'+elem[1]+'" target="'+elem[2]+'" class="smenu">'+elem[0]+'</a></div>');
        }
        
        
        document.write('</div>');
        document.write('</div>');
        
    }
    
    document.write('</div>');
    
    document.onLoad=Init();
}
</script>
/*
Insérer ce code entre les balises <Body> </Body>
*/

<script language="Javascript">
affiche();
</script>
Moi je ne sais pas comment faire et c'est bien pour cela que je demande cela a vous pour m'aider!

Bref c'est simple, je voudrais savoir si c'est possible de créer un script comme celui là ou non?

Si oui, j'aimerais de votre aide pour le construire.

Sinon, dites-le moi et j'essaierai une autre alternative, mais j'aimerais vraiment que l'on puisse faire ce script.

J'aurais penser pour ce script que mes menus et sous menus soillent des tables avec comme colonne menu = 1 et si s'est un sous menu, sous_menu = 1... je ne sais pas si vous voyez ou que je veux en venir?!

Merci de m'aider!

A++
Modifié en dernier par Inazad le 29 déc. 2005, 08:36, modifié 2 fois.

ViPHP
ViPHP | 649 Messages

27 déc. 2005, 21:33

Ça serait pas plus simple d'y aller avec un <select></select>? Un exemple:

-Tu crées ta table "menu" avec deux champs pour commencer : option et url
<script type="text/javascript">
function open(a)
{
window.open(a);
}
</script>
<?
mysql_connect("localhost", "root", "");
mysql_select_db("database");

echo '<select>';
$retour = mysql_query("SELECT * FROM menu ORDER BY option DESC");
while ($donnees = mysql_fetch_array($retour))
{
echo '<option onclick="open(\'' . $donnees['url'] . '\')">' . $donnees['option'] . '</option>';
}
echo '</select>';


mysql_close();
?>
Ça ressemblerait à ça un peu...
Image

Eléphanteau du PHP | 27 Messages

27 déc. 2005, 21:41

Hmmm, mon patron c'est un menu déroulant qu'il veut...

J'essaie de chercher encore....

Pourrais-je, au lieu de faire tout ce gros script, créer des menus déroulants avec "<select>" avec leur sous catégorie?

Je créerais des tables pour chaques menus et ainsi de suite...

Et avec le CSS, je pourrais enlever les bordures et forcer le lien au simple clic...

Je ne sais pas si cela se peut, mais j'essaie tout de même d'essayer :lol:

Merci de m'aider!

A++

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 23:07

Salut,
Je dois être capable d'afficher des menus déroulant avec le contenu de ma base de donnée.
Puisque tu as une BD derière la liste tu ne dois pas jouer avec la liste elle meme mais avec le contenu de la BD.

Il faut donc faire une page d'administartion qui ajoute une entrée dans la BD qui est beaucoup plus simple.

Tu as ce qu'il te faut dans la FAQ
Hmmm, mon patron c'est un menu déroulant qu'il veut...
et d'apres toi c'est quoi "<select></select>" ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

28 déc. 2005, 00:14

Je sais mais je voudrais ça comme un menu déroulant dynamique mais dans le fond mon menu serait fait en CSS et avec des <select>...

Et aussi, comment faire pour que les bordure soit à 0 et comment faire pour que le menu se déroule lors du survol de la souris??

Est-ce que cela est possible?!

Quelqu'un peut m'aider?!

Merci!

A++

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 déc. 2005, 01:54

effectivement j'avais survolé le code proposé (trop long :lol: ) mais en y regardant de plus près il "suffit" (aie, j'ai osé le dire :lol: ) de rendre dynamique la partie comprise entre:
<!-------------Texte et lien des menus et sous menus------------->
et
<!------------------------------------Fonctions------------------------>
pour cela tu exécute les requetes normalement et tu récupère le résultat que tu affecte au variables javascript.

Pour ce qui est de ton probleme de modification j'insite sur le faite qu'un formulaire séparé pour ajouter des enregistrements dans la BD est la meilleur idée (d'ailleurs la seule :wink: ).

La liste sera donc mise a jour automatiquement.

Par contre il y a un peu de boulot alors je préconise le port du casque et des gants pour le chantier :lol:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

28 déc. 2005, 20:45

Merci de ton aide mais je n'y connais rien en Javascript...


Pour ce qui est de rendre dynamique certaine partie, j'ai comme l'impression que je ne sais même pas quoi faire! :oops:

C'est pour cela que je vous demande de l'aide en m'indiquant quoi garder et quoi rendre dynamique, etc.

S'il vous plait,

Inazad

Mammouth du PHP | 19672 Messages

28 déc. 2005, 21:55

Bon, je crois que je commence à comprendre ce que tu veux faire : tu devrais jeter un oeil sur ce tuto de Alsacreations où tu as des chances de trouver ce que tu cherches.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 27 Messages

28 déc. 2005, 23:01

Bon voici ce que j'ai trouvé grâce à Cyrano (Merci Cyrano!):

Code : Tout sélectionner

<head> <script type="text/javascript"> <!-- window.onload=montre; function montre(id) { var d = document.getElementById(id); for (var i = 1; i<=10; i++) { if (document.getElementById('smenu'+i)) {document.getElementById('smenu'+i).style.display='none';} } if (d) {d.style.display='block';} } //--> </script> </head> <style type="text/css" media="screen"> <!-- body { margin: 0; padding: 0; background: white; font: 80% verdana, arial, sans-serif; } dl, dt, dd, ul, li { margin: 0; padding: 0; list-style-type: none; } #menu { position: absolute; /* placement du menu, à modifier selon vos besoins */ top: 0; left: 0; z-index:100; width: 15%; /* correction pour Opera */ } #menu dl { float: left; width: 12em; } #menu dt { cursor: pointer; text-align: center; font-weight: bold; background: #ccc; border: 1px solid gray; margin: 1px; } #menu dd { display: none; border: 1px solid gray; } #menu li { text-align: center; background: #fff; } #menu li a, #menu dt a { color: #000; text-decoration: none; display: block; height: 100%; border: 0 none; } #menu li a:hover, #menu li a:focus, #menu dt a:hover, #menu dt a:focus { background: #eee; } #site { position: absolute; z-index: 1; top : 70px; left : 10px; color: #000; background-color: #ddd; padding: 5px; border: 1px solid gray; } --> </style> <dl id="menu"> <dt onclick="javascript:montre();"><a href="#">Menu 1</a></dt> <dt onclick="javascript:montre('smenu2');">Menu 2</dt> <dd id="smenu2"> <ul> <li><a href="#">Sous-Menu 2.1</a></li> <li><a href="#">Sous-Menu 2.2</a></li> <li><a href="#">Sous-Menu 2.3</a></li> </ul> </dd> <dt onclick="javascript:montre('smenu3');">Menu 3</dt> <dd id="smenu3"> <ul> <li><a href="#">Sous-Menu 3.1</a></li> <li><a href="#">Sous-Menu 3.1</a></li> <li><a href="#">Sous-Menu 3.1</a></li> <li><a href="#">Sous-Menu 3.1</a></li> <li><a href="#">Sous-Menu 3.1</a></li> <li><a href="#">Sous-Menu 3.1</a></li> </ul> </dd> <dt onclick="javascript:montre('smenu4');">Menu 4</dt> <dd id="smenu4"> <ul> <li><a href="#">Sous-Menu 4.1</a></li> <li><a href="#">Sous-Menu 4.1</a></li> </ul> </dd> </dl>
J'ai quelques questions:

- Comment pourrais-je rendre tout ce script dynamique?
- Comment faire pour les menus et sous-menus soit tirés d'une base de donnée?
- Est-ce que tout cela pourrait être modifiable (je pense que oui) via une page d'administration ?


Merci encore à toi Cyrano!

A+

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 déc. 2005, 00:22

- Comment pourrais-je rendre tout ce script dynamique?
avec le php et des boucles
- Comment faire pour les menus et sous-menus soit tirés d'une base de donnée?
avec des requetes sql
- Est-ce que tout cela pourrait être modifiable (je pense que oui) via une page d'administration ?
avec un formulaire et des requetes de mise a jour

Ce sont des choses pas vraiment compliquées je te conseil donc de faire un ou 2 tutoriaux pour comprendre:
phpdebutant
phpfrance
siteduzero

puis une fois que tu auras comprit les bases on s'attaquera à ceci :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

29 déc. 2005, 01:23

Je sais comment faire des boucles, des reqûetes et des pages d'administration...

Le seul hic, c'est que j'essaie de le rendre dynamique et cela ne fonctionne pas..

Dois-je fais plusieur "echo"..?

C'est ça le problème, je ne sais pas quoi faire...

Merci de m'aider!

A++

Mammouth du PHP | 19672 Messages

29 déc. 2005, 01:35

Si tu sais récupérer les données et créer des boucles pour extraire ligne après lignes, tu n'as plus besoin de grand chose d'autre et pas obligatoirement besoin de recourir syématiquement à echo(). Exemple:
<?php
//... 
// code de rcupération des données dans ta base
//...
?>
<dl id="menu">
    <dt onclick="javascript:montre();"><a href="#">Menu 1</a></dt>
    <dt onclick="javascript:montre('smenu2');">Menu 2</dt>
        <dd id="smenu2">
            <ul>
<?php
while($ligne = mysql_fatch_array($exec_requete))
{
?>
                <li><a href="<?php echo($ligne['lien_menu']); ?>"><?php echo($ligne['texte_lien_menu']); ?></a></li>
<?php
}
?>
            </ul>
<?php
//...
/* etc ... */
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 27 Messages

29 déc. 2005, 01:58

Bonjour,

merci de me répondre aussi vite!

J'ai essayé d'afficher le menu tel que tel mais avec PHP.

Voici mon code de menu.php :

Code : Tout sélectionner

<? /* Menu du site */ include("admin/protec/informations.php3"); mysql_connect($db_host, $db_user, $db_pass); mysql_select_db("menu"); include("menu_css_js.php"); echo "<dl id=\"menu\"> <dt onclick=\"javascript:montre();\"><a href=\"#\">Menu 1</a></dt> <br> <dt onclick=\"javascript:montre('smenu2');\">Menu 2</dt> <dd id=\"smenu2\"> <ul> <li><a href=\"#\">Sous-Menu 2.1</a></li> <li><a href=\"#\">Sous-Menu 2.2</a></li> <li><a href=\"#\">Sous-Menu 2.3</a></li> </ul> </dd> <br> <dt onclick=\"javascript:montre('smenu3');\">Menu 3</dt> <dd id=\"smenu3\"> <ul> <li><a href=\"#\">Sous-Menu 3.1</a></li> <li><a href=\"#\">Sous-Menu 3.1</a></li> <li><a href=\"#\">Sous-Menu 3.1</a></li> <li><a href=\"#\">Sous-Menu 3.1</a></li> <li><a href=\"#\">Sous-Menu 3.1</a></li> <li><a href=\"#\">Sous-Menu 3.1</a></li> </ul> </dd> <br> <dt onclick=\"javascript:montre('smenu4');\">Menu 4</dt> <dd id=\"smenu4\"> <ul> <li><a href=\"#\">Sous-Menu 4.1</a></li> <li><a href=\"#\">Sous-Menu 4.1</a></li> </ul> </dd> </dl>"; ?>
Comment je fais maintenant pour les boucles ?? Ce que je ne sais pas, c'est comment faire pour que dans une boucle, cela détermine le titre du menu, les sous-menu et ainsi de suite...

J'aurais une idée du genre on compte le nombre de tables qui sont des menus, ex.: toutes les tables commençant par menu_abc, et on fais en sorte que la boucle affiche le nombre de "catégorie" (les <dt>, je ne savais pas trop comment exprimer cela...) qu'il en faut.

On fais la même chose pour les tables du genre: smenu_xxx, qui elles seront les sous-menus.

Bien sûr, on va donner une genre de id_menu pour déterminer les places des sous-menus. :wink:

Je sais que moi je ne suis pas assez "avancé" pour créé ce genre de truc, c'est pour cela que je fais appel à vous.

Merci encore de votre aide,

Inazad

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 déc. 2005, 02:47

Comment je fais maintenant pour les boucles ?? Ce que je ne sais pas, c'est comment faire pour que dans une boucle, cela détermine le titre du menu, les sous-menu et ainsi de suite...
ça dépend de la structure des tables, c'est suivant la ou les requetes que la construction dynamique (boucles) se fera.

L'exemple de Cyrano n'en comporte pas mais la suite ressemblera tout à fait à ça.

On peut ne faire qu'une requete en regroupant par catégorie et sous catégories mais on peut tout aussi bien avoir plusieurs requetes et donc plusieus boucles.

Il nous faudrait lastructure de la (des) table(s) pour savoir dans quel sens il faut s'orienter et éventuellement retoucher.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

29 déc. 2005, 03:30

Merci, j'ai trouvé!

Mais maintenant, tous les menus se déroule...

Je n'y comprends vraiment rien!

Voici une image:

Image

Voici le code:

Code : Tout sélectionner

<html> <head> <script type="text/javascript"> <!-- window.onload=montre; function montre(id) { var d = document.getElementById(id); for (var i = 1; i<=10; i++) { if (document.getElementById('Menu '+i)) {document.getElementById('Menu '+i).style.display='none';} } if (d) {d.style.display='block';} } //--> </script> <style type="text/css"> /* CSS issu des tutoriels http://css.alsacreations.com */ body { padding:0; margin:0; font-family: verdana, arial, sans-serif; font-size: 70%; color: black; } dl, dt, dd, ul, li { margin: 0; padding: 0; list-style-type: none; } #menu { position: absolute; top: 1em; left: 1em; width: 80pix; } #menu dt { cursor: pointer; background: #A9BFCB; height: 20px; line-height: 20px; margin: 2px 0; border: 1px solid gray; text-align: center; font-weight: bold; } #menu dd { position: absolute; z-index: 100; left: 8em; margin-top: -1.4em; width: 10em; background: #A9BFCB; border: 1px solid gray; } #menu ul { padding: 2px; } #menu li { text-align: center; font-size: 85%; height: 18px; line-height: 18px; } #menu li a, #menu dt a { color: #000; text-decoration: none; display: block; } #menu li a:hover { text-decoration: underline; } #mentions { font-family: verdana, arial, sans-serif; position: absolute; bottom : 200px; left : 10px; color: #000; background-color: #ddd; } #mentions a {text-decoration: none; color: #222; } #mentions a:hover{text-decoration: underline; } </style> </head> <body> <? include("admin/protec/informations.php3"); $retour = mysql_query("SELECT * FROM menu"); echo '<dl id="menu">'; while($donnees = mysql_fetch_array($retour)) { echo '<dt onmouseover="javascript:montre(\'' . $donnees['nom'] . '\');">' . $donnees['nom'] . '</dt>'; echo '<dd id="' . $donnees['nom'] . '" onmouseover="javascript:montre(\'' . $donnees['nom'] . '\');" onmouseout="javascript:montre();">'; $menu = $donnees['id']; echo '<ul>'; $sous_menu = mysql_query("SELECT * FROM sousmenu WHERE menu=\"$menu\""); while ($dsous_menu = mysql_fetch_array($sous_menu)) { echo '<li><a href=\"' . $dsous_menu['lien'] . '\">' . $dsous_menu['option'] . '</a></li>'; } echo '</ul>'; echo '</dd>'; } echo '</dl>'; mysql_close(); ?> </body></html>
Quelqu'un a une idée pour stoppée cela?!?! :lol:

Merci,

Inazad