Encodera

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

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

Оглавление

Компонент: структура и точка входа

Компонент — самое крупное расширение 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\Sitecomponents/com_hello/src
My\Component\Hello\Administratoradministrator/components/com_hello/src
My\Component\Hello\Apiapi/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.

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

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