007 Добавление переменной запроса в ссылку меню сайта компонента для Joomla 4
Предыдущая статья этого пособия была на тему «Добавление модели для фронтенда в компонент на Joomla 4.x». Для понимания излагаемого материала рекомендуется читать и сразу выполнять приводимые в публикациях данные.
- Добавление переменной запроса в ссылку меню
- Необходимые изменения в коде файлов компонента Joomla 4
- Содержимое файлов компонента для Joomla 4.x
- Тестирование компонента в Joomla 4 с внесёнными дополнениями
Добавление переменной запроса в ссылку меню
Теперь у нас есть страница на сайте (фронтенде) нашей установки Joomla, которая может отображать приветственное сообщение, предоставленное моделью данных. В этой статье рассмотрим, как добавить переменную запроса в ссылку меню, созданную ранее, и узнаем, как прочитать переменную запроса внутри модели данных. В зависимости от выбранного в админке значения переменной мы покажем разные приветствия.
Необходимые изменения в коде файлов компонента Joomla 4
Есть два основных изменения, которые нам нужно будет сделать:
- Добавление переменной запроса и ее возможных значений в XML-определение ссылки меню.
- Добавление кода в модель для чтения переменной запроса и выбора соответствующего приветствия.
- Обновление:
site/tmpl/hello/default.xml- Добавление нового параметра в определение ссылки меню.
- Обновление:
site/src/Model/MessageModel.php- Пусть модель данных представления решит, какое приветствие возвращать.
- Обновление:
admin/language/en-GB/en-GB.com_helloworld.sys.ini- Добавление новых языковых констант, необходимых при настройке ссылки меню.
- Обновление:
site/language/en-GB/en-GB.com_helloworld.ini- Замена существующей строки приветствия на два приветствия, которые можно будет выбрать.
- Обновление:
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\FactoryJoomla 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" в списке ссылок справа.

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

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

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