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 éprouvé
    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
    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 expérimenté 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 : 38
    Localisation : France

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

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    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 éprouvé
    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
    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 éprouvé
    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
    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 éprouvé
    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
    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 expérimenté 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 : 38
    Localisation : France

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

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    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 éprouvé
    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
    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 expérimenté 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 : 38
    Localisation : France

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

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    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