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
      1 sur 2 < >

      C'est [Réglé] et on n'en parle plus ?

      A quoi ça sert ?
      La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

      Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

      Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
      Comment ajouter la mention [Réglé] à votre discussion ?
      1 - Aller sur votre discussion et éditer votre premier message :


      2 - Cliquer sur la liste déroulante Préfixe.

      3 - Choisir le préfixe [Réglé].


      4 - Et voilà… votre discussion est désormais identifiée comme réglée.

      2 sur 2 < >

      Assistance au forum - Outil de publication d'infos de votre site

      Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

      Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

      Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

      UTILISER À VOS PROPRES RISQUES :
      L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

      Problèmes connus :
      FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

      Installation :

      1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

      Archive zip : https://github.com/AFUJ/FPA/zipball/master

      2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

      3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

      4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

      5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

      6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
      et remplacer www. votresite .com par votre nom de domaine


      Exemples:
      Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
      Télécharger le script fpa-fr.php dans: /public_html/
      Pour executer le script: http://www..com/fpa-fr.php

      Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
      Télécharger le script fpa-fr.php dans: /public_html/cms/
      Pour executer le script: http://www..com/cms/fpa-fr.php

      En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

      Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
      Voir plus
      Voir moins

      Partenaire de l'association

      Réduire

      Hébergeur Web PlanetHoster
      Travaille ...
      X