Предыдущая статья этого пособия была на тему «Добавление модели для фронтенда в компонент на Joomla 4.x». Для понимания излагаемого материала рекомендуется читать и сразу выполнять приводимые в публикациях данные.

Добавление переменной запроса в ссылку меню

Теперь у нас есть страница на сайте (фронтенде) нашей установки Joomla, которая может отображать приветственное сообщение, предоставленное моделью данных. В этой статье рассмотрим, как добавить переменную запроса в ссылку меню, созданную ранее, и узнаем, как прочитать переменную запроса внутри модели данных. В зависимости от выбранного в админке значения переменной мы покажем разные приветствия.

Необходимые изменения в коде файлов компонента Joomla 4

Есть два основных изменения, которые нам нужно будет сделать:

  • Добавление переменной запроса и ее возможных значений в XML-определение ссылки меню.
  • Добавление кода в модель для чтения переменной запроса и выбора соответствующего приветствия.
  1. Обновление: site/tmpl/hello/default.xml
    • Добавление нового параметра в определение ссылки меню.
  2. Обновление: site/src/Model/MessageModel.php
    • Пусть модель данных представления решит, какое приветствие возвращать.
  3. Обновление: admin/language/en-GB/en-GB.com_helloworld.sys.ini
    • Добавление новых языковых констант, необходимых при настройке ссылки меню.
  4. Обновление: site/language/en-GB/en-GB.com_helloworld.ini
    • Замена существующей строки приветствия на два приветствия, которые можно будет выбрать.
  5. Обновление: helloworld.xml
    • Для согласованности увеличивает номер версии компонента в файле манифеста.

Содержимое файлов компонента для Joomla 4.x

site/tmpl/hello/default.xml

Хотя это изменение может показаться довольно многословным, на самом деле оно очень простое. Мы добавляем настраиваемую переменную запроса (называемую "field") в нашу ссылку меню. При редактировании пункта меню в панели управления Joomla это поле и его параметры будут отображаться в форме выбора конфигурации пункта меню.

Поля (fields) меню организованы в наборы fieldset, хотя здесь мы будем использовать только один. Мы назовем наше поле GreetingType, которое будет добавлено к URL-адресу при нажатии на ссылку. Мы также заранее определяем, какие значения (value) разрешены для этого поля, поскольку мы хотим иметь возможность полагаться на их значения в модели данных. Мы делаем это с помощью type="list", чтобы сообщить Joomla, что у него есть список значений, а затем предоставить их в качестве дочерних элементов <option />.

Атрибут value каждого <option / > - это фактическое значение, которое будет добавлено к URL-адресу (например, &GreetingType=1). Имя (ключ) языковой константы внутри элемента <option /> представляет знание, которое будет отображаться в форме конфигурации при настройке пункта меню а админке Joomla 4.

<?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>

Обратите внимание на строки:

  • стр.7..18 — вставка информации о полях (fields), используемых для формирования ссылки пункта меню компонента при его настройке в админке Joomla 4.

site/src/Model/MessageModel.php

Здесь мы читаем в новой переменной запроса через фреймворк Joomla и решаем, какое из наших двух приветствий показывать. Этот код иллюстрирует, как читать переменные запроса в Joomla 4:

  • Factory::getApplication() возвращает объект приложения Joomla 4. Вы будете часто использовать этот код при написании в Joomla в качестве точки входа в среду выполнения Joomla.
  • ->GetInput() возвращает объект \Joomla\Input\Input для этого запроса. Этот объект можно использовать для безопасного чтения переменных запроса.
  • $input->getInt('GreetingType', 1); извлекает значение переменной запроса 'GreetingType', которую мы определили ранее. Если значение не определено, мы указали, что оно должно возвращать значение по умолчанию 1.

ВАЖНО: Вы никогда не должны использовать для чтения данных, переданных приложению Joomla, глобальные переменные PHP, такие как $_GET или $_POST, для доступа к переменным запроса или другим входным данным. Используйте фреймворк Joomla для доступа к любым переданным или переданным данным, чтобы не параноить по поводу того, что они содержать какой-то вредоносный код, отправленный хакером-самоучкой для взлома сайта, и действительно ли они правильно обработаны и очищены.

С переменной чтения запроса мы просто выбираем, какое из наших двух возможных приветствий должно быть подставлено в шаблон нашего компонента.

<?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) 2021 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */
 
/**
 * Модель сообщения Hello World
 * @since 0.0.5
 */
class MessageModel extends ItemModel {
 
