J4.x

Développement d'un composant MVC - Ajout d'une variable de requête dans le lien du menu

From Joomla! Documentation

< J4.x:Developing an MVC Component
This page is a translated version of the page J4.x:Developing an MVC Component/Adding a Request Variable in the Menu Link and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎français • ‎中文(台灣)‎
Joomla! 
4.x
>Tutorial
Adding a Request Variable to the Menu Link



This article is part of the tutorial "Developing an MVC Component for Joomla 4.x". It is intended to be a follow-along programming tutorial, so if you have not read the previous parts of the tutorial you are encouraged to do so.

Nous avons maintenant 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. Maintenant, nous allons ajouter une variable de requête au lien du menu que nous avons créé précédemment, et apprendre à lire la variable de requête à l'intérieur du modèle de données. Selon la valeur de la variable, nous afficherons une salutation différente.

Changements requis

Il y a deux changements principaux que nous devrons apporter :

  • Ajouter la variable de requête et ses valeurs possibles à la définition XML du lien de menu
  • 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 Add the new parameter to the menu link's definition
2 Update: site/src/Model/MessageModel.php Have the view's data model decide which greeting to return
3 Update: admin/language/en-GB/en-GB.com_helloworld.sys.ini Add the new language strings needed when configuring the menu link
4 Update: site/language/en-GB/en-GB.com_helloworld.ini Swap our existing greeting string for two greetings we can choose between
5 Update: helloworld.xml For consistency, we'll bump the component's version number

Détails du fichier

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 un "champ") à 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 définissons également à l'avance 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 comme éléments enfants <option />.

L'attribut value de chaque élément <option /> est la valeur réelle qui sera ajoutée à l'URL (comme &greetingType=1). Le nom de la chaîne de langue à l'intérieur de 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

Voici comment nous lisons la nouvelle variable de requête via le framework Joomla, et décidons quel message de salutation afficher parmi nos deux possibilités. 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 c'est votre point d'entrée dans le runtime 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 retourner une valeur par défaut de 1.

REMARQUE : Vous ne devez jamais utiliser les superglobales comme $_GET ou $_POST pour accéder aux variables de requête ou à d'autres entrées. Utilisez le framework de Joomla pour accéder à toutes les données transmises ou soumises, afin de garantir qu'elles sont correctement traitées et sanitisées.

Une fois la variable de requête lue, nous choisissons simplement la salutation parmi nos deux possibilités à 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;
    }
        
}

admin/language/en-GB/en-GB.com_helloworld.sys.ini

Voici où nous définissons les chaînes de langue qui seront utilisées dans le formulaire de configuration pour notre lien de menu. Rappelez-vous, même si le lien de menu est défini dans la partie site du composant, les chaînes sont définies ici car elles sont utilisées dans le panneau de contrôle Joomla.

; Hello World Sys.ini
; Copyright (C) 2020 John Smith. All rights reserved.

COM_HELLOWORLD_MENU_HELLO_WORLD_TITLE="Hello World!"
COM_HELLOWORLD_MENU_HELLO_WORLD_DESC="My first Joomla! page"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_LABEL="Greeting Type"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_DESC="Select which type of greeting to show"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_HELLO="Say Hello"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_GOODBYE="Say Goodbye"

site/language/en-GB/en-GB.com_helloworld.ini

Ici, nous remplaçons notre salutation existante par deux salutations différentes, que le modèle choisira en fonction de la valeur de la variable de requête greetingType.

; Hello World Public Site Strings
; Copyright (C) 2020 John Smith. All rights reserved.

COM_HELLOWORLD_MSG_HELLO_WORLD="Hello World!"
COM_HELLOWORLD_MSG_GREETING_GOODBYE="Goodbye from the item model!"
COM_HELLOWORLD_MSG_GREETING_HELLO="Hello from the item model!"

helloworld.xml

Comme précédemment, notre dernière tâche consiste à incrémenter le numéro de version du composant. Aucun des changements apportés ici n'exige que le numéro de version soit incrémenté avant de le réimporter, mais nous le ferons pour des raisons de cohérence.

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="4.0" method="upgrade">

    <name>Hello World</name>
    <!-- The following elements are optional and free of formatting constraints -->
    <creationDate>December 2020</creationDate>
    <!-- Dummy author, feel free to replace anywhere you see it-->
    <author>John Smith</author>
    <authorUrl>https://smith.ca</authorUrl>
    <copyright>John Smith</copyright>
    <license>GPL v3</license>
    <!--  The version string is recorded in the components table -->
    <version>0.0.6</version>
    <!-- The description is optional and defaults to the name -->
    <description>
        A hello world component!
    </description>

    <!-- This is the PHP namespace under which the extension's
    code is organised. It should follow this format:
    
    Vendor\Component\ComponentName

    "Vendor" can be your company or your own name
    
    The "ComponentName" section MUST match the name used 
    everywhere else for your component. Whatever the name of 
    this XML file is, the namespace must match (ignoring CamelCase). 
    -->
    <namespace path="src/">JohnSmith\Component\HelloWorld</namespace>

    <files folder="site/">
        <folder>language</folder>
        <folder>src</folder>
        <folder>tmpl</folder>
    </files>

    <languages>
        <language tag="en-GB">site/language/en-GB/en-GB.com_helloworld.ini</language>
    </languages>

    <administration>
        <!-- The link that will appear in the Admin panel's "Components" menu -->
        <menu link="index.php?option=com_helloworld">Hello World</menu>
        <!-- List of files and folders to copy, and where to copy them -->
        <files folder="admin/">
            <folder>language</folder>
            <folder>services</folder>
            <folder>src</folder>
            <folder>tmpl</folder>
        </files>

        <languages>
            <language tag="en-GB">admin/language/en-GB/en-GB.com_helloworld.ini</language>
            <language tag="en-GB">admin/language/en-GB/en-GB.com_helloworld.sys.ini</language>
        </languages>
    </administration>

</extension>

Test de l'extension

Tout comme précédemment, compressez votre nouvelle version de composant et téléversez-la dans le panneau d'administration de votre installation Joomla!. Une fois qu'elle est mise à jour, ouvrez la configuration du menu principal à partir du menu de gauche comme vous l'avez fait précédemment, puis cliquez sur votre lien "Hello World" dans la liste des liens à droite.

Voici le lien vers la configuration du menu principal dans le panneau de contrôle Joomla

Vous devriez voir à nouveau le formulaire de configuration du lien de menu, mais cette fois, il devrait y avoir une toute nouvelle boîte de sélection déroulante :

Configuration du lien de menu avec des champs personnalisés ajoutés

Ici, vous pouvez voir notre nouvelle option de configuration, "Type de salutation". C'est le champ que nous avons défini dans XML précédemment, en utilisant également les chaînes de langue que nous avons définies. Pour tester votre modification, sélectionnez l'un des types de salutation possibles et enregistrez le lien de menu. Une fois le lien enregistré, visitez la section publique de votre installation Joomla et cliquez sur le lien. Vous devriez voir la salutation appropriée !

La salutation du modèle de données qui correspond au champ dans le lien de menu

Pour vous assurer que la variable de requête fonctionne correctement, assurez-vous de basculer la configuration du lien de menu plusieurs fois. Le message sur la page publique devrait changer en conséquence.

Génial ! Maintenant, nous avons une page qui prend des données simples d'un modèle, et ce modèle peut répondre aux variables de requête. Ensuite, nous passerons enfin à la configuration de notre base de données et à la connexion de notre modèle de données à celle-ci.