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

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Alorsladaccord, 17 Mars 2017.

  1. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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 !
     
  2. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 466
    J'aime reçus:
    12
  3. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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 ?
     
  4. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 800
    J'aime reçus:
    30
    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)
     
  5. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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... ?
     
  6. elji
    elji WRInaute occasionnel
    Inscrit:
    6 Juin 2009
    Messages:
    265
    J'aime reçus:
    0
    Je sais que c'est pas le sujet, mais pour le SEO, ça me parait pas une bonne idée de faire ça...
     
  7. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    Mouaif... On peut changer la catégorie sans changer l'url de la page de destination.
     
  8. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 927
    J'aime reçus:
    2
    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
     
  9. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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.
     
  10. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 927
    J'aime reçus:
    2
    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 ?
     
  11. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    Ah bah non, là ça m'apparaît être la question qui ne se pose pas. Si c'est infini, c'est infini, point.

    A un seul niveau ? Parent-enfant ? Ca c'est facile.

    Bah, même réponse que ci-dessus.

    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.
     
  12. niap
    niap WRInaute discret
    Inscrit:
    17 Octobre 2009
    Messages:
    139
    J'aime reçus:
    0
    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.
     
  13. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    Mais quand tu dis "les structurer", ça veut dire quoi ?
     
  14. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 927
    J'aime reçus:
    2
    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:
     
  15. Furtif
    Furtif WRInaute passionné
    Inscrit:
    9 Août 2005
    Messages:
    2 082
    J'aime reçus:
    4
    La reflexion la plus sensée de ce topic...
     
  16. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 466
    J'aime reçus:
    12
    Ne serait-ce qu'au niveau UX...
     
  17. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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.
     
  18. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 466
    J'aime reçus:
    12
    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) ?
     
  19. Furtif
    Furtif WRInaute passionné
    Inscrit:
    9 Août 2005
    Messages:
    2 082
    J'aime reçus:
    4
    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
     
  20. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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...
     
  21. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 927
    J'aime reçus:
    2
    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
     
  22. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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.
     
  23. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 466
    J'aime reçus:
    12
    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.
     
  24. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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".
     
  25. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 466
    J'aime reçus:
    12
    Ca serait bien la première fois que Spip s'avérerait être un exemple à suivre :lol:
     
  26. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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 ?
     
  27. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 927
    J'aime reçus:
    2
    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
     
  28. Alorsladaccord
    Alorsladaccord WRInaute impliqué
    Inscrit:
    30 Juillet 2014
    Messages:
    523
    J'aime reçus:
    0
    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
     
  29. longo600
    longo600 WRInaute accro
    Inscrit:
    24 Février 2005
    Messages:
    2 543
    J'aime reçus:
    0
    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.
     
  30. longo600
    longo600 WRInaute accro
    Inscrit:
    24 Février 2005
    Messages:
    2 543
    J'aime reçus:
    0
    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.