Comment programmeriez-vous un menu avec sous-catégories infinie ?

WRInaute occasionnel
Bonjour,

J'ai un peu de mal à me représenter la chose :
Vous créez un menu dans laquelle chaque catégorie peut devenir une catégorie parente et ceci à "l'infini". On a donc categorie_parente/sous_categorie_parente/sous_sous-categorie_parente/sous_sous_sous_categorie_parente, etc....

Il est facile de lier une sous-catégorie à une catégorie parente, en récupérant l'id de cette dernière. Mais si on a 4 ou 10 sous-catégories, comment aller les récupérer en boucle ? J'imagine une sorte de boucle while avec une variable incrémentée à chaque fin de boucle, afin de récupérer les catégories parentes d'un rang supérieur. Mais c'est encore assez abstrait.

Le concept étant déjà connu et appliquée sur bien des scripts, savez-vous comment ils s'y prennent ?

Merci d'avance !
 
WRInaute occasionnel
Salut UsagiYojimbo,

Est-ce que j'ai bien compris si je dis que dans la page que tu nous montres, il est question d'un nombre certes élevé, mais néanmoins fini de catégories :
Code:
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';
Là, le codeur part sur une base de quatre niveaux de catégories. Comment son code peut-il fonctionner si le nombre de catégories parentes change sans arrêt, parce qu'on a rajoute et qu'on en enlève ? Ici, je ne vois pas de boucle qui modifie les paramètres de la requête.
Je veux dire que dans ce code, on a visiblement 4 niveaux d'enfants. Mais si ce nombre n'est pas connu à l'avance, que va produire cette requête ?
 
WRInaute accro
Il y a plusieurs techniques, les plus connues:
- Adjacency list (id/parent_id)
- MPTT (Modified Preorder Tree Traversal) (left/right)
- Materialized path

La plus facile (mais la plus gourmande) c'est l'adjacency list, il faut faire une fonction récursive:
https://www.sitepoint.com/hierarchical-data-database/
(Ce tuto explique aussi le système MPTT)
 
WRInaute occasionnel
Hum... Merci pour les liens, Spout. En attendant une réponse à ma question qui précède ton message, me trompe-je en disant que de programmer un menu hiérarchique de ce type n'est pas supposé être quelque chose de facile et que le cas échéant, je m'apprête à galérer toute la semaine prochaine... ?
 
WRInaute occasionnel
Alorsladaccord a dit:
si le nombre de catégories parentes change sans arrêt, parce qu'on a rajoute et qu'on en enlève ?

Je sais que c'est pas le sujet, mais pour le SEO, ça me parait pas une bonne idée de faire ça...
 
WRInaute accro
Si je ne dis pas de bêtise WRI fonctionne avec des sous catégories "infinies". En tout cas au vu de l'annuaire.
De plus il me semble que WRI tourne avec wordpress (amélioré certe). Le peu que j'ai vu de la structure de la bdd de wordpress ca semble utiliser la méthode id/parent_id (taxons).
Ca doit être la cache qui permet surement de palier à la lourdeur de cette méthode. Ca reste à confirmer
 
WRInaute occasionnel
Pour ce qui est de wordpress et pour ce que j'en sais, les thèmes n'affichent jamais de menu avec une infinité de sous-catégories. C'est-à-dire que passé le second niveau, elles s'affichent toutes les unes derrière les autres, comme si de rien n'était. Ca fait que seulement la moitié du travail est fait.

Par contre sur certains scripts de forum ou de commentaires, on a effectivement des séries de sous-commentaires infinies, pour chaque commentaire. Mais dans ce cas c'est plus facile aussi, car on ne réorganise pas les commentaires comme on pourrait le faire avec les catégories, on changeant le parent.
 