    /**
     * Возвращает сообщение для отображения
     * @param integer $pk Первичный ключ "элемента сообщения", в настоящее время не используется
     * @return object Message Объект сообщения
     */
    public function getItem($pk= null): object {
        // Это дает нам объект Joomla\Input\Input
        $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;
    }
        
}

Обратите внимание на строки:

  • стр.7 — подключение класса ядра Joomla 4 Joomla\CMS\Factory
  • стр.31..33 — получение объекта Joomla\Input\Input класса Joomla\CMS\Factory Joomla 4
  • стр.37..45 — условия выбора языковой константы в зависимости от полученных данных в переменной $greetingType, которые мы получили выше из обработки запроса.

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

Здесь мы определяем языковые константы, которые будут использоваться в форме конфигурации пункта меню в админке Joomla 4 для нашей ссылки меню. Помните, что, хотя ссылка меню определена во фронтенде сайта шаблона компонента, строки определены здесь, потому что она используется в панели управления Joomla.

; Hello World Sys.ini
; Copyright (C) 2021 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"

Обратите внимание на строки:

  • стр.6..9 — новые языковые константы компонента для вывода информации при формировании ссылке меню в админке Joomla

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

Здесь мы используем вместо нашего старого приветствия два разных приветствия, между которыми модель будет выбирать на основе значения переменной запроса 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!"

Обратите внимание на строки:

  • стр.5..6 — новые языковые константы компонента для вывода информации на сайте в соответствии с настройками пункта меню.

helloworld.xml

Как и прежде, наша последняя задача - это увеличить номер версии компонента. Ни одно из внесенных здесь изменений не требует, чтобы номер версии был изменен перед повторным импортом, но мы сделаем это для согласованности.

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
 
    <name>Hello World</name>
    <!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
    <creationDate>May 2021</creationDate>
    <!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
    <author>John Smith</author>
    <authorUrl>https://mb4.ru</authorUrl>
    <copyright>Пётр Васечкин</copyright>
    <license>GPL v3</license>
    <!-- Строка 'version' записывается в таблицу компонентов -->
    <version>0.0.6</version>
    <!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
    <description>
        A hello world component!
    </description>
 
    <!-- Это пространство имен PHP, в котором организован
    код расширения. Он должен следовать этому формату:
    
    Vendor\Component\ComponentName
 
    "Vendor" может быть названией компании или вашим собственным именем
    
    Раздел "ComponentName" ДОЛЖЕН соответствовать имени, используемому 
    везде для вашего компонента. Каким бы ни было имя этого XML-файла, 
    пространство имен должно совпадать (заглавные/прописные буквы не учитываются). 
    -->
    <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>
        <!-- Ссылка, которая появится в меню админки Joomla "Components" -->
        <menu link="index.php?option=com_helloworld">Hello World</menu>
        <!-- Список файлов и папок для копирования.
             Обратите внимание на атрибут "folder".
             Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
        <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>

Обратите внимание на строку:

  • стр.14 — меняется номер версии компонента

Тестирование компонента в Joomla 4 с внесёнными дополнениями

Как и раньше, заархивируйте новую версию компонента и загрузите ее в панель администратора установки Joomla 4.

Как только он обновится, откройте настройки главного меню из левого меню, как вы делали это раньше, затем нажмите ссылку "Hello World" в списке ссылок справа.

Тестирование компонента в Joomla 4 с внесёнными дополнениями

Вы должны снова увидеть форму конфигурации ссылки на меню, но теперь должно появиться совершенно новое раскрывающееся окно выбора:

Вы должны увидеть форму конфигурации ссылки на меню компонента в Joomla 4

Здесь вы можете увидеть наш новый параметр конфигурации "Greeting Type" (Тип приветствия). Это поле, которое мы определили в XML ранее, используя языковые строки, которые мы также определили. Чтобы проверить изменения, выберите один из возможных типов приветствий и сохраните ссылку меню. Как только ссылка будет сохранена, зайдите на фронтенд вашего сайта на Joomla 4 и нажмите на ссылку в меню сайта. Вы должны увидеть соответствующее выбранному в админке приветствие:

новый параметр конфигурации

Чтобы убедиться, что переменная запроса работает правильно, не забудьте несколько раз переключить в админке Joomla 4 конфигурацию ссылки меню с разными параметрами. Сообщение на сайте должно изменяться соответствующим образом.

Отлично! Теперь у нас есть страница, берущая простые данные из модели, и эта модель может отвечать на переменные запроса. Дальше мы, наконец, приступим к настройке нашей базы данных и подключим к ней нашу модель данных.