Créer un menu à plusieurs dimensions à partir d'une table mysql

Eléphanteau du PHP | 10 Messages

02 août 2008, 11:40

bonjour à tous,

Si j'ai bien compris, il est possible de créer un menu à plusieurs dimension à partir d'une base de donnée mysql...

Je souhaiterai un menu qui ressemble à ça :

ITEM (n'ouvre aucune page et ne s'inscrit pas dans le fil d'ariane par la suite)
  • > sub item 1
    > sub item 2
    > sub item 3

    • >sub sub item 1
      >sub sub item 2
ITEM2
  • > sub item 1
    > sub item 2
    > sub item 3
[/b][/color]

etc... les items amenant à un sous menu ne doivent pas être cliquable, et ne doivent pas s'inscrire dans le fil d'ariane ou alors s'inscrire de cette manière :

> le monde > la france > item : sub item

voici le style de menu que j'aimerai créer :

Image

voilou...je ne sais pas du tout si c'est possible en passant par une base de donnée (mais ce serait l'ideal...)...Comme vous avez pu le voir, je debute tout juste et je patauge beaucoup (mais grace a vos conseils ça va de mieux en mieux !), alors un ti coup de mains, ou un aiguillage dans la bonne direction me ferait plaisir et m'aiderai bien !!!

ViPHP
ViPHP | 4039 Messages

02 août 2008, 13:56

Pour représenter une telle arborescence, et pour faire simple, je proposerais un tableau de ce type:

id | nom | id_sup

En gros, un identifiant, le nom complet, et l'identifiant de l'élément supérieur. Avec ça, tu peux faire une arborescence aussi profonde que tu veux. Chaque item à un ID. En cliquant sur l'un ou l'autre item, tu ne fais que faire une liste de tout les items dont il est le parent. Tu peux ainsi remonter de fils en père pour constituer un fil.

Et pour le menu "de base", ils ont simplement comme parent "0".

C'est over-simplifié, mais il faut y aller par petits bouts :wink:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 10 Messages

02 août 2008, 14:07

certe mais cela reviens donc à tout compiler dans un seul et unique tableau ??? ça va etre un tableau monstrueux....et comment avec ce moyen là on génère un menu a plusieurs dimension ???

sinon, j'avais pensé faire plusieurs tableau :

