Cet article fait partie du tutoriel "Développer un composant MVC pour Joomla 4.x". Il est conçu pour être suivi comme un tutoriel de programmation. Si vous n'avez pas lu les parties précédentes du tutoriel, il est recommandé de le faire.

Nous disposons maintenant d'une page dans la partie publique de notre installation Joomla qui peut afficher un message de salutation, fourni par un modèle de données. Nous allons maintenant ajouter une variable de requête au lien de menu que nous avons créé précédemment, et apprendre comment lire cette variable de requête à l'intérieur du modèle de données. En fonction de la valeur de la variable, nous afficherons une salutation différente.

Changements requis

Il y a deux changements principaux que nous devrons effectuer :

  1. Ajouter la variable de requête et ses valeurs possibles à la définition XML du lien de menu.
  2. Ajouter du code au modèle pour lire la variable de requête et choisir une salutation appropriée.
1 Update: site/tmpl/hello/default.xml Ajoutez le nouveau paramètre à la définition du lien de menu.
2 Update: site/src/Model/MessageModel.php Permettez au modèle de données de la vue de décider quelle salutation renvoyer.
3 Update: admin/language/en-GB/en-GB.com_helloworld.sys.ini Ajoutez les nouvelles chaînes de caractères nécessaires lors de la configuration du lien de menu.
4 Update: site/language/en-GB/en-GB.com_helloworld.ini Remplacez notre chaîne de salutation existante par deux salutations entre lesquelles nous pouvons choisir.
5 Update: helloworld.xml Pour des raisons de cohérence, nous allons augmenter le numéro de version du composant.

 

Détails des fichiers

'site/tmpl/hello/default.xml'

Bien que ce changement puisse sembler assez verbeux, il est en réalité très simple. Nous ajoutons une variable de requête configurable (appelée "field") à notre lien de menu. Lors de la modification de l'entrée de menu dans le panneau de contrôle Joomla, ce champ et ses options seront affichés dans le formulaire de configuration.

Les champs de menu sont organisés en ensembles de champs, bien que nous n'ayons besoin que d'un seul ici. Nous appellerons notre champ greetingType, qui sera ajouté à l'URL lorsque le lien est cliqué. Nous pré-définissons également les valeurs autorisées pour ce champ, car nous voulons pouvoir compter sur leurs valeurs dans le modèle de données. Nous le faisons en utilisant type="list" pour indiquer à Joomla qu'il s'agit d'une liste de valeurs, puis en les fournissant en tant qu'éléments enfants <option />.

L'attribut value de chaque <option /> est la valeur réelle qui sera ajoutée à l'URL (comme &greetingType=1). Le nom de la chaîne de caractères dans l'élément <option /> représente le libellé qui sera affiché dans le formulaire de configuration.

<?xml version="1.0" encoding="utf-8"?>
<metadata>
    <layout title="COM_HELLOWORLD_MENU_HELLO_WORLD_TITLE">
        <message><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_DESC]]></message>
    </layout>
    <fields name="request">
        <fieldset name="request">
            <field  name="greetingType"
                    type="list"
                    label="COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_LABEL"
                    description="COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_DESC"
                    default="1">
                <option value="1"><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_HELLO]]></option>
                <option value="2"><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_GOODBYE]]></option>
            </field>
        </fieldset>
    </fields>
</metadata>

'site/src/Model/MessageModel.php'

Ici, nous lisons la nouvelle variable de requête via le framework Joomla et décidons laquelle de nos deux salutations afficher. Ce code illustre comment lire les variables de requête dans Joomla 4 :

- `Factory::getApplication()` renvoie l'objet d'application Joomla. Vous utiliserez souvent ce code lors de l'écriture dans Joomla, car il constitue votre point d'entrée dans l'exécution de Joomla.
- `->getInput()` renvoie l'objet \Joomla\Input\Input pour cette requête. Cet objet peut être utilisé pour lire les variables de requête de manière sécurisée et sanitisée.
- `$input->getInt('greetingType', 1);` récupère la valeur de la variable de requête 'greetingType' que nous avons définie précédemment. Si aucune valeur n'est définie, nous avons spécifié qu'elle devrait renvoyer une valeur par défaut de 1.

REMARQUE : Vous ne devez jamais utiliser de superglobales comme $_GET ou $_POST pour accéder aux variables de requête ou à d'autres entrées. Utilisez le framework Joomla pour accéder à toute donnée transmise ou soumise, afin de garantir qu'elle soit correctement gérée et sanitisée.

Avec la variable de requête lue, nous choisissons simplement laquelle de nos deux salutations possibles renvoyer au modèle.

<?php

namespace JohnSmith\Component\HelloWorld\Site\Model;

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\ItemModel;
use Joomla\CMS\Language\Text;

/**
 * @package     Joomla.Site
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2020 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */

/**
 * Hello World Message Model
 * @since 0.0.5
 */
class MessageModel extends ItemModel {

    /**
     * Returns a message for display
     * @param integer $pk Primary key of the "message item", currently unused
     * @return object Message object
     */
    public function getItem($pk= null): object {
        // This gives us a Joomla\Input\Input object
        $input = Factory::getApplication()->getInput();
        $greetingType = $input->getInt('greetingType', 1);

        $item = new \stdClass();
        
        switch($greetingType) {
            case 2:
                $item->message = Text::_('COM_HELLOWORLD_MSG_GREETING_GOODBYE');
                break;
            case 1:
            default:
                $item->message = Text::_('COM_HELLOWORLD_MSG_GREETING_HELLO');
                break;
        }
        
        return $item;
    }
        
}