Fonctionnement des URL de Joomla!

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

  • FougereBle
    a répondu
    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

    Laisser un commentaire:


  • roland_d_alsace
    a répondu
    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

    Laisser un commentaire:


  • FougereBle
    a crée un sujet [RÉGLÉ] Fonctionnement des URL de Joomla!

    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 !

Annonce

Réduire
Aucune annonce pour le moment.

Partenaire de l'association

Réduire

Hébergeur Web PlanetHoster
Travaille ...
X