WRInaute accro
Quand tu dis infini, quel niveau de profondeur moyen compte tu atteindre ?
Combien de catégories et sous catégories envisages tu (des dizaines, des centaines, des milliers...) ?
As tu essayé de faire un test avec la première méthode id/parent_id ? (même si c'est la moins efficace, mais la plus simple a comprendre et mettre en place)
Ton arborescence est elle souvent modifiée (à quelle fréquence ?)
Générer le menu puis le mettre en cache, ne serait pas suffisant ?
 
WRInaute occasionnel
noren a dit:
Quand tu dis infini, quel niveau de profondeur moyen compte tu atteindre ?
Combien de catégories et sous catégories envisages tu (des dizaines, des centaines, des milliers...) ?
Ah bah non, là ça m'apparaît être la question qui ne se pose pas. Si c'est infini, c'est infini, point.

As tu essayé de faire un test avec la première méthode id/parent_id ? (même si c'est la moins efficace, mais la plus simple a comprendre et mettre en place)
A un seul niveau ? Parent-enfant ? Ca c'est facile.

Ton arborescence est elle souvent modifiée (à quelle fréquence ?)
Bah, même réponse que ci-dessus.

Générer le menu puis le mettre en cache, ne serait pas suffisant ?
Genre en html basique, écrit à la main sans code ? Si, bien sûr, m'enfin c'est plus la peine d'ouvrir un topic :lol:


Je comprends ta réponse noren, pourquoi faire compliqué quand on peut faire simple. C'est du pratique.
Dans ce topic avant théorique, je voulais déjà évaluer la complexité de la tâche, sur le plan théorique. Et visiblement, c'est assez complexe.
 
WRInaute discret
Alorsladaccord a dit:
Générer le menu puis le mettre en cache, ne serait pas suffisant ?
Genre en html basique, écrit à la main sans code ? Si, bien sûr, m'enfin c'est plus la peine d'ouvrir un topic :lol:
Non c'est pas ça.
L'idée de noren c'est :
- Charger les catégories avec PHP depuis une base de données
- Les structurer
- Exporter les données dans un fichier de cache (HTML, XML, JSON, peut importe)

Quand tu ajoute / modifie / supprime une catégorie, tu efface le cache.
Comme ça, tu évite plein d'accès redondants à la base de données.
 
WRInaute accro
C'est exactement ça niap

Les structurer : faire ta requête, préparer ton arborescence en html ou ce que tu veux (menu) et la mettre en cache. De cette facon meme si ta requete est un peu lourde ca ne gênera presque plus ou de façon très ponctuel.

J'ai quand même du mal à comprendre cette notion de menu avec sous catégories a l'infini. Question surement très bête, car j'imagine évidemment que tu y a réfléchi, mais n'as tu pas d'autres solutions que ces sous catégories a l'infini ?

Pourrais tu donner des exemples concrets de ce que tu veux ? quels cas de figure pourraient engendrer une telle arborescence; Des fois "la vérité est ailleurs" :mrgreen:
 
WRInaute occasionnel
noren a dit:
C'est exactement ça niap

Les structurer : faire ta requête, préparer ton arborescence en html ou ce que tu veux (menu) et la mettre en cache. De cette facon meme si ta requete est un peu lourde ca ne gênera presque plus ou de façon très ponctuel.

J'ai quand même du mal à comprendre cette notion de menu avec sous catégories a l'infini. Question surement très bête, car j'imagine évidemment que tu y a réfléchi, mais n'as tu pas d'autres solutions que ces sous catégories a l'infini ?

Pourrais tu donner des exemples concrets de ce que tu veux ? quels cas de figure pourraient engendrer une telle arborescence; Des fois "la vérité est ailleurs" :mrgreen:

Disons que ne connaissant pas à l'avance le nombre de sous-catégories que peut comporter mon menu, je me dis que le plus sensé est donc de programmer un menu avec une infinité de sous-catégories possible. Afin de ne pas être bloqué par la suite. Mais à en croire les réponses de ce topic, c'est une sorte d'exercice de haute volée.
 
WRInaute accro
C'est surtout qu'il faut aussi se poser la question du rendu graphique final. Si tu parles de menu déroulant, imagines-toi les cas où tu as plus de sous-catégories que de place pour les afficher. Tu repars dans l'autre sens (dans le cas d'un menu horizontal) ?
 
WRInaute accro
Mais à en croire les réponses de ce topic, c'est une sorte d'exercice de haute volée.

Surtout que tu es le seul a connaitre le site/thematique/projet en question.. si tu ne trouve pas de reponses/solutions c'est que tu poses mal le probleme a la base, mais sans connaitre les tenants et aboutissants on est dans le flou le plus total...

En 20 ans de web j'ai jamais vu de cas identique, et ce, quel que soit le probleme ou l'importance du site.. Donc je pense que tu es parti tete baissée dans une direction, alors qu'il doit y en avoir beaucoup d'autres. J'aimerai bien savoir ce qui pourrait engendrer "Si c'est infini, c'est infini, point."..

Ha yes... tu veux concurrencer gogole...

:D :D :D :D
 
WRInaute occasionnel
Bon, j'ai laissé tomber l'idée, de toute façon le rendu à l'affichage serait problématique. Comme quoi, internet n'est pas encore adapté à tous les cas informatiques possible.

Ceci dit, pour faire avancer le schmilblick, je crois qu'une manière simple et efficace de faire un menu dynamique "infini", c'est tout simplement d'utiliser ajax.

Comme moi je sais pas faire, ça enterre doublement le problème, mais bon...
 
WRInaute accro
En effet sans en savoir plus que ca, rien qu'au niveau du rendu ta solution ne paraissait pas viable.
Si tu as vraiment beaucoup de sous menu tu n'aura peut être pas d'autre choix que de faire quelque chose qui se rapproche de l'annuaire de WRI. En gros on accède aux sous catégories seulement quand on a cliqué sur la catégorie parente.

Mais dans tous les cas il faudra faire attention a la façon de structurer tout ça et a la façon de l'afficher si tu ne veux pas avoir de requêtes gourmandes. Surtout si tu utilises la solution classique id/id parent
 
WRInaute occasionnel
L'annuaire wri est tout ce qui se fait de plus classique, sur le plan technique. Ca ne me parait pas valable pour un menu vertical multi-pages. Je verrai pour faire ça en ajax, dans un second temps.

Merci pour vos réponses. Nous y reviendrons.
 
WRInaute accro
En listant toutes tes pages dans un menu, tu te tires autant une balle dans le pied côté UX que côté SEO à mon avis.
 
WRInaute occasionnel
Vouaif... Non mais, je ne veux pas lister toutes les pages dans un menu. Mais peu importe.

En fait, ce que je souhaite(ais) reproduire, c'est le système de commentaire du CMS spip.

Si je ne m'abuse, ce SMS permet de répondre à n'importe quel commentaire, ce qui donne des lignées de sous-commentaires hiérarchisées. Le principe est intéressant. Après, c'est vrai que pour l'affichage, certains commentaires s'affichent complètement verticalement, avec une lettre en dessous l'autre... C'est donc illisible. Mais bon, le système demeure pratique. Cela étant, peut-être spip limite-t'il aussi le nombre de réponses à un certain nombre. Ce n'est peut être donc pas un bon exemple de "menu infini".
 
WRInaute occasionnel
Je ne sais pas, je n'ai jamais utilisé ce cms. D'ailleurs, je n'aime pas les cms, je viens de quitter IPB.

Je ne sais pas où pèche Spip, mais enfin, leur système de commentaire/sous-commentaire est quand même chouette et donne souvent lieu à de longs débats en réponse aux articles.

Objection ?
 
WRInaute accro
Pour l'affichage suffit d’éviter le système en escalier après la deuxième réponse à un commentaire, car effectivement ensuite ça devient illisible et absurde

regarde le système de commentaire de jeuxvideo.com, ça pourrait être une réponse à ton probleme
 
WRInaute occasionnel
noren a dit:
Pour l'affichage suffit d’éviter le système en escalier après la deuxième réponse à un commentaire, car effectivement ensuite ça devient illisible et absurde

regarde le système de commentaire de jeuxvideo.com, ça pourrait être une réponse à ton probleme

Système en escalier, tu as trouvé la bonne expression. Mais c'est justement ce que je trouve intéressant. Sans quoi a contrario, on ne voit plus de prime à bord quel est la hiérarchie des commentaires.
Un lien pour les commentaires sur JV ?

Sinon il y a possibilité de faire des incrustations de citations (balise
), directement dans les messages. Le problème, c'est ensuite de pouvoir les éditer.
 
WRInaute passionné
Bonjour,

tu peux aussi prévoir un nombre maximum de sous catégorie, pour 2 raisons :
- il est peu probable qu'au delà du 6eme niveau tu ai quelques chose a remplir, sauf si tu commence par "univers_terrestre/voie_lactée/terre/Europe/france/" ... :D
Pour infos, j'ai 26 000 catégories dans mon projet shopping et il est très rare que j'atteigne le 6eme niveau. En allant jusqu'a 8, tu es pratiquement certain de couvrir tout ce qui peut exister dans cet univers ...
- Il n'est pas très bon pour le référencement d'aller au delà du 4eme niveau si les infos que j'ai son correctes.
 
WRInaute passionné
Pour infos, j'ai procédé de la manière suivante pour la présentation en colonne a Gauche :
MEnu :
ACCEUIL
- CATEGORIE1
- SSCATNIV1_CAT1
- SSCATNIV2_CAT1
- SSCATNIV3_CAT1
- SSCATNIV4_CAT1
(liste sous cat5)
  • sscat5 produit1
    sscat5 produit2
    sscat5 produit3
    sscat5 produit4
    sscat5 produit5

CHAQUE DERNIER NIVEAU est représenté en LISTE des dernières sous-catégories de produits.

J'ai généré dans un champ texte le code html du menu, comme ca je n'ai plus a calculer. Je régénère le code html si il y a des modifs. Il y a un champ ID par niveau, mais aussi un champ ID unique, ce qui permet d'appeler directement la catégorie ID=21364 avec tous les liens menu déjà construits.
 
Discussions similaires
Haut