Компонент: структура и точка входа
Компонент — самое крупное расширение Joomla: раздел со своими страницами, таблицами в базе и экранами в панели управления. Начнём компонент com_hello — простой блог с записями. В этом уроке создадим его каркас: манифест и провайдер. Страницы появятся в следующем.
Две папки
Компонент состоит из двух частей, и лежат они в разных местах сайта:
administrator/components/com_hello/ часть для панели управления
├── hello.xml манифест
├── services/
│ └── provider.php точка входа — одна на обе части
├── src/ классы панели
└── tmpl/ макеты панели
components/com_hello/ часть для сайта
├── src/ классы сайта
└── tmpl/ макеты сайтаСоздайте эти папки вручную. Манифест и провайдер всегда лежат в административной части — даже если компонент работает только на сайте.
Манифест
<?xml version="1.0" encoding="UTF-8"?>
<!-- administrator/components/com_hello/hello.xml -->
<extension type="component" method="upgrade">
<name>com_hello</name>
<version>1.0.0</version>
<description>Учебный блог</description>
<namespace path="src">My\Component\Hello</namespace>
<files folder="site">
<folder>src</folder>
<folder>tmpl</folder>
</files>
<administration>
<menu>Hello</menu>
<files folder="administrator">
<folder>services</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
</administration>
</extension>| Часть манифеста | Назначение |
|---|---|
Первый раздел files | Файлы части для сайта |
Раздел administration | Всё, что относится к панели |
menu | Название пункта в меню «Компоненты» панели |
Атрибуты folder | Папки в архиве ZIP, из которых установщик берёт файлы |
Пространство имён
В манифесте пространство имён одно, а Joomla сама делит его по частям:
| Пространство имён | Папка |
|---|---|
My\Component\Hello\Site | components/com_hello/src |
My\Component\Hello\Administrator | administrator/components/com_hello/src |
My\Component\Hello\Api | api/components/com_hello/src |
Провайдер
// administrator/components/com_hello/services/provider.php
defined('_JEXEC') or die;
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
use Joomla\CMS\Extension\ComponentInterface;
use Joomla\CMS\Extension\MVCComponent;
use Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
use Joomla\CMS\Extension\Service\Provider\MVCFactory;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
return new class () implements ServiceProviderInterface {
public function register(Container $container): void
{
$container->registerServiceProvider(new MVCFactory('\\My\\Component\\Hello'));
$container->registerServiceProvider(new ComponentDispatcherFactory('\\My\\Component\\Hello'));
$container->set(
ComponentInterface::class,
function (Container $container) {
$component = new MVCComponent($container->get(ComponentDispatcherFactoryInterface::class));
$component->setMVCFactory($container->get(MVCFactoryInterface::class));
return $component;
},
);
}
};Когда приходит запрос с option=com_hello, Joomla выполняет этот файл. MVCFactory умеет создавать контроллеры, модели и представления компонента по их именам, а MVCComponent — готовый класс компонента, устроенного по схеме MVC.
Схема MVC
| Часть | Папка в src | Что делает |
|---|---|---|
| Контроллер | Controller | Принимает запрос и решает, что делать |
| Модель | Model | Получает и сохраняет данные |
| Представление | View | Берёт данные у модели и передаёт их макету |
| Макет | tmpl (рядом с src) | Выводит HTML |
Установка
Откройте «Система → Установка → Поиск», нажмите «Найти» и установите com_hello. В меню панели «Компоненты» появится пункт «Hello». Пока он ведёт на страницу с ошибкой: у компонента нет ни одного контроллера. Это исправит следующий урок.
Частая ошибка
Манифест кладут в components/com_hello — по аналогии с модулем. Поиск такой компонент не находит: Joomla ищет манифест компонента только в administrator/components/com_hello. Там же должна лежать папка services.