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\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" в списке ссылок справа.
Вы должны снова увидеть форму конфигурации ссылки на меню, но теперь должно появиться совершенно новое раскрывающееся окно выбора:
Здесь вы можете увидеть наш новый параметр конфигурации "Greeting Type" (Тип приветствия). Это поле, которое мы определили в XML ранее, используя языковые строки, которые мы также определили. Чтобы проверить изменения, выберите один из возможных типов приветствий и сохраните ссылку меню. Как только ссылка будет сохранена, зайдите на фронтенд вашего сайта на Joomla 4 и нажмите на ссылку в меню сайта. Вы должны увидеть соответствующее выбранному в админке приветствие:
Чтобы убедиться, что переменная запроса работает правильно, не забудьте несколько раз переключить в админке Joomla 4 конфигурацию ссылки меню с разными параметрами. Сообщение на сайте должно изменяться соответствующим образом.
Отлично! Теперь у нас есть страница, берущая простые данные из модели, и эта модель может отвечать на переменные запроса. Дальше мы, наконец, приступим к настройке нашей базы данных и подключим к ней нашу модель данных.