Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Адреса и пункты меню

Страница компонента задаётся параметрами: 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>

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

Пункт меню

  1. Откройте «Меню → Main Menu → Создать».
  2. В поле «Тип пункта меню» нажмите «Выбрать» — в списке появился раздел com_hello с типом «Блог Hello: список записей».
  3. Задайте заголовок «Блог» — алиас blog Joomla подставит сама.
  4. Сохраните.

В меню сайта появилась ссылка «Блог», а страница списка открывается по адресу /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::_().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.