Додавання змінної запиту до посилання меню
(*Ця стаття є частиною посібника “Розробка MVC-компоненти для Joomla 4.x”. Вона є продовженням посібника з програмування. Тому, якщо ви не читали попередні частини, ми рекомендуємо вам це зробити.
Попередня стаття «Створення Моделі для клієнтської частини сайту»)
Тепер у нас є сторінка в загальнодоступному інтерфейсі нашої інсталяції Joomla, яка може відображати «Hello World!», надане моделлю даних. Тепер ми додамо змінну запиту до посилання меню, яке ми створили раніше, і навчимося читати змінну запиту всередині моделі даних. Залежно від значення змінної, ми будемо показувати різне фразування.
Необхідні редагування
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
Замініть існуючий рядок «Hello World» на дві фрази на вибір.
5 Відредагуйте файл: helloworld.xml
Для узгодженості ми збільшимо номер версії компоненти.
Опис файлів
site/tmpl/hello/default.xml
Хоча ця зміна може виглядати досить багатослівною, насправді вона дуже проста. Ми додаємо змінну запиту, що налаштовується (назване як “поле”), до нашого пункту меню. При редагуванні пункту меню в панелі управління Joomla це поле і його опції будуть відображатися на формі конфігурації.
Поля меню організовані в набори полів, хоча нам тут потрібне лише одне. Ми назвемо наше поле ‘greetingType’, яке буде додано до URL-адреси при натисканні на посилання. Ми також попередньо визначимо, які значення дозволені для цього поля, оскільки ми хочемо мати можливість покладатися на їхні значення в моделі даних. Ми робимо це, використовуючи type=“list”, щоб повідомити Joomla, що у нас є список значень, а потім надаємо їх у вигляді дочірніх елементів <option />.
Атрибут ‘value’ кожного <option /> - це фактичне значення, яке буде додано до URL-адреси (наприклад, &greetingType=1). Назва текстової контанти, всередині елемента <option />, являє собою мітку, яка буде виведена на форму конфігурації.
<?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
Тут ми читаємо нову змінну запиту через фреймворк Joomla і вирішуємо, яке з наших двох привітальних повідомлень показати. Цей код ілюструє, як читати змінні запиту в Joomla 4:
- Factory::getApplication()повертає об’єкт додатку. Ви будете часто використовувати цей код під час написання програм на Joomla, як точку входу в середовище виконання Joomla.
- ->getInput() повертає \Joomla\Input\Input для цього запиту. Цей об’єкт може бути використаний для безпечного читання змінних запиту.
- $input->getInt(‘greetingType’, 1); отримує значення змінної запиту ‘greetingType’, яку ми визначили раніше. Якщо значення не визначено, ми вказали, що вона має повертати значення за замовчуванням ‘1’.
ПРИМІТКА: Ніколи не використовуйте суперглобалі, такі як $_GET або $_POST, для доступу до змінних запиту або інших вхідних даних. Використовуйте фреймворк Joomla для доступу до будь-яких переданих або надісланих даних, щоб переконатися, що вони належним чином оброблені та очищені. ```
За допомогою змінної запиту ‘read’ ми просто обираємо, яку з двох можливих фраз повернути до шаблону.
<?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 {
/**
* Повертає Повідомлення для відображення
* @param integer $pk Primary key (первинний ключ) "message item", наразі не використовується
* @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;
}
}
admin/language/en-GB/en-GB.com_helloworld.sys.ini
Тут ми визначаємо текстові костанти, які будуть використовуватися у формі конфігурації для нашого посилання до пункту меню. Пам’ятайте, що хоча посилання меню визначено в частині компоненти у фронт-енді, фрази визначаються тут, тому що вони використовуються в панелі управління 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
Тут ми замінимо наше існуюче “Hello World” на два інших, які модель вибере на основі значення змінної запиту ‘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
Як і раніше, наша остання робота полягає у зміні номера версії компонентb. Жодна зі зроблених тут змін не вимагає зміни номера версії перед повторним імпортом, але ми зробимо це для узгодженості.
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="4.0" method="upgrade">
<name>Hello World</name>
<!-- Наступні елементи є необов'язковими і не мають обмежень щодо форматування -->
<creationDate>December 2020</creationDate>
<!-- Умовний автор, не соромтеся замінювати будь-де, де побачите -->
<author>John Smith</author>
<authorUrl>https://smith.ca</authorUrl>
<copyright>John Smith</copyright>
<license>GPL v3</license>
<!-- Дані про версію записується в таблицю компонентів -->
<version>0.0.6</version>
<!-- Опис, опціонально, і за замовчуванням співпадає з назвою -->
<description>
A hello world component!
</description>
<!-- Це простір імен PHP, у якому розширенні
реалізовано код. Він повинен мати такий формат:
Vendor\Component\ComponentName
"Vendor" може бути назва вашої компанії або ваше власне ім`я
Секція "Назва компонента" ПОВИННА збігатися з назвою, що використовується
для вашої компоненти в інших місцях. У будь-якому випадку, назва
XML-файлу та простір імен повинен збігатися (ігноруючи 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>
<!-- Посилання, яке з'явиться в адмін-панелі меню "Копонентів" -->
<menu link="index.php?option=com_helloworld">Hello World</menu>
<!-- Список файлів і папок для копіювання, а також куди їх копіювати -->
<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>
Тестування розширення
Як і раніше, заархівуйте вашу нову версію компоненти і завантажте її в адмін-панель вашого інсталятора Joomla! Після оновлення відкрийте налаштування головного меню з лівого меню, як ви це робили раніше, а потім клацніть по вашому посиланню “Hello World” у списку посилань, праворуч.
![](https://community.joomla-ua.org/assets/files/2024-07-10/1720602422-866710-main-menu-link.png)
Ви знову побачите форму конфігурації посилання меню, але тепер там має з’явитися абсолютно новий випадаючий список:
![](https://community.joomla-ua.org/assets/files/2024-07-10/1720602039-524632-menu-link-configuration.png)
Тут ви можете побачити наш новий параметр конфігурації ‘Greeting Type ‘. Це поле, яке ми визначили в XML раніше, використовуючи текстові константи, які ми також визначили. Щоб перевірити ваші дії, виберіть один з можливих фраз і збережіть посилання на пункт меню. Після того, як посилання буде збережено, відвідайте публічний розділ (фронт-енд) вашої інсталяції Joomla і натисніть на нього. Ви повинні побачити відповідну фразу.
![](https://community.joomla-ua.org/assets/files/2024-07-10/1720602349-812780-message-from-model-2.png)
Щоб переконатися, що змінна запиту працює корректно, перемкніть конфігурацію посилання меню кілька разів туди-сюди. Повідомлення на публічній сторінці має змінитися відповідно.
Чудово! Тепер у нас є сторінка, яка отримує прості дані від моделі, і ця модель може реагувати на змінні запиту. Далі ми нарешті перейдемо до налаштування нашої бази даних і підключення до неї нашої моделі даних.