router non chargé

Réduire
Une réponse a été apportée à ce sujet.
X
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] router non chargé

    Salut tout le monde, !

    Voilà plusieurs jours que je tourne en rond avec mon router, dans mon composant perso, malgré toutes les pages web lues à ce sujet, tout me semble correct, mais visiblement je dois passer à coté de quelque chose, car mon router ne se charge pas.

    En faisant volontairement un faute de syntaxe ou de logique dans le code du router, ca n'a aucune incidence à la visite de la page front de mon composant ce qui m'amène à penser qu'il ne se charge même pas.

    Voici quelques détails, (à noter que je remplace volontairement la première partie du namespace pour le forum par Monnom)
    pour commencer, le principal, le router : components/com_gixcomp/src/Service/Router.php
    Code PHP:
    <?php
    namespace Monnom\Component\Gixcomp\Site\Service;
    use 
    Joomla\CMS\Application\SiteApplication;
    use 
    Joomla\CMS\Component\ComponentHelper;
    use 
    Joomla\CMS\Component\Router\RouterView;
    use 
    Joomla\CMS\Component\Router\RouterViewConfiguration;
    use 
    Joomla\CMS\Component\Router\Rules\MenuRules;
    use 
    Joomla\CMS\Component\Router\Rules\NomenuRules;
    use 
    Joomla\CMS\Component\Router\Rules\StandardRules;
    use 
    Joomla\CMS\Menu\AbstractMenu;
    \defined('_JEXEC') or die;
    class 
    Router extends RouterView
    {
        public function 
    __construct(SiteApplication $appAbstractMenu $menu)
        {
            
    $cpanel = new RouterViewConfiguration('cpanel');
            
    $this->registerView($cpanel);
            
    parent::__construct($app$menu);
            
    $this->attachRule(new MenuRules($this));
            
    $this->attachRule(new StandardRules($this));
            
    $this->attachRule(new NomenuRules($this));
        }
    }
    le lien de menu qui mène à ma page test est bien sûr gixcomp > cpanel et se nom "test" avec pour alias "test"
    j'y accède via un module de menu joomla! simple

    Le résultat :
    l'url générée par Joomla! est :
    test?view=cpanel

    Le résultat attendu :
    l'url qui devrait être générée par Joomla! est :
    test

    J'aurais beau modifier n'importe quoi dans mon router, ca ne sera bien sûr pas pris en compte, puisque même une erreur php ne fait rien, la question est : pourquoi mon router ne se charge pas, alors que je ne vois pas d'erreur dans le namespace ou dans le chemin de fichier (ou alors je vais chez l'ophtalmo demain)

    je tourne en rond avec chat gpt qui me dit de le déclarer ici et là, alors que le namespace devrait suffire dans joomla! 4 &5 non ?

    Merci d'avance pour vos lumières, j'ai vu que d'autres avaient le même souci, qui n'a pas été résolu, ou à moitié par des méthodes très sales qui rajoutent plein de fichiers et du code mixé de joomla! 3​
    Dernière édition par Minie à 07/05/2024, 14h19
  • Réponse sélectionnée par Minie, le 07/05/2024, 21h24.

    Hello.

    Tu n'as pas à définir cette méthode, elle est apportée par le framework.

    Dans /administrator/components/com_toncomposant/src/Exptension/ToncomposantComponent.php tu dois mettre ceci :

    Code PHP:
    ....
    use 
    Joomla\CMS\Component\Router\RouterServiceInterface;
    use 
    Joomla\CMS\Component\Router\RouterServiceTrait;
    ...
    class 
    ToncomposantComponent extends MVCComponent implements
    BootableExtensionInterface,
    ...
    RouterServiceInterface
    {
    ...
    use 
    RouterServiceTrait;
    .. 
    La methode setRouterFactory étant définie dans RouterServiceTrait en /libraries/src/Component/Router/RouterServiceTrait.php que tu dois donc charger dans ton composant.

    Je sais ce n'est pas simple, moi aussi j'ai galéré pour comprendre...

    Après vérifie ton chargement du routeur en provoquant une erreur comme tu le faisais, car ta dernière correction aurait dû fonctionner.
    C'est peut-être le router qui ne réagit pas comme tu l'entends.

    De mon côté j'ai utilisé les méthodes build et parse pour modifier le fonctionnement standard du routeur prévu par le framework.
    Pour comprendre il faut utiliser un débugueur et rentrer dans le code.
    Dernière édition par roland_d_alsace à 07/05/2024, 16h33
    Minie aime ceci.

    Commentaire


    • #2
      Hello.

      As-tu enregistré ton routeur dans administrator/components/com_toncomposant/services/provider.php methode register
      Code PHP:
         $container->set(
        
      ComponentInterface::class,
        function (
      Container $container) {
          
      $component = new TomcomposantComponent($container->get(ComponentDispatcherFactoryInterface::class));
          
      $component->setRegistry($container->get(Registry::class));
          
      $component->setMVCFactory($container->get(MVCFactoryInterface::class));
          
      $component->setCategoryFactory($container->get(CategoryFactoryInterface::class));
          
      $component->setRouterFactory($container->get(RouterFactoryInterface::class)); // <---ici
          
      return $component;
         }
        ); 
      As-tu aussi vu cet article de Nikolaos : https://www.dionysopoulos.me/book/com-router-routerview.html

      Ajoute aussi
      Code PHP:
      use Joomla\CMS\Menu\AbstractMenu;​ 
      Dernière édition par roland_d_alsace à 07/05/2024, 15h28
      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


      • #3
        Salut,

        Merci beaucoup pour ta réponse, j'ai continué à chercher de mon coté, alors que quasi tous les sujets ne parlent que du router.php, j'ai effectivement trouvé un sujet qui parle de cette déclaration dans provider, j'avais donc commencé, je me fais balader d'erreur en erreur

        J'ai donc commencé par ajouter cette ligne à mon provider.php :
        Code PHP:
        <?php
        use Joomla\CMS\Component\Router\RouterFactoryInterface;
        use 
        Joomla\CMS\Extension\ComponentInterface;
        use 
        Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
        use 
        Joomla\CMS\Extension\Service\Provider\MVCFactory;
        use 
        Joomla\CMS\Extension\Service\Provider\RouterFactory;
        use 
        Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
        use 
        Joomla\CMS\MVC\Factory\MVCFactoryInterface;
        use 
        Joomla\DI\Container;
        use 
        Joomla\DI\ServiceProviderInterface;
        use 
        Monnom\Component\Gixcomp\Administrator\Extension\GixcompComponent;
        return new class implements 
        ServiceProviderInterface
        {
            public function 
        register(Container $container)
            {
                
        $container->registerServiceProvider(new ComponentDispatcherFactory('\\Monnom\\Component\\Gixcomp'));
                
        $container->registerServiceProvider(new MVCFactory('\\Monnom\\Component\\Gixcomp'));
                
        $container->registerServiceProvider(new RouterFactory('\\Monnom\\Component\\Gixcomp'));
                
        $container->set(
                    
        ComponentInterface::class,
                    function (
        Container $container) {
                        
        $component = new GixcompComponent($container->get(ComponentDispatcherFactoryInterface::class));
                        
        $component->setMVCFactory($container->get(MVCFactoryInterface::class));
                        
        $component->setRouterFactory($container->get(RouterFactoryInterface::class));
                        return 
        $component;
                    }
                );
            }
        };
        Il me répond gentiment :
        Call to undefined method Monnom\Component\Gixcomp\Administrator\Extension\G ixcompComponent::setRouterFactory()
        xx.com/administrator/components/com_gixcomp/services/provider.php:26

        Je vais donc tenter de définir la méthode setRouterFactory() dans mon fichier d'extension qui j'avoue était plutôt vide (mais ca fonctionnait avant d'ajouter le router), je l'ai rempli :
        Code PHP:
        <?php
        namespace Monnom\Component\Gixcomp\Administrator\Extension;
        use 
        Joomla\CMS\Extension\MVCComponent;
        use 
        Joomla\CMS\Component\Router\RouterFactoryInterface;
        class 
        GixcompComponent extends MVCComponent
        {
            protected 
        $routerFactory;
            public function 
        setRouterFactory(RouterFactoryInterface $factory)
            {
                
        $this->routerFactory $factory;
            }
        }
        Je n'ai plus d'erreur, mais toujours pas d'url sef

        Commentaire


        • #4
          Hello.

          Tu n'as pas à définir cette méthode, elle est apportée par le framework.

          Dans /administrator/components/com_toncomposant/src/Exptension/ToncomposantComponent.php tu dois mettre ceci :

          Code PHP:
          ....
          use 
          Joomla\CMS\Component\Router\RouterServiceInterface;
          use 
          Joomla\CMS\Component\Router\RouterServiceTrait;
          ...
          class 
          ToncomposantComponent extends MVCComponent implements
          BootableExtensionInterface,
          ...
          RouterServiceInterface
          {
          ...
          use 
          RouterServiceTrait;
          .. 
          La methode setRouterFactory étant définie dans RouterServiceTrait en /libraries/src/Component/Router/RouterServiceTrait.php que tu dois donc charger dans ton composant.

          Je sais ce n'est pas simple, moi aussi j'ai galéré pour comprendre...

          Après vérifie ton chargement du routeur en provoquant une erreur comme tu le faisais, car ta dernière correction aurait dû fonctionner.
          C'est peut-être le router qui ne réagit pas comme tu l'entends.

          De mon côté j'ai utilisé les méthodes build et parse pour modifier le fonctionnement standard du routeur prévu par le framework.
          Pour comprendre il faut utiliser un débugueur et rentrer dans le code.
          Dernière édition par roland_d_alsace à 07/05/2024, 16h33
          Minie aime ceci.
          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
            Oh yes !!

            Je sens la fin arriver ! Mon router est enfin détecté puisque j'ai une erreur indiquant un souci dans le fichier router :
            Monnom\Component\Gixcomp\Site\Service\Router::__co n struct(): Argument #3 ($categoryFactory) must be of type Joomla\CMS\Categories\CategoryFactoryInterface, null given, called in xx.com/libraries/src/Component/Router/RouterFactory.php on line 89
            xx.com/components/com_gixcomp/src/Service/Router.php:26​

            je n'ai pas mis le Boot dans le fichier admin/src/Extension/mon_composant.php parcequ'il fallait ensuite corrigé l'erreur qui me demande de faire la fonction Boot, que je n'avais rien à mettre dedans, etc ...
            Je regarde beaucoup com_content en exemple, et je vois que ca renvoie à des fichiers dans admin/src/Service/HTML, si je peux m'en passer c'est bon, je préfère en mettre le moins possible dans un premier temps pour mieux comprendre, ca change vraiment de Joomla! 3 je suis perdue, je voudrais juste me créer mon comp asset pour faire mes tambouilles ;D il ne manque que le router

            bref, voici le fichier admin/src/Extension/mon_composant.php, en espérant que le Boot ne soit pas indispensable

            Code PHP:
            <?php
            namespace Monnom\Component\Gixcomp\Administrator\Extension;
            use 
            Joomla\CMS\Extension\MVCComponent;
            use 
            Joomla\CMS\Component\Router\RouterServiceInterface;
            use 
            Joomla\CMS\Component\Router\RouterServiceTrait;
            class 
            GixcompComponent extends MVCComponent implements RouterServiceInterface
            {
                use 
            RouterServiceTrait;
            }
            et j'ai maintenant une erreur sur on Router, enfin

            Monnom\Component\Gixcomp\Site\Service\Router::__co n struct(): Argument #3 ($categoryFactory) must be of type Joomla\CMS\Categories\CategoryFactoryInterface, null given, called in xx.com/libraries/src/Component/Router/RouterFactory.php on line 89
            xx.com/components/com_gixcomp/src/Service/Router.php:26

            il est vrai que je ne vois pas ou la variable $categoryFactory est sensée prendre une valeur

            Merci encore pour ton aide, je me sens moins seule, on ne peux pas dire que chat gpt soit un allié précieux dans ce domaine il tourne un peu en rond

            Commentaire


            • #6
              Je crois que j'ai eu le même problème.
              Franchement je n'ai pas approfondi, comment éviter de donner 4 paramètres au constructeur du router.
              De + moi j'utilise les catégories dans mes composants nécessitant un router

              Toutefois, dans les services, on a déclaré utiliser l'interface de RouterFactory

              Le constructeur de RouterFactory nécessite 4 paramètres alors qu'on peut passer que 2 paramètres à l'appel du constructeur de la classe parente RouterView.

              Dans ton router.php met donc les 4 paramètres au constructeur (même si tu n'utilises pas les catégories)

              Code PHP:
              ...
                use 
              Joomla\CMS\Categories\CategoryFactoryInterface;
                use 
              Joomla\CMS\Categories\CategoryInterface;
               ...
              use 
              Joomla\Database\DatabaseInterface;
              ...

              public function __construct(SiteApplication $appAbstractMenu $menuCategoryFactoryInterface $categoryFactoryDatabaseInterface $db){
               
              ​ 
              Dernière édition par roland_d_alsace à 07/05/2024, 18h53
              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
                Pour le code que tu as donné c'est justement ce que j'avais mis, et j'avais l'erreur qui dit que $categoryFactory ne doit pas être null, alors j'ai testé en mode bourrin, j'ai supprimé carrément la ligne de paramètre 3 (CategoryFactoryInterface $categoryFactory), ensuite il me dit que $db ne doit pas être null, alors j'ai supprimé le paramètre 4 DatabaseInterface $db ... et ca marche, mon url est enfin propre, sans erreur lol


                Bon, je me doute que c'est hyper sale, donc si quelqu'un passe par là, il a le droit de me cracher dessus et de donner la méthode propre, mais en attendant ca marche

                J'aurais surement besoin de ses lignes plus tard, mais en attendant, ca marche !

                Un grand merci à toi pour ton aide, on se sent parfois bien seuls dans ces moments là, alors merci beaucoup

                Commentaire

                Annonce

                Réduire
                Aucune annonce pour le moment.

                Partenaire de l'association

                Réduire

                Hébergeur Web PlanetHoster
                Travaille ...
                X