Автоматическое подключение локализации для веб-ассета в Joomla
Начиная с Joomla 4 в ядре реализована концепция веб-ассетов. Управление JavaScript и CSS в Joomla значительно упростилось благодаря классу WebAssetManager. Есть замечательная статья Как правильно подключать JavaScript и CSS в Joomla 4, в которой подробно и с примерами кода рассказывается об этой концепции и её применении. Например, в web asset мы можем оформить какую-нибудь готовую js-карусель или библиотеку.
Также можно оформить веб-ассетом и свой собственный js-скрипт, которому могут понадобиться дополнительные данные для работы на странице: как данные из PHP, так и языковые константы. С помощью WebAssetManager мы можем получить эти данные в момент сразу при подключении ассета. Как это сделать?
Для веб ассетов в Joomla создаётся файл joomla.asset.json, в котором описываются url подключаемых файлов, версии, их зависимости друг от друга, собираются пресеты для подключения пачкой и т.д. В нём можно указать пользовательский класс WebAssetItem, который будет выполнять нужную работу для вашего ассета. Для этого определите свойства namespace и class для всего файла или же для каждого ассета.
{ "$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json", "name": "com_example", "version": "4.0.0", "namespace": "Joomla\Component\Example\Administrator\WebAsset", "assets": [ { "name": "foo", "type": "script", "class": "FooAssetItem", "uri": "com_example/foo.js" }, { "name": "bar", "type": "script", "namespace": "MyFooBar\Library\Example\WebAsset", "class": "BarAssetItem", "uri": "com_example/bar.js" } ] }
Ассет foo будет работать с классом Joomla\Component\Example\Administrator\WebAsset\FooAssetItem, а ассет bar с классом MyFooBar\Library\Example\WebAsset\BarAssetItem. Если namespace не указан, будет использоваться Joomla\CMS\WebAsset по умолчанию. Ну и сам класс должен находиться по указанному неймспейсу.
<?php /** * Класс WebAssetItem для подключения данных для работы веб ассета */ namespace Joomla\Component\Example\Administrator\WebAsset\AssetItem; \defined('_JEXEC') or die; use Joomla\CMS\Document\Document; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\WebAsset\WebAssetAttachBehaviorInterface; use Joomla\CMS\WebAsset\WebAssetItem; class FooAssetItem extends WebAssetItem implements WebAssetAttachBehaviorInterface { /** * Method called when asset attached to the Document. * * @param Document $doc Active document * * @throws \Exception * * @since 1.0.0 */ public function onAttachCallback(Document $doc) { Factory::getApplication()->getLanguage()->load('com_example'); // Add my-js-script.js language strings Text::script('COM_EXAMPLE_LANGUAGE_STRING_FOR_FRONTEND'); /** @var array $data Данные для фронтенда, чтобы получать их * в js через Joomla.getOptions('com_example.foo.js.data';) */ $data = [ 'any' => 'data', ]; /** @var bool $merge Whether merge with existing (true) or replace (false) */ $merge = true; $doc->addScriptOptions('com_example.foo.js.data', $data, $merge); } }
Таким образом для нашего js-скрипта мы получили и локализованные стринги сообщений (как? - пост на Хабре) и дополнительные данные из PHP для фронтенда (статья на Хабре - в середине). Теперь когда вы где-то в любом месте Joomla подключаете веб ассет с помощью $wa->useScript('foo') - автоматически подключится всё необходимое для его работы.
