lien entre catégorie et utilisateur - fonction dans l'API

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

  • [RÉGLÉ] lien entre catégorie et utilisateur - fonction dans l'API

    Bonjour,

    n'ayant pas su trouver la fonction qui va bien dans l'API Joomla, je me retourne vers vous : pour une catégorie donnée, j'aimerais connaitre tous les utilisateurs ayant le droit de publier de l'information dans cette catégorie.

    La fonction getAuthorisedCategories (JUser) permet, pour un utilisateur donné, de savoir dans quelles catégories il dispose d'un droit donné (comme publier de l'info). Je recherche donc la fonction inverse de celle-ci.

    En analysant le contenu de la BDD, la table assets contient toutes les informations nécessaires à mon besoin. Pour une catégorie données, je vois quels droits sont appliqués. Mais en fait, je ne vois qu'une partie des droits appliqués car cette catégorie peut être la fille d'une autre. Dans ce cas, il faut que je remonte toute l'arborescence des catégories pour lire l'ensemble des droits afin de pouvoir définir de façon exhaustive quels sont les utilisateurs qui peuvent effectuer une action sur la catégorie que j'étudie (notion d'héritage des ACL). Faut-il que j'écrive cette fonction, ou existe-elle dans l'API ?
    Merci à vous pour les pistes dont vous voudrez bien me faire part.

  • #2
    Re : lien entre catégorie et utilisateur - fonction dans l'API

    Hum, c'est peut-être plus compliqué que cela puisqu'il y a une notion de parent pour les acl (table assets) et pour les catégories. Est-ce qu'il faut que je parcours à la fois les assets et les catégories parentes pour être exhaustif ? Ou est-ce que la table assets suffit (en remontant parent_id et en partant de l'assets de la catégorie que j'étudie)?

    Commentaire


    • #3
      Re : lien entre catégorie et utilisateur - fonction dans l'API

      Salut,
      n'oublie pas que tout peut se récupérer par son ID dans joomla.
      Peut-être que ce post pourra te mettre sur une piste :
      [RÉGLÉ] Comment récupérer l'ID d'un niveau d'accès et l'iD de la langue
      Un message d’erreur sur votre site Joomla ... ayez le reflexe de consulter lla base de connaissance : https://kb.joomla.fr

      Ce forum, vous l'aimez ? il vous a sauvé la vie ? Vous y apprenez chaque jour ? Alors adhérez à l'AFUJ https://www.joomla.fr/association/adherer

      Commentaire


      • #4
        Re : lien entre catégorie et utilisateur - fonction dans l'API

        Merci Ghazal pour cette piste.

        Toutefois, je ne crois pas pouvoir m'en inspirer car elle se base sur l'id de l'utilisateur, qui est pour moi le point d'arrivée et non le point départ de ma recherche (le point de départ étant l'id de la catégorie).

        Il faut peut-être que je fouille dans le code de la partie administrator, puisque ce que je recherche est presque fait dans l'écran des droits de la catégorie => pour une catégorie donnée, le backend m'affiche les droits en fonction des groupes d'utilisateurs. Il me manquerait alors le lien entre groupes et utilisateurs (mais là encore, j'ai l'impression que l'API marche dans "l'autre sens"; pour un utilisateur donné l'API permet de récupérer les groupes de cet utilisateur. Comment fait-on trouver les utilisateurs d'un groupe à partir de l'id de ce groupe ?)

        A suivre !

        Commentaire


        • #5
          Re : lien entre catégorie et utilisateur - fonction dans l'API

          Pose ta question sur stackexchange :
          Joomla Stack Exchange
          Q&A for Joomla! administrators, users, developers and designers


          ou sur le googlegroup
          Joomla! General Development - Google Groups


          Il suffit de s'inscrire dans les 2 cas.
          Un message d’erreur sur votre site Joomla ... ayez le reflexe de consulter lla base de connaissance : https://kb.joomla.fr

          Ce forum, vous l'aimez ? il vous a sauvé la vie ? Vous y apprenez chaque jour ? Alors adhérez à l'AFUJ https://www.joomla.fr/association/adherer

          Commentaire


          • #6
            Re : lien entre catégorie et utilisateur - fonction dans l'API

            Ok, fait. Je complèterai ce post si j'obtiens des réponses sur ces forums
            le lien vers stackexchange : http://joomla.stackexchange.com/ques...-in-a-category
            pour le groupe google : https://groups.google.com/forum/#!to...al/xlqYr_i1gJk

            Commentaire


            • #7
              Re : lien entre catégorie et utilisateur - fonction dans l'API

              Pourquoi tu ne fais pas une boucle sur tous les users et tu regardes la sortie de getAuthoriseCategories.

              Voila comment je partirai.
              ++
              Wis

              Commentaire


              • #8
                Re : lien entre catégorie et utilisateur - fonction dans l'API

                Merci Wismer de cette réponse. En effet, cela peut-être une façon de faire. Seulement je dispose de plus de 500 comptes utilisateurs (intranet), aussi je ne pense pas que cela soit la solution la plus efficace.
                D'ailleurs, je vois que c'est la nuance que l'on me fait aussi sur le groupe google.
                Mais je garde cette possibilité en tête.
                ++
                Dernière édition par juillet à 05/10/2015, 08h00

                Commentaire


                • #9
                  Re : lien entre catégorie et utilisateur - fonction dans l'API

                  je suis arrivé à mes fins, voici comment :
                  - on récupère les asset_id dont dépend la catégorie étudiée
                  - on récupère les règles d accès pour chacun des asset_id récupérés
                  - on extrait de ces règles les group_id ayant le droit a 1
                  - a partir des group_id on recupère les utilisateurs de ce groupe

                  voici le code qui répond à cela:
                  Code PHP:
                                  $db JFactory::getDBO();

                                  
                  // 1 - on recupere les asset_id dont depend la categorie
                                  
                  $query_asset_id 'SELECT asset_id FROM #__categories WHERE id="'.$catid.'"';
                                  
                  $db->setQuery$query_asset_id );
                                  
                  $asset $db->loadResult(); // recuperation d un resultat unique
                                  
                  $table_asset_id[] = $asset//on stocke la valeur courante
                                  
                  while ($asset!= '0')
                                          {
                                          
                  //process recurssif pour remonter l arborescence de parent_id jusqu a ce que categorie.asset_id = 0
                                          
                  $query_asset_parent_id 'SELECT parent_id FROM #__assets WHERE id="'.$asset.'"';
                                          
                  $db->setQuery$query_asset_parent_id );
                                          
                  $asset $db->loadResult(); // recuperation d un resultat unique
                                          
                  $table_asset_id[] = $asset//on stocke la valeur courante
                                          
                  }
                                  
                  $table_asset_id array_reverse($table_asset_id); //on inverse les elements du tableau pour commencer de l asset initial (asset_id = 0) a l'asset_id de la categorie etudiee en passant par les asset_id filles
                                  //2 - on recupere les regles d acces pour chacun des asset_id
                                  
                  foreach($table_asset_id as $a)
                                          {
                                          
                  $assetRules[] = JAccess::getAssetRules($a);
                                          }
                                  
                  //on regroupe les droits des groupes sur l ensemble des assets
                                  
                  $ensemble = new JAccessRules;
                                  
                  $ensemble->mergeCollection($assetRules);
                                  
                  $ensemble $ensemble->getData();
                                  
                  //3 - on recupere les group_id et le droit pour core.edit.own et core.edit.state
                                  
                  $own $ensemble['core.edit.own']; //=> {"5":1,"12":1,"14":0,"6":1...}
                                  //on supprime les { }
                                  
                  $own substr($own,1,-1); //=> "5":1,"12":1,"14":0,"6":1...
                                  
                  $chaine_own explode(",",$own);// tableau [0] => "5":1, [1] =>"12":1 ...
                                  //on parcours l ensemble des elements de $chaine_own pour identifier ceux qui ont 1 en permission cad group_id = 5, 12, 6
                                  
                  foreach($chaine_own as $c)
                                          {
                                          if(
                  preg_match('/\"[0-9]*\":1/',$c,$match1)) //si $c est du type "x":1 => alors on extrait la valeur de x (group_id)
                                                  
                  {
                                                  
                  $val explode("\":1",$c);
                                                  
                  $group_id[] = substr($val[0],1);
                                                  }
                                          }
                  var_dump($group_id); 
                  Il reste à récupérer les utilisateurs des groupes (pas de difficulté en soi).
                  Il faut inclure le test sur core.edit.state (en plus de core.edit.own)
                  Merci a tous pour vos contributions
                  Dernière édition par juillet à 14/10/2015, 17h07

                  Commentaire


                  • #10
                    Re : lien entre catégorie et utilisateur - fonction dans l'API

                    Humm, en relisant mon code, je vois qu'il y a des opérations inutiles : pas besoin de l'étape :
                    Code PHP:
                    $table_asset_id array_reverse($table_asset_id); //on inverse les elements du tableau pour commencer de l asset initial (asset_id = 0) a l'asset_id de la categorie etudiee en passant par les asset_id filles 
                    Elle ne sert à rien.
                    De plus en lisant la doc de getAssetRules(), il semble possible de récupérer les drois sur la catégorie fille sans avoir à remonter toute l'arborescence de cette catégorie :
                    Code:
                    getAssetRules
                    
                    Method to return the JAccessRules object for an asset. The returned object can optionally hold only the rules explicitly set for the asset or the summation of all inherited rules from parent assets and explicit rules.
                    getAssetRules(mixed $asset, boolean $recursive = false) : \JAccessRules
                    Je n'ai pas encore fait le test. Cela simplifierait complètement le code !

                    Commentaire

                    Annonce

                    Réduire
                    Aucune annonce pour le moment.

                    Partenaire de l'association

                    Réduire

                    Hébergeur Web PlanetHoster
                    Travaille ...
                    X