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

PHP & Base de données Discussion :

Module menus pour mes sites [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut Module menus pour mes sites
    Bonjour,
    J'ai une table menus_items qui renferme les items de mes menus. Chaque menu est identifié par menu_id. Les items de 1er niveau d'un menu ont pour pour parent_id = 0. Et pour générer un menu par exemple 1 je fais
    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
     
    //Générer un menu par id
    function getNav($id_menu) {
    	global $db;
    	$nav = '';
    	$sql = 'SELECT id_item as item_id, menu_id as nav_id FROM menus_items
    			WHERE menu_id = :id_menu AND parent_id = :id_parent
    			ORDER BY rang_item';
    	$statement = $db->prepare($sql);
    	$statement->execute(array(':id_menu' => $id_menu, ':id_parent' => 0));
        $tabl_results = $statement->fetchAll();
    	if(count($tabl_results)>0){
    		$nav .= '<ul class="menu-liste">';
    		foreach($tabl_results as $tabl_result) {
    			$nav .= getsubnav($tabl_result['nav_id'], $tabl_result['item_id']);
    		}
    		$nav .= '</ul>';
    	}
    	return $nav;
    }
     
    //Gestion des arbres
    function getsubnav($id_menu, $id_item) {
        global $db;
    	$subnav = '';
    	//Ajout de l'élément principal dans $subnav
    	$sql = 'SELECT id_item as item_id, type_item as libelle, url_item as url FROM menus_items
    			WHERE id_item = :id_item AND menu_id = :id_menu';
    	$statement = $db->prepare($sql);
    	$statement->execute(array(':id_menu' => $id_menu, ':id_item' => $id_item));
    	$tabl_result = $statement->fetch();
    	$subnav .= '<li class="menu-entree"><a href="'.$tabl_result['url'].'">'.$tabl_result['libelle'].'</a>';
     
    	//Si l'élément a des enfants
    	$sql2 = 'SELECT id_item as item_id, type_item as libelle, url_item as url, menu_id as nav_id FROM menus_items
    			WHERE parent_id = :id_item AND menu_id = :id_menu
    			ORDER BY rang_item';
    	$statement2 = $db->prepare($sql2);
    	$statement2->execute(array(':id_menu' => $id_menu, ':id_item' => $id_item));
    	$tabl_results = $statement2->fetchAll();
    	if( count($tabl_results) !=0 ){
    		$subnav .= '<ul class="menu-liste">';
    		foreach($tabl_results as $tabl_result) {
    			$subnav .= '<li class="menu-entree">';
    			$subnav .= '<a href="'.$tabl_result['url'].'">'.$tabl_result['libelle'].'</a>';
    			$subnav .= getsubnav($tabl_result['nav_id'], $tabl_result['item_id']);
    			$subnav .= '</li>';
    		}
    		$subnav .= '</ul>';
    	}	
    	$subnav .= '</li>';
    	return $subnav;
    }
    Je souhaite que ces fonction me gérèrent des arbres html à plusieurs niveaux quelque soit la profondeur.

    Le problème que est que la fonction récursive duplique les entrées des sous menus.

    Merci d'avance pour votre aide.

    Meilleure salutations.

  2. #2
    Membre actif Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Points : 214
    Points
    214
    Par défaut
    Bonjour,

    Pour une table comme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    id INT(10)
    parent_id INT(10)
    name VARCHAR(60)
    Je ferai les méthodes suivantes:
    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
     
    /**
     * Fonction d'initialisation du tableau des menus en PHP
     * @param $id_menu int L'identifiant du menu père
     * @return array Tableau du menu $id_menu et de ces sous-menus
     */
    function getNav($id_menu) {
    	$query = "SELECT id, parent_id, name FROM menus ORDER BY name ASC";
    	$result = mysql_query($query);
    	$menus = array();
    	$main_menu = "";
    	while($row = mysql_fetch_assoc($result)) {
    		$menus[] = $row;
    		if($row['id'] == $id_menu) $main_menu = $row['name'];
    	}
    	mysql_free_result($result);
    	return array('name' => $main_menu, 'subs' => getNavContent($id_menu, $menus));
    }
     
    /**
     * Fonction récursive qui travail sur le tableau PHP passé en paramètre
     * @param $id_menu int L'identifiant du menu père
     * @param $menus array Tableau des menus
     * @return array Tableau du menu $id_menu et de ces sous-menus
     */
    function getNavContent($id_menu, $menus) {
    	$return = array();
    	$menu_name = null;
    	// On parcours le tableau PHP
    	foreach ($menus AS $noeud) {
    		// Si on trouve un menu avec comme parent $id_menu
    		if ($id_menu == $noeud['parent_id']) {
    			$return[] = array(
    				'name' => $noeud['name'],
    				'subs' => getNavContent($noeud['id'], $menus)
    			);
    		}
    	}
    	// Si pas de sous-menus, on met false
    	if(count($return) < 1) $return = false;
    	return $return;
    }
     
    print_r(getNav(2));
    Tu obtiens un tableau PHP comme résultat de la forme:
    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
     
    Array
    (
        [name] => Actualité
        [subs] => Array
            (
                [0] => Array
                    (
                        [name] => Evenements
                        [subs] => 
                    )
     
                [1] => Array
                    (
                        [name] => Importantes
                        [subs] => Array
                            (
                                [0] => Array
                                    (
                                        [name] => Externes
                                        [subs] => 
                                    )
     
                                [1] => Array
                                    (
                                        [name] => Internes
                                        [subs] => 
                                    )
     
                            )
     
                    )
     
            )
     
    )

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par firehist Voir le message
    Tu obtiens un tableau PHP comme résultat de la forme:
    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
     
    Array
    (
        [name] => Actualité
        [subs] => Array
            (
                [0] => Array
                    (
                        [name] => Evenements
                        [subs] => 
                    )
     
                [1] => Array
                    (
                        [name] => Importantes
                        [subs] => Array
                            (
                                [0] => Array
                                    (
                                        [name] => Externes
                                        [subs] => 
                                    )
     
                                [1] => Array
                                    (
                                        [name] => Internes
                                        [subs] => 
                                    )
     
                            )
     
                    )
     
            )
     
    )
    Et comment parcourir ce array dont d'avance on ne peut prévenir la profondeur ?

    Merci d'avance...

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Voici mon print_array
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    Array
    (
        [0] => Array
            (
                [name] => Canins
                [url] => 8
                [subs] => Array
                    (
                        [0] => Array
                            (
                                [name] => Chiens
                                [url] => 12
                                [subs] => 
                            )
     
                        [1] => Array
                            (
                                [name] => Loups
                                [url] => 11
                                [subs] => 
                            )
     
                    )
     
            )
     
        [1] => Array
            (
                [name] => Félin
                [url] => 1
                [subs] => Array
                    (
                        [0] => Array
                            (
                                [name] => Grands Félins
                                [url] => 2
                                [subs] => Array
                                    (
                                        [0] => Array
                                            (
                                                [name] => Lions
                                                [url] => 4
                                                [subs] => 
                                            )
     
                                        [1] => Array
                                            (
                                                [name] => Panthères
                                                [url] => 3
                                                [subs] => 
                                            )
     
                                        [2] => Array
                                            (
                                                [name] => Tigres
                                                [url] => 6
                                                [subs] => 
                                            )
     
                                    )
     
                            )
     
                        [1] => Array
                            (
                                [name] => Petits Félins
                                [url] => 5
                                [subs] => 
                            )
     
                    )
     
            )
     
        [2] => Array
            (
                [name] => Poissons
                [url] => 7
                [subs] => Array
                    (
                        [0] => Array
                            (
                                [name] => Requins
                                [url] => 10
                                [subs] => 
                            )
     
                        [1] => Array
                            (
                                [name] => Saumons
                                [url] => 9
                                [subs] => 
                            )
     
                    )
     
            )
     
    )
    et un test de parcours pour générer une liste non ordonnée
    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
     
    function foreachArray($array){
    	$html = "";
    	if ( count($array )> 0 ) {
    		$html .= '<ul>';
    		foreach($array as $item){
    			$html .= '<li><a href="?'.$item['url'].'">'.$item['name'].'</a> ';
    			if(is_array($item['subs'])) foreachArray($item['subs']);
    			$html .= '</li>';
    		}
    		$html .= '</ul>';
    	}
     
    	return $html;
    }
    /* Résultat
    <ul>
    	<li><a href="?8">Canins</a> </li>
    	<li><a href="?1">Félin</a> </li>
    	<li><a href="?7">Poissons</a> </li>
    </ul>
    */

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function foreachArray($array){
    	$html = "";
    	if ( count($array )> 0 ) {
    		$html .= '<ul>';
    		foreach($array as $item){
    			$html .= '<li><a href="?'.$item['url'].'">'.$item['name'].'</a> ';
    			is_array($item['subs']) ? $html .= foreachArray($item['subs']) : null;
    			$html .= '</li>';
    		}
    		$html .= '</ul>';
    	}
    	return $html;
    }

  6. #6
    Membre actif Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Points : 214
    Points
    214
    Par défaut
    Un array se parcours très bien sans en connaître la profondeur.

    J'avais oublié de copier coller ce code, mais je vois que le tiens est identique.

    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
     
    function displayMenu($array) {
    	$html = "<ul>";
    	foreach($array as $row) {
    		$html .= '<li>';
    		if(is_array($row['subs']) && count($row['subs']) > 0) {
    			$html .= displayMenu($row['subs']);
    		} else {
    			$html .= '<a href="' . $row['url'] .'">' . $row['name'] .'</a>';
    		}
    		$html .= '</li>';
    	}
    	$html .= "</ul>";
    	return $html;
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par firehist Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function displayMenu($array) {
    ...
    }
    + 10 sur le nom de la fonction.

    Merci pour ton aide.

  8. #8
    Membre actif Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Points : 214
    Points
    214
    Par défaut
    Y'a pas d'quoi!

    Bon dév'

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

Discussions similaires

  1. [conseil] module adéquat pour le site?
    Par dhay06 dans le forum Débuter
    Réponses: 1
    Dernier message: 16/04/2012, 10h11
  2. Cherche désespérement une solution pour mes menus..
    Par Mézza dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 25/06/2010, 12h28
  3. Créer un module pour mon site.
    Par karimage dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 30/03/2009, 21h51
  4. Recherche un hébergement pour mes sites
    Par matinho dans le forum Domaines
    Réponses: 10
    Dernier message: 09/04/2008, 21h34
  5. [Conception] comment simplement créer des menus boutons pour mon site?
    Par irnbru dans le forum Webdesign & Ergonomie
    Réponses: 1
    Dernier message: 10/05/2007, 17h08

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