Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

    Bonjour à tous,

    Je cherche à comprendre comment Joomla 1.6 utilise ces champs... Je suppose que cela signifie "left join" et "right join" (je suis pas expert sql), mais avec quelles tables ces champs font des liens ??

    Deux exemples concrets, les tables "jos_assets" et "jos_usergroups" utilisent ces champs...

    Merci d'avance pour votre aide

  • #2
    Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

    Bonjour,
    rien à voir avec une jointure. Tu as oublié dans le lot la table des catégories.

    [long et technique]

    Toutes ces tables contiennent des structures arborescentes de type parent/enfant.

    Quand on veut exploiter ces données, on est amené régulièrement a examiner un élément, et tous ses parents au-dessus pour appliquer les mécanismes d'héritage.
    Or si chaque élément de la table contient bien l'id du parent, pour ramener tous les parents, il faudrait faire une jointure pour ramener le premier parent, puis rebelote pour le parent du parent etc. jusq'à trouver un élément racine. N requètes, N indéterminé, donc un truc lourd et merdique.

    D'où l'astuce d'enfer : on dessine (virtuellement) l'arborescence des éléments, la racine en base et les enfants en dessous etc, une jolie arborescence. Puis on numerote chaque élément, à gauche (lft) et à droite (rgt) de la manière suivante :
    Je mets 1 à gauche de la racine. Je commence à descendre et chaque fois que rencontre un élément je fais +1 et je le pose à gauche de l'élément.
    Arrivé en bout le branche, je fais plus 1, je le pose à droite, et je remonte. Si je rencontre une fourche, je redescends ; sinon, +1 et je le pose à droite. Etc. jusqu'à poser le rgt de la racine.

    Voir l'image jointe...
    Cliquez sur l'image pour l'afficher en taille normale

