Fonctionnement des URL de Joomla!

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

  • [RÉGLÉ] Fonctionnement des URL de Joomla!

    Bonsoir !

    Je fais quelques tests avec mon composant Joomla!, mais il y à quelque chose que je ne comprend absolument pas : les URLs.

    Si, dans mon côté front-end, j'entre l'url :
    Code:
    index.php?option=com_helloworld
    Cela appelle la méthode display du controller HelloWorldController.

    Pour l'URL :
    Code:
    index.php?option=com_helloworld&task=foo.bar
    Cela appelle la méthode bar du controller HelloWorldControllerFoo.

    Mais si j'appelle :
    Code:
    index.php?option=com_helloworld&task=foo&view=bar
    Cela n'appelle pas la méthode bar du controller HelloWorldControllerFoo mais affiche ma vue HelloWorldViewHelloWorld.

    Au final, je sais pas du tout comment ça marche.

    Pouvez-vous m'expliquer ce qu'est task, view et layout dans l'URL ?

    Merci beaucoup !

  • #2
    Hello.

    Très simplement car l'idéal serait que tu lises un des ouvrages sur Joomla (voir ton autre fil de discussion) et son fonctionnement avant de te lancer dans le développement (sur ce point celui de Marc Studer est très bien, avant d'attaquer celui de Mark Dexter).

    1) "display" est généralement l'action par défaut (task) que le développeur peut redéfinir dans le contrôleur.

    Dans le constructeur de la classe héritée des contrôleurs (encore appelée JControleurLegacy mais qui est en namespace Joomla\CMS\MVC\Controller\BaseController) tu trouveras (ligne 375 de /librairies/SRC/Controller/BaseController.php) :
    Code PHP:
            // If the default task is set, register it as such
            
    if (array_key_exists('default_task'$config))
            {
                
    $this->registerDefaultTask($config['default_task']);
            }
            else
            {
                
    $this->registerDefaultTask('display');
            } 
    Donc dans les paramètres du constructeur de ton contrôleur tu peux définir un autre task par défaut que display.

    Code PHP:
    public function __construct(array('default_task' => 'ma_tache_par_defaut')) 
    2) -et suite du 1-
    Ensuite task est une action, ou plus simplement une fonction que le contrôleur doit lancer (fonction définie dans le controlleur, qui lance généralement la fonction du même nom du model).

    Généralement task est initialisé par un JS lancé par un des boutons affiché dans la "taskbar" (par exemple enregistrer, enregistrer une copie, abandon, etc...).
    Ces boutons sont généralement définis par la fonction addToolbar de la vue (.../nomdetoncomposant/views/nomdetavue/view.html.php)
    (.... étant soit /components soit /administrator/components).

    Par exemple :
    Code PHP:
    JToolbarHelper::save('contact.save'); 
    enregistre la valeur "contact.save" dans la variable task du formulaire html ce qui lance le controleur "contact.php" du composant.
    Ce contrôleur qui exécute alors sa fonction "save" (fonction que tu auras éventuellement définie, certaines fonctions étant prédéfinies selon la classe de contrôleur et de model dont tu auras hérité -ce qui évite de tout réecrire dans les cas les plus courants-)

    3) view : si tu définis view sans task, tu auras compris que c'est le contrôleur qui lancera son task par défaut (donc display) avec le model par défaut (du même nom que la vue).

    4) layout : sert à définir un template de vue d'affichage en particulier (quand il y en a plusieurs).
    La layout est lancé par la vue et de base c'est "default" (dans .../nomdetoncomposant/views/nomdetavue/tmpl/default.php).

    Voir les valeurs par défaut de ton contrôleur général (par exemple com_contact):
    Code PHP:
    protected $default_view 'contacts';
    ...
        public function 
    display($cachable false$urlparams = array())
        {
     
    $view   $this->input->get('view''contacts');
      
    $layout $this->input->get('layout''default'); 
    Ce contrôleur se substituant au tien, si tu n'en défini pas un autre dans ../comonents/nomdetoncomposant/controlleur/

    Tu constateras dans ce code que "task" est prioritaire, car on est déjà dans la fonction "display".

    Ensuite tu peux donc très facilement forcer une tache à afficher une vue particulière, et/ou un layout particulier, ou à utiliser un model particulier (c'est souvent la cas pour les fonctions 'batch', traitement par lot, quand tu sélectionnes plusieurs articless par exemple pour changer de catégories, le controleur contents appellera une fonction du model content (la même que celle utilisé quand tu changes un article donné de catégorie).
    (En informatique on est paresseux et on aime pas réécrire de trucs qui existent déjà )

    5 et suite) :
    A ceci se rajoute aussi le format (html par défaut, mais qui peut-être ce que tu veux, par exemple raw, csv, xml, pdf, etc...).
    Ce qui donne le nom de la vue (en général view.html.php, view.raw.php, etc....).

    Et aussi que l'url est calculée par ton routeur (/nomducomposant/router.php) qui décompose les segments SEO en variables d'URL et vice-versa.
    Dernière édition par roland_d_alsace à 12/04/2019, 10h23
    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 pour ta réponse.

      Oui, je pense que je vais aller voir des bouquins. Cet aprem' un amis m'apporte le livre Joomla! Programming. Sais-tu si dedans c'est indiqué comment fonctionne les URLs ?

      En attendant, je fais toujours quelques essais pour comprendre.
      J'ai donc créer, dans mon composant, et afin de tester, un controller et une vue, que voici :

      site/controllers/foo.php
      Code PHP:
      <?php
      defined
      ('_JEXEC') or die;

      class 
      HelloWorldControllerFoo extends JControllerLegacy
      {
          function 
      bar()
          {
              echo 
      'Bar function of Foo controller';
          }
      }

      site/views/barview/view.html.php
      Code PHP:
      <?php
      defined
      ('_JEXEC') or die;

      class 
      HelloWorldViewBarView extends JViewLegacy
      {
          function 
      display($tpl null)
          {
              
      $this->msg 'This is a \'bar\' view.';

              if(
      count($errors $this->get('Errors')))
              {
                  
      JLog::add(implode('<br />'$errors), JLog::WARNING'jerror');

                  return 
      false;
              }

              
      parent::display($tpl);
          }
      }

      site/views/barview/tmpl/default.php
      Code PHP:
      <?php
      defined
      ('_JEXEC') or die;
      ?>
      <h1><?php echo $this->msg?></h1>

      Mais, lorsque je vais sur :
      Code:
      index.php?option=com_helloworld&task=foo.bar&view=barview&layout=default
      Je ne sais pas pourquoi, cela m'affiche juste "Bar function of Foo controller". Aucune vue n'est affichée.
      Je pense donc qu'il faut que je mette un petit bout de code dans ma fonction bar pour afficher la bonne vue selon l'URLs.

      Car si je comprend bien, cette URLs doit :
      - Appeler la fonction bar du controller HelloWorldControllerFoo.
      - Utiliser le template : site/views/barview/tmpl/default.php

      En revanche, l'URL :
      Code:
      index.php?option=com_helloworld&task=foo.bar&view=barview&layout=other
      Elle devrait appeler la même fonction du même controller, mais utiliser le template : site/views/barview/tmpl/other.php.

      C'est bien ça ?

      Merci encore pour ton aide.
      Dès cet aprem', je vais aller bouquiner un peu.

      A bientôt !

      Edit : Quelques corrections :

      J'ai oublié effectivement d'appeller "parent::display()" dans ma fonction bar du controller HelloWorldControllerFoo.
      Tout fonctionne, donc, et j'ai compris le fonctionnement de tout ça. Je passe en résolu !
      Dernière édition par FougereBle à 12/04/2019, 11h25

      Commentaire

      Annonce

      Réduire
      Aucune annonce pour le moment.

      Partenaire de l'association

      Réduire

      Hébergeur Web PlanetHoster
      Travaille ...
      X