IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

arborescence et sous-menus cachés [PHP 5.0]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Par défaut arborescence et sous-menus cachés
    Bonjour à tous,

    Je développe actuellement une partie d’un site Intranet et dois réalisé un menu arborescent avec une fonction récursive en PHP. Ce que j’ai réussi de faire grâce à un tutorial sur le WEB.
    Mais j’aimerais développer des sous-menus cachés. J’ai donc suivi un autre tutorial sur le même site Web. Mais mes fonctions ne marchent pas.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <html>
    <head>
    <script type="text/javascript">
    <!--
    function showmenu(menu) {
    	if (menu.style.display == 'none') menu.style.display = 'block';
    	else menu.style.display = 'none';
    	}
    //-->
    </script>
     
     
    </head>
    <body>
    <?php
    $cat[0] = array("id" => 1, "parent" => 0, "nom" => "Informatique_racine");
    $cat[1] = array("id" => 2, "parent" => 1, "nom" => "ss-info");
    $cat[2] = array("id" => 3, "parent" => 1, "nom" => "Internet/Messagerie");
    $cat[3] = array("id" => 4, "parent" => 3, "nom" => "FTP");
    $cat[4] = array("id" => 5, "parent" => 3, "nom" => "Acces WIFI client");
    $cat[5] = array("id" => 6, "parent" => 2, "nom" => "test");
    $cat[6] = array("id" => 7, "parent" => 0, "nom" => "test-racine"); 
     
     
     
    function afficher_menu($parent, $niveau, $array) {
     
    $html = "";
    $niveau_precedent = 0;
     
    if (!$niveau && !$niveau_precedent) $html .= "\n<ul>\n";
     
    foreach ($array AS $noeud) {
    	if ($parent == $noeud['parent']) {
     
    	if ($niveau_precedent < $niveau) $html .= "\n<ul id=".$noeud['id']." style='display: none;>\n";
    	$html .= "<li><a onclick='javascript: showmenu(document.getElementById(".$noeud['id']."));'
    style='cursor: pointer;'>".$noeud['nom']."</a>";
     
     
     
    	$niveau_precedent = $niveau;
     
    	$html .= afficher_menu($noeud['id'], ($niveau + 1), $array);
     
    	}
    }
     
    if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= "</ul>\n</li>\n";
    else if ($niveau_precedent == $niveau) $html .= "</ul>\n";
    else $html .= "</li>\n";
     
    return $html;
     
    }
     
    echo afficher_menu(0, 0, $cat);
     
    ?>
     
     
    </body>
    </html>
    Le code m’affiche bien mes deux menus racines mais ne déroule pas les sous-menus.
    Je pense qu’il y à une erreur au moment de l’appel de la fonction Java script (mauvais paramètre).

    Je suis à cours d’idées, c’est pour cela que je fait appel à vous pour déceler les anomalies dans mon code !


    PS : voici le lien du tutorial support :http://www.coinduwebmaster.com/sous-menus-caches/60/


    Merci de m'aider.

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    La console JavaScript me dit : "menu is null" dans ta fonction... j'vais regarder à ça...


    EDIT : après un rapide coup d'oeil, ton menu est mal construit... peux-tu nous montrer, les niveaux d'arborescences déployés, à quoi ça devrait ressembler ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Par défaut
    bonjour,

    Effectivement la variable « menu » est vide mais normalement je lui passe l’identifiant du nœud.
    Voilà la structure de mon arborescence tel que mon navigateur me l’affiche si j’enlève le Java Script :

    • Informatique_racine
    o ss-info
    - test
    o Internet/Messagerie
    - FTP
    - Acces WIFI client
    • test-racine

    Et voici le code qui me permet d’afficher cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    <html>
    <head>
    <script type="text/javascript">
    <!--
    function showmenu(menu) {
    	if (menu.style.display == 'none') menu.style.display = 'block';
    	else menu.style.display = 'none';
    	}
    //-->
    </script>
     
     
    </head>
    <body>
    <?php
    $cat[0] = array("id" => 1, "parent" => 0, "nom" => "Informatique_racine");
    $cat[1] = array("id" => 2, "parent" => 1, "nom" => "ss-info");
    $cat[2] = array("id" => 3, "parent" => 1, "nom" => "Internet/Messagerie");
    $cat[3] = array("id" => 4, "parent" => 3, "nom" => "FTP");
    $cat[4] = array("id" => 5, "parent" => 3, "nom" => "Acces WIFI client");
    $cat[5] = array("id" => 6, "parent" => 2, "nom" => "test");
    $cat[6] = array("id" => 7, "parent" => 0, "nom" => "test-racine"); 
     
     
     
     
    function afficher_menu($parent, $niveau, $array) {
     
    $html = "";
    $niveau_precedent = 0;
     
    if (!$niveau && !$niveau_precedent)
     
    $html .= "\n<ul>\n";
    foreach ($array AS $noeud) 
    {
    	if ($parent == $noeud['parent']) {
     
    	if ($niveau_precedent < $niveau) 
    	$html .= "\n<ul>\n";
     
    	$html .= "<li><a href=\"?categorie=" . $noeud['id'] . "\">" . $noeud['nom'] . "</a>";
     
     
     
    	$niveau_precedent = $niveau;
     
    	$html .= afficher_menu($noeud['id'], ($niveau + 1), $array);
     
    	}
    }
     
    if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= "</ul>\n</li>\n";
    else if ($niveau_precedent == $niveau) 
    $html .= "</ul>\n";
     else $html .= "</li>\n";
     
    return $html;
     
    }
     
    echo afficher_menu(0, 0, $cat);
     
    ?>
     
     
    </body>
    </html>
    Merci beaucoup d’essayer de me dépatouiller.

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Avant de regarder au code, j'vais expliquer un peu plus pourquoi "menu is null" et du coup, pourquoi j'ai demandé ton code...

    En effet, quand tu regardes ton code, tu incrémentes TOUJOURS ton $id donc forcément... personne n'est lié

    Bon voilà qui est dit histoire de te faire réchéflir (^^) de ton côté, moi j'vais regarder aussi

  5. #5
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Dans un premier je me suis permis d'améliorer un peu ton code

    - fonction récursive
    - détection s'il y a un enfant ou pas
    - code plus propre et moins de trous blancs :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <html>
    <head>
    <script type="text/javascript">
    <!--
    function showmenu(menu) {
    	if (menu.style.display == 'none') menu.style.display = 'block';
    	else menu.style.display = 'none';
    	}
    //-->
    </script>
    </head>
    <body>
    <?php
    $cat[0] = array("id" => 1, "parent" => 0, "nom" => "Informatique_racine");
    $cat[1] = array("id" => 2, "parent" => 1, "nom" => "ss-info");
    $cat[2] = array("id" => 3, "parent" => 1, "nom" => "Internet/Messagerie");
    $cat[3] = array("id" => 4, "parent" => 3, "nom" => "FTP");
    $cat[4] = array("id" => 5, "parent" => 3, "nom" => "Acces WIFI client");
    $cat[5] = array("id" => 6, "parent" => 2, "nom" => "test");
    $cat[6] = array("id" => 7, "parent" => 0, "nom" => "test-racine"); 
     
    function afficher_menu($arr, $id_parent = 0) {
    	$html = "<ol>";
    	foreach ($arr AS $k => $v) {
    		if ($v['parent'] == $id_parent) {
    			$child = afficher_menu($arr, $v['id']);
    			if (!empty($child) && $chield != "<ol></ol>") {
    				$html .= "<li><a href=\"#\">".$v['nom']."</a>";
    			} else {
    				$html .= "<li>".$v['nom'];
    			}
    			$html .= $child;
    			$html .= "</li>\r\n";
    		}
    	}
    	if( $html != "<ol>") {
    		$html .= "</ol>\r\n";
    	} else { 
    		$html = ""; 
    	}
    	return $html;
    }
    echo afficher_menu($cat);
    ?>
    </body>
    </html>

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Par défaut
    J'ai fait des tests en remplaçant les noms par les identifiants. Est la variable « nœud[id] »
    Prend bien successivement les différents identifiants de mes catégories.
    Car la boucle parcours mon tableau de catégories qui comprend 7 éléments.
    Pour info j’ai passer la fonction en HTML (sans automatisé en passant par un tableau à trois dimensions). J’ai donc écrit mes balises successives avec mes variables en dur pour l’affichage. Et à ma grande surprise tout fonctionne bien, mais ça ne va pas être très pratique à maintenir.

    Je continu à creuser le problème.

    Merci

  7. #7
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Et voici un code qui marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <html>
    <head>
    <script type="text/javascript">
    <!--
    function showhide(elmt) {
    	var menu = elmt.parentNode.childNodes[1];
    	if (menu.style.display == 'none') {
    		menu.style.display = '';
    	} else {
    		menu.style.display = 'none';
    	}
    }
    //-->
    </script>
    </head>
    <body>
    <?php
    $cat[0] = array("id" => 1, "parent" => 0, "nom" => "Informatique_racine");
    $cat[1] = array("id" => 2, "parent" => 1, "nom" => "ss-info");
    $cat[2] = array("id" => 3, "parent" => 1, "nom" => "Internet/Messagerie");
    $cat[3] = array("id" => 4, "parent" => 3, "nom" => "FTP");
    $cat[4] = array("id" => 5, "parent" => 3, "nom" => "Acces WIFI client");
    $cat[5] = array("id" => 6, "parent" => 2, "nom" => "test");
    $cat[6] = array("id" => 7, "parent" => 0, "nom" => "test-racine"); 
     
    function afficher_menu($arr, $id_parent = 0) {
    	$html = "<ol>";
    	foreach ($arr AS $k => $v) {
    		if ($v['parent'] == $id_parent) {
    			$child = afficher_menu($arr, $v['id']);
    			if (!empty($child) && $chield != "<ol></ol>") {
    				$html .= "<li><a href=\"#\" class=\"menu\" onclick=\"showhide(this); return false;\">".$v['nom']."</a>";
    			} else {
    				$html .= "<li>".$v['nom'];
    			}
    			$html .= $child;
    			$html .= "</li>";
    		}
    	}
    	if( $html != "<ol>") {
    		$html .= "</ol>\r\n";
    	} else { 
    		$html = ""; 
    	}
    	return $html;
    }
    echo afficher_menu($cat);
    ?>
    </body>
    </html>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2009, 13h29
  2. [DOM] Menu déroulant et DOM. Afficher les sous-menus cachés
    Par glenouve dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/11/2007, 10h42
  3. Réponses: 16
    Dernier message: 13/09/2005, 11h21
  4. Création de sous menus
    Par illusion dans le forum Eclipse Platform
    Réponses: 27
    Dernier message: 27/06/2003, 11h45
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo