Адреса и пункты меню
Страница компонента задаётся параметрами: index.php?option=com_hello&view=posts. Посетителю показывают понятный адрес вроде /blog. Между этими двумя видами адреса переводит маршрутизатор Joomla, а основу понятного адреса даёт пункт меню.
Ссылки в коде
В коде и макетах адрес всегда пишут параметрами и пропускают через Route::_():
<?php
// components/com_hello/tmpl/posts/default.php
defined('_JEXEC') or die;
use Joomla\CMS\Router\Route;
?>
<a href="<?php echo Route::_('index.php?option=com_hello&view=post&id=1'); ?>">Первая запись</a>Route::_() превращает параметры в адрес, принятый на этом сайте. Какой он будет, зависит от настроек и меню — код при этом не меняется.
Тип пункта меню
Чтобы страницу можно было добавить в меню, рядом с макетом кладут файл с тем же именем и расширением .xml. Создайте вручную:
components/com_hello/tmpl/posts/
├── default.php
└── default.xml новый файл<?xml version="1.0" encoding="UTF-8"?>
<!-- components/com_hello/tmpl/posts/default.xml -->
<metadata>
<layout title="Блог Hello: список записей">
<message>Показывает все опубликованные записи блога</message>
</layout>
</metadata>Этот файл ничего не выводит: он лишь сообщает панели, что у компонента есть страница, пригодная для меню.
Пункт меню
- Откройте «Меню → Main Menu → Создать».
- В поле «Тип пункта меню» нажмите «Выбрать» — в списке появился раздел
com_helloс типом «Блог Hello: список записей». - Задайте заголовок «Блог» — алиас
blogJoomla подставит сама. - Сохраните.
В меню сайта появилась ссылка «Блог», а страница списка открывается по адресу /blog (или /index.php/blog, если на сервере не включена перезапись адресов).
Что стало со ссылками
Понятные адреса включаются в «Система → Общие настройки → Сайт → Настройки SEO». При включённых адресах Route::_() возвращает:
| Параметры | Адрес |
|---|---|
option=com_hello&view=posts | /blog — нашёлся пункт меню |
option=com_hello&view=post&id=1 | Адрес с оставшимися параметрами в строке запроса, например /blog?view=post&id=1 |
Параметры, для которых нет пункта меню, остаются в строке запроса: Joomla не знает, как превратить view=post&id=1 в часть пути.
Параметр Itemid
У каждого пункта меню есть номер. Joomla добавляет его к запросу параметром Itemid и по нему определяет активный пункт: какие модули показать и какой шаблон применить. Вручную Itemid в ссылки обычно не пишут — маршрутизатор подбирает его сам.
Свой маршрутизатор
Чтобы запись открывалась по адресу вида /blog/1, компоненту нужен собственный класс маршрутизатора. Он лежит в файле components/com_hello/src/Service/Router.php и наследует готовый класс Joomla\CMS\Component\Router\RouterView. В нём описывают, какие представления есть у компонента, какое из них вложено в какое и какой параметр служит ключом записи. Кроме того, маршрутизатор регистрируют в services/provider.php.
Это заметный объём кода, и для первого компонента он не обязателен. Готовый образец — компонент статей: файл components/com_content/src/Service/Router.php и его провайдер в administrator/components/com_content/services/provider.php.
Параметры пункта меню
В default.xml можно описать поля, которые администратор заполнит при создании пункта, — так же, как параметры модуля, только внутри тега fields с именем request или params. Например, так компонент статей спрашивает, какую именно статью показать.
Частая ошибка
Адреса в макетах собирают вручную: href="/blog?view=post&id=1" или href="index.php?option=..." без Route::_(). Такие ссылки ломаются, как только администратор переименует пункт меню, включит или выключит понятные адреса либо перенесёт сайт в подпапку. Любую внутреннюю ссылку пропускайте через Route::_().