Nom : arbre.jpg 
Affichages : 1 
Taille : 16,2 Ko 
ID : 1797702

    À quoi ça sert ?

    Si je cherche les ancètres d'un élément, je prends tous les enregistrements qui ont un lft plus petit que mon élément ET un rgt plus grand. Dans mon exemple les ancètres de (19,20) sont (18,149) (17,338) (10,533) et (1,880). Et si je trie sur lft croissant je les ai du plus "haut" au plus "bas" je n'ai qu'à parcourir la liste dans l'ordre pour calculer par exemple l'héritage d'un droit.

    Donc en une seule requète simple je sais récupérer dans le bon ordre tous les ancètres d'un élément !

    L'insertion dans l'arbre reste simple : le nouvel élément par définition n'a pas (encore) d'enfant : je trouve le parent, je prends sont lft X,
    > X+1 pour le lft de l'élément,
    > X+2 pour le rgt de l'élément, et reste à faire +3 sur tous les autres lft et rgt de la table qui sont > X

    Par contre l'insertion de masse est singulièrement compliquée... Dans le migrator (reprise de la 1.5) les éléments sont insérés un à un suivant la méthode précédente (pas possible d'envisager un ordre SQL insert global !)

    En fait un recalcul de l'arbre est au menu pour les catégories et les groupes dans les menus correspondant. Mais je n'ai pas (encore) trouvé l'équivalent pour la table assets.
    [/long et technique]
    Schtroumpfe toi le Schtroumpf t'aidera.
    Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

    Commentaire


    • #3
      Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

      Salut Grand Schtroumpf,

      Pour commencer merci pour ta réponse très complète. Le principe est déjà nettement plus clair pour moi (après reste à le mettre en pratique :-) )

      Je suis tombé sur un article qui explique comment faire les requêtes, c'est quand même assez complexe pour quelqu’un qui n'est pas un pro des requêtes SQL... (pour ceux que ça intéresse : http://mikehillyer.com/articles/mana...data-in-mysql/ )

      Je cherche à ajouter une catégorie (par exemple) depuis un composant que j'essaie de développer. Je suppose qu'il y a des fonctionnalités du framework de Joomla qui permet de faire cela, mais je n'ai pas encore trouvé d'exemple... Je cherche depuis hier seulement...

      J'ai vu dans la doc sur joomla.org qu'il y a une class JTableNested mais je ne vois pas trop comment utiliser ces méthodes, par exemple quelles valeur doit-on passer en paramètres...je dois y aller mais je continue ma recherche cette après-midi...

      Commentaire


      • #4
        Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

        Bonjour,

        La méthode que décrit Grand Schtroumf s'appelle La représentation intervallaire.
        Un excellent tutorial sur le site du zéro ici.

        J'y ai été confronté avec mon composant car à l'installation il doit créer une catégorie, et
        à la désinstallation il doit supprimer les catégories qui ont été créées.
        Évidemment il faut tenir compte de la représentation intervallaire lors de la création/suppression sous peine de ruiner complètement la table categories.

        Par contre ce que je n'arrive pas à comprendre c'est comment définir le champ asset_id lors de la
        création d'une catégorie.

        Est ce que quelqu'un aurait une idée ?

        Merci

        Commentaire


        • #5
          Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

          Salut duddy67,

          Je suis pas un expert, mais voilà comme je vois les choses :

          La table "jos_assets" contient les champs id, parent_id, lft, rgt, level, name, title, rules

          Si je devais insérer une nouvelle catégorie, je commencerai par la créer dans la table "jos_categories" en récupérant l'id une fois enregistré.

          Ensuite créer une entrée dans la table "jos_assets" (il faut connaître le parent de ta catégorie) et faire le décalage rgt puis lft (depuis le parent) et ensuite l'insertion. Le "title" est composer du nom_du_composant.type.categorieId (ex: com_content.category.15) et les champs rules avec les paramètres vide ou avec des droits spécifiques, cela dépend de ce que tu veux faire. Récupère l'"asset_id" de l'entrée que tu viens de faire. (ne pous oublier d'augment le level du parent de +1)

          Met à jour ta catégorie (dans "jos_categories") avec l'"asset_id" que tu as récupérer avant.

          La table "jos_assets" est un comme un enregistrement à double (pour les catégories, articles, ... ) dans le but de gérer tous les droits (au même endroit) dans cette table.

          En espérant que ca t'aide, bon développement.
          Dernière édition par jean82 à 24/08/2011, 13h55

          Commentaire


          • #6
            Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

            Salut Grand Schtroumpf,

            En testant l'insertion dans une structure arborescente de type parent/enfant, il y a un détail qui me tracasse...

            Je ne comprends pas bien pourquoi "et reste à faire +3 sur tous les autres lft et rgt de la table qui sont > X", 2+1 = 3, oui mais en faisant des tests et regardant les valeurs lft et rgt suivant cela créait un trou de 1, tandis qu'en augmentant de +2 les valeurs se suivaient... Du moment que les valeurs se suivent, cela veut bien dire que l'insertion c'est déroulé de manière correcte

            Commentaire


            • #7
              Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

              Re,
              oui effectivement, +2 c'est mieux
              Schtroumpfe toi le Schtroumpf t'aidera.
              Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

              Commentaire


              • #8
                Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

                Bonjour

                Je tombe sur ce sujet intéressant
                Je dois créer des catégories en SQL depuis un fichier texte , quelle est la meilleure maniere d'avoir un right left juste dans #__assets , il y a une fonction php ou joomla existante ?

                merci

                Commentaire


                • #9
                  Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

                  Je viens de trouver le bouton reconstruire

                  Commentaire


                  • #10
                    Re : Question sur les champs "lft" et "rgt" de certaines tables de Joomla 1.6

                    Bonjour,

                    Merci de toutes ces précisions. Cependant, grâce à vous, je me retrouve à un problème de taille...
                    Je suis actuellement en train de migrer des articles d'un ancien CMS. J'ai près de 900 articles.
                    J'ai donc créé un fichier php pour récupérer toutes les valeurs des tables de mon ancienne base de données que j'insère dans la table content très correctement avec les catégories associées.
                    Maintenant, je dois générer la table assets avec les fameux rgt, lft... c'est là que votre exposé complique grandement mon affaire qui était si simple avant !

                    Comment faire pour générer cette table assets s'il faut perpétuellement décaler les numéros à chaque insertion d'un article ?

                    Cordialement,
                    Mickaël
                    GymLike.net - Réseau social de la gymnastique

                    Commentaire

                    Annonce

                    Réduire
                    Aucune annonce pour le moment.

                    Partenaire de l'association

                    Réduire

                    Hébergeur Web PlanetHoster
                    Travaille ...
                    X