Обновление статьи: Использование WebAssetsManager Joomla 4 и добавление собственных пресетов с помощью плагина
В статье рассказывается о том, как добавлять веб-ассеты (css, js, шрифты) в Joomla 4 и Joomla 5 с использованием концепции WebAssets. В статье описывался пример создания плагина по старой архитектуре Joomla. При попытке создать плагин по новой архитектуре стали тот же код отказался работать. По итогу исследований статья обновлена:
1 изменение. В методе getSubscribedEvents() плагина не должно быть никакой логики, кроме маппинга событий и методов плагина.
2 изменение. Предыдущая рекомендация была подключать веб-ассеты на событие onAfterInitialise
. Однако, это одно из самых ранних системных событий. На этом этапе Joomla ещё не знает какой именно тип документа требуется отобразить (HTML, Json и т.д.). Использование привычных методов Factory::getDocument()
(устаревший вызов) или Factory::getApplication()->getDocument()
приводили к слишком ранней инициализации типа документа и в случае использования документов типа Json могли вызывать ошибку. Об этом написано в переводе статьи Распространенные ошибки при написании плагинов Joomla 4. В случае с типом документа HTML всё работало, но под капотом оно было неправильно.
3 изменение. Вторым нюансом в выборе правильного системного события оказалось то, что есть WebAssetRegistry - реестр ассетов. И WebAssetManager - менеджер по работе с ассетами. WebAssetRegistry инициализируется и доступен раньше, чем WebAssetManager. Его можно получить из контейнера например на событие onAfterRoute и здесь же добавить свой ассет. Как оказалось, событие onBeforeCompileHead - это одно из самых последних вызываемых событий и добавлять именно файл joomla.asset.json
в этот момент жизненного цикла приложения уже слишком поздно. Поэтому, как я писал ранее, попытки зарегистрировать веб-ассет на событии onBeforeCompileHead
приводили к тому, что joomla.asset.json
добавлялся в реестр ассетов, но не парсился. Что равносильно тому, что его не существует.
4 изменение. Все методы плагинов должны возвращать пустоту - void
- и использовать $event->setResult();
и $event->setArgument();
для возврата результатов.
Теперь примеры кода исправлены.