Partage
  • Partager sur Facebook
  • Partager sur Twitter

Menu multiniveaux

PHP / MySQL / JavaScript

    12 décembre 2010 à 15:35:02

    Bonjour à tous,

    Je viens de faire un menu multiniveaux(5 niveaux de profondeur), comme j'ai beaucoup de données pour chaque niveau j'ai fait une table(MySQL) pour chaqu'un d'eux.

    Ce que j'aimerais faire c'est afficher le premier niveau du menu dans un SELECT et ensuite quand je clique sur une valeur de ce SELECT il me sort tous les sous menu de celui-ci dans un autre select et ainsi de suite jusqu'au dernier niveau.

    Il y a un très bon exemple sur ce site

    D'avance merci pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2010 à 15:53:38

      J'avais fais exactement le même type de menu, avec une profondeur de 4 car plus me servait à rien.
      Et j'en avais profiter pour utiliser la Représentation Intervallaire.

      En soit tu dois faire appel à de l'Ajax à travers des onSelect, ainsi à chaque option cliqué tu transmet l'id à une page Php qui va te renvoyer l'ensemble des données "enfant" de l'id.
      Tu récupère ces données puis tu les injectes dans le select suivant. Et le tour est joué :) .

      Un exemple de fonction, envoie / réception (mais a adapté selon ton cas).
      // oSelect = <select> ; level = niveau hierarchie
      function request(oSelect, level) {
      	
      	var cache = getElementsByClassName("cache");
      	// cache les catégories lors d'un change
      	for(i=(level+1); i<=3; i++)
      	{
      		// cache le cate +1
      		var element = document.getElementById("cate"+i);
      		element.style.display = "none";
      		
      		// boucle tant qu'un enfant existe
      		while (element.firstChild) {
      			// le supprime
      			element.removeChild(element.firstChild);
      		}
      	}
      	
      	// valeur <select>
      	var oSelect = oSelect.options[oSelect.selectedIndex];
      	var value = oSelect.value;
      	var nom = oSelect.firstChild.nodeValue;
      	
      	// objet xhr (init)
      	var xhr   = getXMLHttpRequest();
      	
      	xhr.onreadystatechange = function() {
      		if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
      			readData(xhr.responseXML, level);
      			document.getElementById("loader").style.display = "none"; // cache loader
      		} else if (xhr.readyState < 4) {
      			document.getElementById("loader").style.display = "inline"; // affiche loader
      		}
      	};
      	
      	xhr.open("POST", "traitementCategorie.php", true);
      	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      	xhr.send("id="+value+"&level="+level);
      }
      
      unction readData(oData, level) {
      	var nodes = oData.getElementsByTagName("item");
      	
      	if(nodes.length>1)
      	{
      	document.getElementById("cate"+(level+1)).style.display = "inline";
      
      
      	var oSelect = document.getElementById("cate"+parseInt(level+1));
      	var oOption, oInner;
      	
      	for (var i=0, c=nodes.length; i<c; i++) {
      		oOption = document.createElement("option");
      		oInner  = document.createTextNode(nodes[i].getAttribute("name"));
      		oOption.value = nodes[i].getAttribute("id");
      		
      		oOption.appendChild(oInner);
      		oSelect.appendChild(oOption);
      		}
      	}
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
        12 décembre 2010 à 16:46:52

        Merci pour t'as réponse lieo je vais essayer ca.

        (Pour la représentation intervallaire je ne sais pas si c'est une bonne solution pour un menu qui peu évolué en tout temps).
        • Partager sur Facebook
        • Partager sur Twitter
          12 décembre 2010 à 16:55:38

          Je disais ça surtout vis à vis des 5 menus liés de ton exemple.
          Dans ce cas la représentation intervallaire peut être très intéressante, même si peut être difficile à appréhender au début.

          Cette représentation permet de faire une modèle pouvant s'étendre sans aucune limite en profondeur et en largeur, et ceux facilement. Ainsi si tu veux rajouter 10 catégories tu pourrais, et ceux sans t'embêter avec les enfants liés au parents, car grâce à ce modèle tu sais exactement qui est quoi, tu peux récupérer tous les fils, tous les parents, etc.

          Par exemple un forum utilise normalement ce modèle, et comme exemple plus concret le SDZ utilise cette représentation pour organiser ces Cours ;) .

          Après pour un menu c'est pas forcément indispensable, mais pour classer des catégories c'est très pratique.
          [fin de la minute cours]

          C'était surtout pour t'apprendre une autre méthode, mon code de toute manière te présente globalement le travail en Ajax, qui n'est pas vraiment lié à un modèle de représentation particulier.
          • Partager sur Facebook
          • Partager sur Twitter
            12 décembre 2010 à 16:59:33

            ok merci encore pour tes conseils, je vais aller voir le cour sur la représentation intervallaire et essayer de comprendre comment ca marche.
            • Partager sur Facebook
            • Partager sur Twitter

            Menu multiniveaux

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown