Utilisation de "JFactory::getUser($displayData['item']"

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

  • [RÉGLÉ] Utilisation de "JFactory::getUser($displayData['item']"

    Bonjour,

    Je voudrais afficher à l'intérieur d'un article les données propres à l'auteur de cet article, comme son nom, son email, mais aussi son adresse par exemple. J'ai donc cherché comment accéder à ces données et j'ai trouvé le fameux "JFactory::getUser($displayData['item']" qui est supposé contenir les informations de l'article en cours d'affichage.

    Cette classe (je crois que c'est comme ça qu'on l'appelle) est tout à fait fonctionnelle dans le template au niveau du programme "author.php", c'est elle qui va chercher les infos affichées en tête de contenu, nom de l'auteur, date de publication, etc...


    Mais elle ne fonctionne plus quand je l'insère dans du code PHP directement dans l'article via le plugin "sourcerer", la fonction "JFactory::getUser($displayData['item']->created_by" ne renvoie rien du tout !

    C'est peut-être une question de contexte, je ne suis pas assez compétent pour le déterminer, mais peut-être quelqu'un ici a la réponse à mon problème ? Soit il faut poser un contexte particulier avant d'utiliser cette classe, soit il faut utiliser une autre classe (que je n'ai pas trouvée !).

    Merci de votre aide.
    Antoine.

  • #2
    Salut

    Qu'est-ce que tu as mis dans $displayData['item']?

    En général, un item est un identifiant de menu. Or JFactory::getUser() doit contenir un identifiant d'utilisateur... Donc, ça m'interpelle.

    Commentaire


    • #3
      Salut Colnem30, voilà le code complet :

      <?php
      defined('JPATH_BASE') or die;
      // accès aux données user :
      $userData = JFactory::getUser($displayData['item']->created_by);
      $authorId = $userData->id;
      // les variables :
      $authorName = JFactory::getUser($displayData['item']->name);
      $authoraddress1 = JUserHelper::getProfile($authorId)->profile['address1'];
      $authorpostalcode = JUserHelper::getProfile($authorId)->profile['postal_code'];
      $authorcity = JUserHelper::getProfile($authorId)->profile['city'];
      // ---
      echo '<p class=wap_author_name>' . JText::sprintf($authorName) . '</p>';
      echo '<p class=wap_author_adress>' . JText::sprintf($authoraddress1);
      echo '<br>' . JText::sprintf($authorpostalcode) . " " . JText::sprintf($authorcity) . '</p>';
      ?>


      Sans oublier que je l'exécute à l'intérieur de l'article en l'insérant dans les balises {source} {/source} du plugin sourcerer. Le code fonctionne parfaitement si je mets directement l'id dans la classe JFactory::getUser(nnn), donc c'est bien le $displayData['item'] qui ne ramène rien à ce niveau-là.

      Commentaire


      • #4
        Hello.

        Code PHP:
        JFactory::getUser(); 
        // retourne un objet contenant les données de l'utilisateur courant

        Code PHP:
        JFactory::getUser($id); 
        // retourne les données de l'utilisateur d'identifiant $id

        Code PHP:
        $userData JFactory::getUser($displayData['item']->created_by); 
        // retourne donc les données de l'utilisateur ayant crée l'item (le champ created_by contient l'id du créateur dans la table #__users et dans ton cas il s'agit du champ created_by de la table #__content)

        Code PHP:
        $authorName JFactory::getUser($displayData['item']->name); 
        // ceci ne marche pas getuser retourne un objet, et $displayData['item']->name n'est pas un identifiant de la table #__users.
        Il faudrait voir dans le code du model la requête sql, mais il est probable que la propriété name du tableau de classes $displayData n'existe pas.

        Par contre :

        Code PHP:
        $authorName=$userData->name// est correct. 
        Ensuite la synthaxe de sprintf est :
        Code PHP:
        JText::sprintf('cle_de_langue',$variable); 
        sprintf sert à insérer des variables dans une chaine (un libellé) qui sera traduite selon la langue de l'utilisateur courant.
        La syntaxe pour l'affichage de tes variables est donc simplement:
        Code PHP:
        echo '<p class=wap_author_name>' $authorName '</p>'
        Bon dev.
        Dernière édition par roland_d_alsace à 24/02/2022, 22h13
        A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
        Rejoignez le Joomla Users Groupe Alsace...
        roland_d_alsace va-t-il devenir roland_du_grand_est ?

        Commentaire


        • #5
          Bonjour Roland,

          J'ai donc changé ma méthode comme tu me l'as indiqué dans l'autre sujet (Joomla3), et effectivement, en passant par les variables de session, je récupère bien le bon "created_by". Le problème maintenant est que cette donnée ne se rafraîchie pas, elle est apparemment enregistrée au premier passage mais n'est plus modifiée lors des changements de contenu. Il faut passer par F5 ou l’icône de rafraîchissement du navigateur pour que l'auteur soit mis à jour, sinon on garde toujours le premier trouvé.

          Pour préciser ce que j'ai fait, j'ai inséré dans le programme "author.php" le code suivant :

          Code PHP:
          $session JFactory::getSession();
          $authorId $displayData['item']->created_by;
          $session->set('authorId'$authorId); 
          .
          Puis dans l'article, toujours via le plugin "sourcerer", je rappelle ma variable :

          Code PHP:
          defined('JPATH_BASE') or die;
          // accès aux données de session avec authorId positionné dans author.php :
          $session JFactory::getSession();
          $authorId $session->get('authorId');
          // echo '<br> authorId = ' . $authorId . '<br>';
          // les variables :
          $authorName JFactory::getUser($authorId)->name;
          $authoraddress1 JUserHelper::getProfile($authorId)->profile['address1'];
          $authorpostalcode JUserHelper::getProfile($authorId)->profile['postal_code'];
          $authorcity JUserHelper::getProfile($authorId)->profile['city'];
          // ---
          echo '<p class=wap_author_name>' $authorName '</p>';
          echo 
          '<p class=wap_author_adress>' $authoraddress1;
          echo 
          '<br>' $authorpostalcode " " $authorcity '</p>'
          .
          J'ai également essayé de spécifier un namespace propre, mais ça ne change rien. J'ai aussi inséré une instruction "clear" à chaque passage mais ça n'y fait rien non plus.

          Je cherche encore...
          Antoine.

          Commentaire


          • #6
            Il faut rajouter l'identifiant de l'article dans le nom de ta variable de cession.

            Par exemple dans si tu stockes dans le layout author :

            Code PHP:
            Factory::setUserState('monarticle.'.$displayData['item']->id,$displayData['item']->created_by); 
            Et dans ton sourcerer
            Code PHP:
            $authorId JFactory::getUserState('monarticle.1050'); 
            Si 1050 est l'id de l'article que tu connais puisque tu est en train de rédiger dedans.

            Comme cela tu est sur que ce sont bien les infos de ton article courant qui sont affichées, même si l'article est affiché dans un module, en blog, ou en vedette et qu'il y en a donc plusieurs d'affichés avec des auteurs différents..

            A noter qu'il est préférable d'utiliser setUserState et getUserState plutot que les methodes get et set de Jsession.

            De + si tu veux être sur de ne pas avoir d'erreur tu peux rajouter au niveau du get une valeur par défaut.
            Par exemple :
            Code PHP:
            $authorId = (int)JFactory::getUserState('monarticle.1050','62');
            Si 62 est l'id de ton superuser, qui sera ta valeur par défaut si le getUsrState ne trouve pas la variable de session.

            Selon l'affichage, on ne passe pas toujours dans le sublayout author.php qui n'est appelé qu'en affichage complet il me semble (donc que dans certaines vues), et de + il peut être désactivé selon les options d'affichage.

            Donc tu peux aussi mettre la valeur par défaut à 0 et tester si $authorId != 0 pour afficher ou pas les rubriques nom et adresses de l'auteur.

            Mais je trouve que tu te compliques un peu la vie.
            Ton code via sourcerer, qui va l'ajouter dans l'article ?
            Si c'est un admin, il aura aussi vite fait de mettre l'id du createur en dur.
            Si c'est un auteur lambda, il suffit qu'il connaisse son id,
            et de le mettre toujours en dur dans le code sourcerer des articles.
            Dernière édition par roland_d_alsace à 25/02/2022, 15h29
            A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
            Rejoignez le Joomla Users Groupe Alsace...
            roland_d_alsace va-t-il devenir roland_du_grand_est ?

            Commentaire


            • #7
              Merci Roland pour toutes ces infos.

              Les données de l'auteur sont censées n'être affichées qu'en visualisation de l'article, pas en édition (création ou modif). Elles sont là pour renseigner le lecteur lambda qui ne se connecte pas au site et ne fait que lire les articles créés par de multiples auteurs.

              A priori je vais mettre le code "sourcerer" dans un module qui sera affiché dans une position de module prévue pour ça juste en dessous du contenu. De ce fait les auteurs n'auront rien à ajouter à leurs articles pour ça, ce module s'en chargera.

              Alors j'ai essayé ta méthode par la classe getUserState mais j'ai une erreur me disant que cette classe n'existe pas... Bizarre !

              Bon je continue...

              Commentaire


              • #8
                oups...
                Essaie
                JFactory::getApplication()->getUserState(....
                et

                JFactory::getApplication()->setUserState(
                A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                Rejoignez le Joomla Users Groupe Alsace...
                roland_d_alsace va-t-il devenir roland_du_grand_est ?

                Commentaire


                • #9
                  Envoyé par antoinepayen Voir le message
                  Merci Roland pour toutes ces infos.

                  ...
                  A priori je vais mettre le code "sourcerer" dans un module qui sera affiché dans une position de module prévue pour ça juste en dessous du contenu. De ce fait les auteurs n'auront rien à ajouter à leurs articles pour ça, ce module s'en chargera.

                  ...
                  Mais ce module, comment sait-il quel article il doit afficher ?
                  Il faut connaitre l'id de l'article pour retrouver le bon auteur dans le module.
                  A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                  Rejoignez le Joomla Users Groupe Alsace...
                  roland_d_alsace va-t-il devenir roland_du_grand_est ?

                  Commentaire


                  • #10
                    Bon, merci à tous, mais j'abandonne, les solutions sont vraiment trop "tordues". C'est quand même assez incroyable que Joomla ne soit pas capable d'afficher nativement dans un article les données propres à l'auteur de l'article en question !

                    Du coup je vais chercher ailleurs si quelque chose existe...

                    Merci encore !
                    Antoine.

                    Commentaire


                    • #11
                      Envoyé par antoinepayen Voir le message
                      Bon, merci à tous, mais j'abandonne, les solutions sont vraiment trop "tordues". C'est quand même assez incroyable que Joomla ne soit pas capable d'afficher nativement dans un article les données propres à l'auteur de l'article en question !

                      Du coup je vais chercher ailleurs si quelque chose existe...

                      Merci encore !
                      Antoine.
                      C'est certainement un besoin qui n'a jamais été exprimé, de plus cette notion de "profile" que tu utilises est un peu dépassée dans cet usage, car remplacée par les custom fields (ici ceux des membres / com_users).

                      L’intérêt de ce type de plugin "profile" de type "user" est à ce jour et par exemple, pour un composant, de rajouter dans champs nécessaires aux utilisateurs de Joomla pour le dit composant et de l'afficher dans la même vue (profil membre du composant et de joomla).

                      Je l'utilise pleinement ce type de plugin pour mes composant de ligue et de club sportifs pour rajouter la notion de club, de numéro de licence, addresse, etc... mais il faut encore le gérer derrière (comme ce que tu as essayé de faire).

                      Ensuite, afficher quelque chose dans un article, c'est vraiment le boulot d'un plugin de contenu.

                      Tout est bien prévu dans Joomla et son framework, mais comme dit il faudrait qu'un développeur te développe un plugin pour cela.

                      Avec ta méthode, t'y était presque, mais l'usage me semblait un peu compliqué pour un auteur qui je pense n'a pas vraiment de notion de "webmaster".

                      Sur mes sites de ligue et de clubs, j'ai énormément d'auteurs, je connais assez bien le problème, il faut leur faciliter la tâche, sinon ils baissent les bras et se contentent du publier sur les réseaux sociaux...

                      Ensuite sourcerer est bien pour une petite bricole à la volée, mais pas vraiment pour faire des choses récurrentes, et qui doivent être utilisée par des auteurs lambda.

                      C'est mon avis.
                      Dernière édition par roland_d_alsace à 28/02/2022, 14h10
                      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                      Rejoignez le Joomla Users Groupe Alsace...
                      roland_d_alsace va-t-il devenir roland_du_grand_est ?

                      Commentaire

                      Annonce

                      Réduire
                      Aucune annonce pour le moment.

                      Partenaire de l'association

                      Réduire

                      Hébergeur Web PlanetHoster
                      Travaille ...
                      X