continent (Id_continent, #nom_continent, Url_carte_continent),
pays(ID_Pays, #nom_continent, #nom_pays, Url_carte_pays),
Ville (ID_Ville, #nom_pays, #nom_ville, Url_carte_ville, url_blason, url_drapeau, Supperficie, Densite, population, surnom, specialite)
et enfin une table Menu_ville(ID_menu_ville, #nom_ville, nom_categorie, categorie_parent, url)

c'est pas bon comme méthode ?

ViPHP
ViPHP | 4039 Messages

02 août 2008, 14:51

monstrueux ? Non. je gère des arborescences de plus de 10.000 termes avec un système semblable (mais plus normalisé/optimisé, mais semblable). Et les dimensions ? a l'infini, en fait.

Après, tu peux faire un tableau "contenu", qui d'après l'id de l'élément, définit son contenu (ville, pays, continent, ce que tu veux). La base ne doit pas refléter la structure de ton site. Il doit être simple et efficace. Multiplier les tableaux dans lesquels, objectivement, tu définis le même type de données, c'est complexifier inutilement ta structure.

Pour bien faire, tu devrais avoir un tableau par "type" de donnée. Donc le menu serait bien dans un tableau séparé.

Et, en regardant tes tableaux, je vois déjà que les données sont redondantes. Le pays devrait contenir l'id du continent, et pas son nom, pareil pour les villes. Après, tu pourrais faire un tableau qui lie les cartes à des ID (mais ce serait pousser le bouchon un peu loin :wink: )
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 10 Messages

02 août 2008, 15:17

oki donc g bon sauf sur ma clé etrangere !!! c deja beaucoup mieux qu'hier tout ça !!! héhé !!! (mais en fait je vois pas trop la redondence du bazar...que ce soit le no ou l'id ca revient au meme nom ?)

pour le tableau menu_ville, c'est un tableau qui ne servira qu'a créer le menu a plusieurs dimensions ex:
Image

bon encore une tite question : comment faire lors de la creation de mon menu pour créer générer onclick des pages sur les subitems et pas sur les items ??? idem pour le fil d'ariane : comment faire pour qu'il y ai un lien sur les sous-menui et pas sur les items? est-il possible de ne pas les afficher du tout ?

ex :
monde > europe > france > toulouse > espaces verts : prairie des filtres

voila ce que j'aimerai : espace vert c'est transformé en titre du lieu a visiter et non en lien a par entiere...

j'espere que je suis claire....j'ai bien conscience que ce doit etre pleins de questions bête que je pose...mais j'ai vraiment du mal a comprendre la logique de tout ça...et vos reponses m'aident vraiement beaucoup...
Modifié en dernier par g_roseline le 02 août 2008, 15:18, modifié 1 fois.

ViPHP
ViPHP | 5924 Messages

02 août 2008, 15:18

Soit dit en passant, s'il faut reconstruire une petite partie de l'arbre seulement, il faudra soit sélectionner toute la table, ce qui ne serait pas adapté à des arbres larges, soit sélectionner les enfants niveau par niveau, ce qui ne serait pas adapté à des arbres profonds.
Donc ta méthode Berzemus a le mérite d'être simple à implémenter et peu coûteuse lors d'une modification de l'arbre, mais à bannir totalement pour des opérations plus complexes sur une partie de l'arbre, auquel cas on privilégie une structure d'arbres intervallaires.

Eléphanteau du PHP | 10 Messages

02 août 2008, 15:22

gni ?????? :shock: arbre larges ? arbres profond ? arbre intervallaires ? g rien compris.... :?

ViPHP
ViPHP | 5924 Messages

02 août 2008, 15:30

Arbre large :

Code : Tout sélectionner

a1 |->b1 |->b2 | |->c1 | |->c2 | |->c3 | |->c4 |->b3 |->b4 |->b5 | |->c1 | |->c2 | |->c3 | |->c4 | |->c5 | |->c6 |->b6 |->b7 |->b8 |->b9 |->b10 |->b11 |->b12
Arbre profond :

Code : Tout sélectionner

a1 |->b1 | |->c1 | |->c2 | | |->d1 | | | |->e1 | | | |->e2 |->b2 | |->c1 | | |->d1 | | |->d2 | |->c2 |->b3 | |->c1 | |->c2 | | |->d1 | | |->d2 | |->c3
Arbre intervallaire:
http://sqlpro.developpez.com/cours/arborescence/

Eléphanteau du PHP | 10 Messages

02 août 2008, 15:34

damned moi qui commençais enfin a comprendre......................et en clair pour ma situation tu me conseille quoi ?

ViPHP
ViPHP | 5924 Messages

02 août 2008, 15:42

Cela dépend…
Notamment de :
- Si tu dois reconstruire l'arbre entier à chaque fois ou bien si tu n'as besoin que d'une partie
- Si l'arbre est profond et large
- Si la table contient beaucoup d'enregistrement (confère les deux points précédents)
- Si tu as beaucoup de modifications à faire sur ton arbre
- Si tu te sens d'attaque à implémenter la gestion des arbres intervallaires (d'ailleurs il faudrait que je pense à poster la librairie que j'ai développé…)
- etc…

Je ne dis pas que ce que Berzemus dit est faux. Il est fort probable que ce soit la meilleure solution pour ton cas précis, mais il faut être conscient des limites, et que si l'on commence à posséder un arbre plus complet ou bien des opérations plus complexes qu'une reconstruction totale, cela devient vite un gouffre à performances…

Eléphanteau du PHP | 10 Messages

02 août 2008, 15:45

en fait la seule table que je dois reecrire de manière différente pour chaque ville est la derniere : celle du menu....et une mis à part pour cette table, le reste ne bougera pas....pas de modif...

ViPHP
ViPHP | 4039 Messages

02 août 2008, 19:56

Très chouette article, Sekiltoyai. Je crois que je vais m'amuser avec :wink:

Par contre, g_roseline, on est la dans un niveau assez élevé (d'ailleurs, il est marque "avancé"). Comme Sekil le dis, il est plus que recommandé d'utiliser une solution simple mais efficace, au risque de perdre du temps et de l'énergie inutilement (puisque le résultat seras le même). Une fois ton site fait, tu pourras revenir sur le sujet, et tu pourras le comprendre et l'appliquer plus facilement avec ton expérience déjà faite. Sinon, c'est sans fin que tu vas errer dans le labyrinthe..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 10 Messages

03 août 2008, 02:00

c clair.....deja que je suis assez perdue comme ça...