Представлен список из 20 самых популярных стартапов 2024 года с открытым исходным кодом по всему миру с точки зрения количества «звёзд» GitHub в проектах и их прироста. Оказалось, что более половины из них (11 из 20) тесно связаны с ИИ.

Открытое программное обеспечение
Представлен список из 20 самых популярных стартапов 2024 года с открытым исходным кодом по всему миру с точки зрения количества «звёзд» GitHub в проектах и их прироста. Оказалось, что более половины из них (11 из 20) тесно связаны с ИИ.
Redash в Amvera Cloud
Сегодня мы выпускаем Redash, как преднастроенный сервис.
Redash позволяет осуществлять запросы к базам данных и визуализировать результаты. Это хороший и простой BI-инструмент, которым мы пользуемся сами.
Для установки Redash необходимо заполнить по инструкции несколько переменных/секретов для подключения к PostgreSQL и Redis, и выбрать тариф от 290 р./мес.
Amvera Cloud — это облако для простого деплоя приложений через git push. Встроенный CI/CD, бэкапы и мониторинг позволяют развернуть проект тремя командами в IDE и не думать о настойке инфраструктуры. А встроенное проксирование к OpenAI, облегчает работу с LLM. Amvera проще, чем использование VPS.
Собственные макеты вывода для пользовательских полей Joomla
Мы привыкли использовать механизм переопределения макетов Joomla: скопируй нужный тебе файл макета в папку html шаблона и твори там что хочешь. Это в полной мере относится и к пользовательским полям Joomla.
Joomla ищет макеты рендера всех пользовательских полей в следующем порядке:
Есть ли файл templates/[template name]/html/layouts/[component name]/fields/render.php
, переопределяющий макет вывода полей для конкретного компонента? Да - используем его.
Нет? Есть ли файл components/[component name]/layouts/fields/render.php
в папке компонента? Да - используем его.
Нет? Есть ли файл templates/[template name]/html/layouts/com_fields/fields/render.php
, переопределяющий вывод полей для com_fields
? Да - используем его.
Нет? Используем файл components/com_fields/layouts/fields/render.php
Это механизм поиска переопределений файлов макетов.
Вчера столкнулся с тем, что если поле вставлено в текст материала с помощью шорт-кода (кнопкой редактора) вида {field 25}
, то переопределения не сработали. Поэтому стал вспоминать как сделать свой макет для поля Joomla.
Файл components/com_fields/layouts/field/render.php
копируем в templates/YOUR_TEMPLATE/html/layouts/com_fields/field/etapy-raboty-nad-proektom.php
. Обратите внимание, что мы файл переименовали, чтобы в настройках поля видеть его в выпадающем списке. После этого всё заработало как надо.
Благо, переводил уже раньше статью Как происходит рендер пользовательских полей в Joomla?. Потом, порывшись по своему же переводу увидел, что эта особенность работы Joomla в статье уже в ней описана 😂. А также напомнил себе о возможности указывать макет поля прямо в шорт-коде, через запятую: {field 25,etapy-raboty-nad-proektom}
.
IMPulse - менеджмент инцидентов. Интеграция с Telegram.
После первой публикации об IMPulse, стало понятно, что основная интеграция, которую от нас ждут, это Telegram. И мы рады её представить!
Для работы с Telegram мы использовали группы с топиками - они лучше всего ложатся на наш функционал. В процессе разработки мы столкнулись с багом при упоминании (mention) пользователей в Telegram, о чём составили соответствующий issue. Если вы тоже заинтересованы в закрытии этого бага, пожалуйста поставьте "👍".
Помимо интеграции с Telegram стоит упомянуть реализованный шедулер для работы команд реагирования по расписанию. Синтаксис конфигурации составлен таким образом, чтобы в будущем была возможность интегрироваться с внешними календарями типа Google.
Также мы запустили нашу группу в Telegram для вопросов и обсуждений.
Скоро мы снова придём с очередными хорошими новостями! Подписывайтесь здесь, в Telegram'е или на GitHub'е, чтобы быть в курсе.
В Joomla 4 и Joomla 5 появилась концепция Web Assets и WebAssetManager, с помощью которого можно управлять подключениями css, js файлов, подключением. Все css и js файлы включаются в общий реестр ассетов, затем выстраивается граф зависимостей и в итоге на генерируемую страницу подключается только то что нужно на данной странице.
Поскольку веб-ассеты можно добавлять с помощью плагинов (ссылка на статью ниже) - можно сказать, что появилось новое направление для плагинов - веб-ассеты. Вы можете устанавливать плагины, включающие веб-ассеты и использовать их как зависимости в самых разных местах Joomla: в шаблоне, в макетах модулей и плагинов.
Одним из таких плагинов веб-ассетов является WT JSwiper.js. Плагин добавляет в Joomla Web Assets Registry ассет популярного скрипта swiper.js, который потом легко можно использовать в коде:
use Joomla\CMS\Factory;
$wa = Factory::getApplication()->getDocument()->getWebAssetManager();
// Локальный файл
$wa->useScript('swiper-bundle')->useStyle('swiper-bundle');
// Подключение из CDN
$wa->usePreset('swiper-bundle-remote');
😐 Например, было: иконочный шрифт могут использовать 2 разных модуля. CSS обычно подключается в шаблоне и он грузится везде, даже там, где не надо. Если же подключать CSS в одном модуле, а в другом нет - на странице стиль есть ровно до тех пор, пока опубликован модуль с этим подключением.
👍 Стало: теперь в макетах расширений мы просто пишем $wa->useStyle('my.style');
и за необходимостью подключения нужного ассета (в данном случае CSS с иконочным шрифтом) следит Web Asset Manager. Если мы снимем один модуль с публикации, то нужный ассет подключит другой модуль.
Поскольку плагин - расширение Joomla - его можно обновлять обычным для Joomla способом и всегда иметь самую свежую версию любимого js-скрипта или веб-ассета на всех своих сайтах и сайтах ваших клиентов.
В этой версии, кроме обновления собственно ассета до версии 11.2.5 к нему добавился пока что частичный перевод документации Swiper на русский язык.
Также будет полезно:
Исследование выявило ключевые тенденции в том, как open-source проекты работают с документацией:
✅ README-файлы появляются на ранних этапах жизни проекта.
✅ Руководства по внесению вкладов (CONTRIBUTING) добавляются позже, когда активность растёт.
✅ Документация в основном сосредоточена на использовании и внесении изменений, а не на развитии сообщества, несмотря на частые рекомендации уделять больше внимания именно этому аспекту.
Хотя развитие сообщества считается важным фактором устойчивости FLOSS-проектов, не все основатели сразу ставят эту цель. Более того, излишний упор на построение сообщества на ранних этапах может усложнить процесс и отпугнуть потенциальных участников.
🔍 Главный инсайт: Вместо универсального подхода open-source проекты могут выстраивать стратегию документации, исходя из реального роста и потребностей участников. Интересно, что более содержательная документация, как правило, коррелирует с расширением проекта со временем.
Обойдемся и без Terraform: внедряем GitOps-подход для виртуальных машин
Для работы с OpenStack удобно использовать Terraform. Хотя компания Hashicorp прекратила свою деятельность на территории России, нам все еще доступен open source-форк под говорящим названием OpenTofu. Он позволяет автоматизировать создание виртуальных машин на основе текстовых файлов конфигурации. Схема его работы примерно такая:
В GitOps-репозитории находятся terraform-файлы с описанием параметров виртуальных машин и DNS.
На основе этих файлов формируются конфигурации для новых ВМ.
Все изменения вносятся через pull request, а их корректность проверяется автоматическими запусками тестов в CI.
После слияния изменений CI запускает процесс приведения нового желаемого состояния репозитория к действительному.
Этот подход отлично масштабируется, позволяет быстро создавать новые кластеры. Достаточно лишь скопировать все файлы в новые директории и поменять нужные переменные. В итоге с OpenTofu вы сможете описывать инфраструктуру в декларативном формате и автоматически применять изменения.
В своей статье Кирилл Яшин рассказывает, как с нуля реализовать такой подход к виртуальным машинам, используя провайдеры для работы с OpenStack и DNS.
Судьба плагина обратной совместимости в Joomla
Некоторых разработчиков и вебмастеров интересует останется ли плагин обратной совместимости в Joomla 6. Этот плагин был создан для того, чтобы сделать переход от версии к версии более гладким и бесшовным.
Подробнее почитать о роли плагина можно в официальной документации на manual.joomla.org: Compatibility Plugin.
Устаревший код МОЖЕТ быть перемещен в плагин совместимости. Плагин обеспечивает более плавное обновление между основными версиями. Он содержит код из предыдущей версии, который может сломать сайт после обновления, поскольку расширение использует устаревший код. Расширение полностью совместимо только тогда, когда оно работает без проблем с отключенным плагином совместимости.
От версии к версии часть кода ядра Joomla помечается как устаревшая, а затем, спустя некоторое время удаляется из основного ядра и МОЖЕТ быть перемещена в плагин обратной совместимости. Эта концепция появилась при переходе от Joomla 4 к Joomla 5.
Важным уточнением является то, что для новой мажорной версии (joomla 3, joomla 4, joomla 5 и т.д.) плагин содержит устаревший код предыдущей версии. То есть для Joomla 5 это код из Joomla 4. Для Joomla 6 - код из Joomla 5.
Таким образом расширения, использующие методы и функции ядра Joomla и всё ещё работающие даже с плагином обратной совместимости на Joomla 5 в Joomla 6 скорее всего работать уже не будут. В Joomla 6 из плагина обратной совместимости будет удален код, поддерживающий обратную совместимость с Joomla 4. Таким образом стабильно работать в Joomla 6 будет то, что сейчас стабильно работает на Joomla 5 с отключённым плагином обратной совместимости.
Joomla-разработчикам: обращение к методам модели в HtmlView напрямую
Когда-то, давным-давно в одной далёкой галактике кто-то решил, что было бы неплохой идеей ввести в Joomla косвенный доступ к методам модели (MVC) для получения данных, добавив метод AbstractView::get()
. Этот метод извлекает модель и затем запускает get()
. Простыми словами, когда мы во View
(файл HtmlView нашего компонента) видим конструкцию $this->item = $this->get('Item')
это означает обращение к методу getItem()
модели для текущего View
.
Но такой подход исключает любую возможность подсказки типов, аргументов и т. д. и делает все излишне сложным. Поэтому разработчики ядра Joomla объявили этот метод устаревшим с этим PR 44162.
Новый способ выглядит так:
// Файл HtmlView компонента
public function display($tpl = null)
{
$model = $this->getModel();
$this->items = $model->getItems();
parent::display($tpl);
}
Старый подход (то есть метод get() во View) будет удалён в Joomla 7. Памятуя о релизном цикле Joomla, это означает, что:
осенью 2025г выйдет Joomla 6.
2 года она будет основной веткой. Joomla 5 будет в режиме поддержки
через 2 года, в 2027 выйдет Joomla 7, в которой будет удалён этот метод.
но Joomla 6 будет ещё 2 года в режиме тех.поддержки и в ней (до 2029 года) этот метод останется.
Таким образом у разработчиков есть от 2,5 до 4,5 лет (на момент написания этого поста) на то, чтобы сделать этот рефакторинг.
Дашборд — лицо системы: как сделать его удобным для команд из более 100 инженеров
Переосмысление дашборда стало одной из важных задач в процессе обновления интерфейса TMS TestY.
Разработчики сохранили общий принцип навигации после входа в приложение. Пользователь попадает на борду, где ему доступен переход на овервью, тестовые сьюты и тестовые планы. Сохранили возможность фильтрации по избранному, показ архива, статистику по проектам.
В Testy 2.0 можно выбрать, на каком языке будет работать система. Раньше интерфейс TMS был полностью англоязычным, теперь пользователям доступен русский язык — как часть плана поддержки локализации.
Добавили поиск по проектам и табличное представление, в котором доступно то же самое, что и на карточках: переходы, добавление в избранное, переключатели Only Favorites и Show Archive
В сайдбар слева унесли профиль пользователя и администрирование, убрали кнопку Dashboard, оставили логотип. Клик по логотипу вернет вас на начальную страницу в выбранном представлении. Помимо этого, убрали статистику системы наверху, этот блок теперь можно найти на овервью проекта.
Какие еще обновления появились в TMS с открытым исходным кодом, читайте в статье.
Если использовать в CI/CD (Jenkins, GitLab), воркеры с GraalVM (Вместо JRE) и Maven/Gradle, то можно ускорить сборку и тестирование Java приложений, примерно на 40%.
Я написал «фреймворк» специально для автоматизации создания базовых образов Docker под различные рантаймы.
https://github.com/avkcode/container-tools
Spring и Graal кстати отлично подходят друг для друга.
Совет по Joomla: показ уведомлений Joomla.renderMessages.
Пользователь совершает какие-то действия на сайте и получает сообщения об успешном или не успешном их результате, а также просто информационные сообщения. В php коде мы привыкли использовать для этого метод enqueueMessage()
:
use Joomla\CMS\Factory;
$html = 'Message';
Factory::getApplication()->enqueueMessage($html, 'warning');
Чаще всего в качестве сообщения используются языковые константы, чтобы пользователи могли получать сообщения на своём языке:
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
Factory::getApplication()->enqueueMessage(Text::_('SOME_LANG_CONSTANT'), 'info');
Рендер сообщений Joomla во фронтенде.
Здесь нам потребуется файл подключённые файлы ядра core.js и messages.js. Немного выдержки из кода:
/**
* Рендер сообщений, отправленных через JSON
* Используется некоторыми javascript, в частности validate.js
*
* @param {object} messages JavaScript объект, содержащий сообщения для рендера.
* Пример:
* const messages = {
* "message": ["Это будет зелёное сообщение", "И это тоже"],
* "error": ["Это будет красное сообщение", "И это тоже"],
* "info": ["Это будет синее сообщение", "И это тоже"],
* "notice": ["Какое-то информационное сообщение", "И это тоже"],
* "warning": ["Оранжевое сообщение", "И это тоже"],
* "my_custom_type": ["Такое же как инфо-сообщение", "И это тоже"]
* };
* @param {string} selector CSS-селектор контейнера для рендера сообщений
* @param {bool} keepOld Удалить предыдущие сообщения? Да, если true
* @param {int} timeout Таймаут исчезновения сообщения в миллисекундах
* @return void Метод ничего не возвращает
*/
Вот как это выглядит на практике:
Joomla.renderMessages({
message: [Joomla.Text._('COM_SWJPROJECTS_USER_KEYS_KEY_SUCCESSFULLY_COPYED')]
});
Теперь мы видим, что в качестве сообщения мы и в Javascript можем использовать языковые константы. Для этого мы используем метод Joomla.Text._()
(по аналогии с Text::_()
в PHP). Но Javascript откуда-то должен получить значения этих языковых констант. И для этого в php коде нашей страницы мы должны позаботиться о нём и добавить нужные для js языковые константы с помощью метода Text::script()
.
use Joomla\CMS\Language\Text;
Text::script('SOME_LANG_CONSTANT_SUCCESS');
Text::script('SOME_LANG_CONSTANT_FAIL');
Таким образом я смогу получить в js доступ к значениям языковых констант SOME_LANG_CONSTANT_SUCCESS
и SOME_LANG_CONSTANT_FAIL
.
Наш backend developer Дмитрий делится Open Source-проектом, который поможет разработчикам Telegram Mini Apps (TMA) упростить валидацию Init Data — проверку, что HTTP-запрос действительно был отправлен из приложения в Telegram.
Дмитрий реализовал Python-пакет, в котором имплементировал алгоритмы, позволяющие проверять подлинность данных, передаваемых из Mini Apps. С ним можно легко реализовать механизм авторизации/аутентификации для Backend-части приложения.
👉 Забирайте репозиторий: https://github.com/swimmwatch/telegram-webapp-auth
Также у проекта есть документация, в которой описывается применение этой библиотеки с популярными веб-фреймворками: Django, FastAPI.
Когда мы начинали разрабатывать TMA, то столкнулись с недостатком информации, кейсов, спросить или подсмотреть было не у кого – не так много компаний, которые занимаются созданием мини эппов. Сегодня же мы успешно реализовали несколько Telegram Mini Apps, накопили ценный опыт и готовы делиться своими Open Source-проектами с сообществом разработчиков и вкладываться в развитие технологии. Подписывайтесь на наш телеграм-канал!
Если у вас есть идея Telegram Mini App, то Doubletapp поможет ее воплотить, подробнее о наших кейсах – на сайте.
Событие Pizza, Bugs & Fun приближается - 22 февраля 2025 года
Уже несколько лет в мире Joomla проводятся мероприятия "Pizza, Bugs & Fun" (#PBF), где каждый может посвятить несколько часов своего мозгового времени тому, чтобы наша любимая CMS стала ближе к идеалу.
Видео из этого поста рассказывает об организационных вопросах, которые пригодятся для участия в PBF:
как создать аккаунт в Mattermost (чат международного Joomla-сообщества)
как создать аккаунт в Joomla! Documentation
как написать статью в Joomla! Documentation
как создать аккаунт на GitHub (у разработчиков обычно уже он есть)
как настроить патч тестер
как протестировать патч
как получить вознаграждение
В рамках события PBF все желающие могут собираться в общий онлайн чат, обсудить вопросы Joomla и приложить к их разрешению свою руку. Самый классный вариант, когда эта встреча происходит оффлайн: тогда организовывается пицца, напитки по вкусу и несколько часов совместного творчества.
Каждый помогает тем, что он умеет:
кто-то пишет недостающую документацию,
кто-то пишет код,
кто-то тестирует как исправлены ошибки или сделан новый функционал.
На сайте события есть карта, можно "захостить" свою локацию. Практически все движки в мире развиваются за счёт спонсирующих их компаний. Joomla одна из немногих, где развитие идёт только усилиями международного сообщества энтузиастов.
На момент написания данного поста в репозитории Joomla 752 открытых Issue (как правило это баги) и 223 Pull request (PR, исправление багов и новый функционал). Все PR обязательно тестируются минимум двумя участниками сообщества, дабы в конечный код движка не проскочила ошибка.
Если каждый из участников только нашего сообщества сделает даже одно тестирование, то, боюсь, PR и Issue на всех не хватит 😀
Совет по Joomla: программный рендер модулей
Модули порой удобно использовать в местах, которые в Joomla не всегда предназначены для этого 😀. Например, в переопределениях макета. Из материала делаем посадочную страницу: часть инфы находится в самом материале, часть - в полях, а часть удобно вывести модулем. При этом модуль этот должен находиться между телом материала и данными из пользовательских полей.
Для реализации берём в руки ModuleHelper
и приступаем.
<?php
use \Joomla\CMS\Helper\ModuleHelper;
$modules = ModuleHelper::getModules('landing-masonry');
if(!empty($modules))
{
foreach ($modules as $module)
{
// рендерим всё, что нашли в позиции landing-masonry
echo ModuleHelper::renderModule($module);
}
}
А что если посложнее?
В этом случае всё просто. Но здесь в тему будет упомянуть ещё один способ работы с модулями. Контекст: магазин одежды. В карточке товара нужно вывести информацию о размерной сетке, типовые рекомендации по уходу и т.д. Это короткие тексты, которые повторяются из товара в товар и не нужно их копировать многажды. Эти тексты отображались простым аккордеоном Bootstrap.
Вид карточки товара JoomShopping. Все тексты, кроме описания товара - одинаковые во всех товарах. Описание товара уникальное для каждого товара.
Но! В этот же аккордеон нужно было добавить и описание товара JoomShopping. Поэтому я сделал с помощью своего модуля WT Quick links следующее.
Создал модуль типа WT Quick Links, в котором в список элементов занёс все нужные тексты.
Не стал назначать модуль какой-либо позиции. В шаблоне JoomShopping захардкодил id модуля. Хотя лучше было бы назначить модуль в некой уникальной позиции, которая встречалась бы только в нужном нам месте на сайте.
Программным способом в данные модуля добавил нужные данные из JoomShopping так, как мне нужно (в начало списка - описание товара).
Отрендерил модуль с помощью ModuleHelper
в product_default.php шаблона JoomShopping.
<?php
use Joomla\CMS\Helper\ModuleHelper;
use Joomla\Registry\Registry;
// Модуль id 136 - Доставка, оплата и гарантии в карточку товара + ОПИСАНИЕ ТОВАРА JoomShopping
$module = ModuleHelper::getModuleById('136');
$module_params = new Registry($module->params);
// Формируем новые параметры модуля перед рендером.
$new_module_params = [];
$i = 1;
// Помещаем описание товара в самое начало
if (!empty($this->product->description)){
$new_module_params['fields']['fields0'] = (object) [
'item_header' => Text::_('JSHOP_DESCRIPTION'),
'item_text' => $this->product->description
];
}
// Переименовываем все остальные ключи массива элементов из модуля
foreach ($module_params->get('fields') as $key => $value)
{
$new_module_params['fields']['fields' . $i] = $value;
$i++;
}
$new_module_params = new Registry($new_module_params);
// Соединяем старые и новые параметры модуля.
$module_params->merge($new_module_params);
$module->params = $module_params->toString();
// Всё готово! Рендерим модуль.
echo ModuleHelper::renderModule($module);
Представлен открытый проект, который помогает создавать нейросети с нуля.
В Oumi вшиты все необходимые инструменты от препроцессинга данных и бенчмарков до различных видов обучения нейронок.
Решение содержит информацию как сделать ИИ‑спеца для различных задач, включая:
полную базу данных о популярных ИИ-моделях;
пошаговые инструкции для каждого этапа разработки своего ИИ;
гайд по файнтюнингу нейросетей, включая LoRA, подготовку данных и оценку производительности по бенчамаркам;
дистилляция моделей для снижения их размеров и повышения эффективности;
метрики работоспособности ИИ и необходимые фреймворки для тестов;
данные для удаленной тренировки моделей — AWS, Azure, GCP, Lambda с подробной документацией к каждой платформе;
инструменты для фильтрации данных для нейросетей и их цензурирования;
примеры готовых конфигураций.
Joomla Web Services Collection For Postman
Разработчикам мобильных и WEB-приложений (и не только) весьма и весьма пригодится готовая коллекция для Postman. В коллекцию добавлены endpoint для REST API Joomla, с параметрами и примерами запросов.
Коллекция составлена трудами французского Joomla-разработчика Alexandre J-S William ELISÉ.
Я разверну этот мониторинг «с трех нот»: система для инсталляций с десятками СХД
Инженеры YADRO включили в состав продукта TATLIN.SATELLITES интегрированное решение для мониторинга — система получила название Monitoring Appliance. Она включает в себя компоненты для сбора и хранения метрик со множества массивов, а также их визуализацию и алертинг.
Возможности Monitoring Appliance
Система мониторинга, разворачиваемая из Docker Compose, может:
Собрать метрики производительности компонентов СХД по протоколу SNMP.
Принять и обработать SNMP traps от СХД.
Принять и обработать Syslog-сообщения от СХД.
Мониторить состояние сервера, на котором установлен Monitoring Appliance.
Отображать данные мониторинга в виде дашбордов.
Оповещать о внештатных ситуациях и пороговых состояниях.
Главная страница визуализации мониторинг. На ней отображаются основные метрики «здоровья» систем хранения данных, на которых хочет сфокусироваться пользователь. Можно выбрать нужную СХД и получить данные конкретно по ней. Также этот дашборд легко пересобрать, исходя из своих целей.
Из чего состоит мониторинг и как его повторить, читайте по ссылке →
Совет по Joomla: метод debug() для отладки лейаутов
В Joomla есть понятие layout. Это кусочек вёрстки, который можно многажды использовать в любом месте сайта: как в панели администратора, так и во фронтенде. Можно рассматривать лейауты как оторванные от контекста элементы дизайна. Находятся они в папке layouts в корне сайта. Также, в случае с модулями они могут находиться в папке tmpl модуля. А в случае с плагинами - в tmpl плагина.
Их можно переопределять в шаблонах, в чём и заключается одна из главных фишек Joomla. Лейауты чаще всего рендерятся с помощью классов LayoutHelper
или напрямую FileLayout
. Писал о них ранее тут и тут.
А вот как увидеть какой именно файл переопределения используется? Сколько их вообще есть и по каким путям идёт поиск макетов? Для этого есть метод debug()
(и у LayoutHelper и у FileLayout).
<?php
/**
* Method to render a layout with debug info
*
* @param string $layoutFile Dot separated путь к файлу относитеьлно basePath
* @param mixed $displayData Объект с данными для рендера
* @param string $basePath Base path, где будет поиск файлов лейаутов
* @param mixed $options Дополнительные опции для FileLayout
*
* @return string
*
* @since 3.5
*/
public static function debug($layoutFile, $displayData = null, $basePath = '', $options = null)
{
// Так проще показать параметры метода.
}
То есть мы в можем проверить следующим образом:
<?php
/**
* Получаем параметры баннера
*/
$wt_custom_menu_item_banner = $menu->getParams()->get('wt_custom_menu_item_banner');
echo \Joomla\CMS\Layout\LayoutHelper::debug(
($wt_custom_menu_item_banner?->pluginlayout ?? 'default'),
['wt_custom_menu_item_banner' => $wt_custom_menu_item_banner],
JPATH_SITE.'/plugins/system/wt_custom_menu_item_banner/tmpl'
);
И увидим результат как на скриншоте в начале поста.
E-mail шаблоны Joomla 5: добавление и просмотр своих переменных
В Joomla 5 появились настраиваемые email-шаблоны, как системные, так и сторонних компонентов. Их нельзя (пока что) добавить самостоятельно, они добавляются расширениями при установке. Но их можно отредактировать в Система - Шаблоны - Шаблоны писем. В настройках шаблонов писем (кнопка настроек компонента в верхнем правом углу) мы выбираем формат писем текст или HTML. Тогда становятся доступны настройки макетов шаблонов писем Joomla. Эти глобальные параметры можно переопределить в каждом конкретном email-шаблоне. Таким образом для каждого из email-шаблонов можно указать свою вёрстку и настройки логотипа.
Это, конечно, требует отдельной подробной статьи...
Для разработчиков: как добавить свои переменные для e-mail шаблонов Joomla?
Полезны окажутся 2 триггера для плагинов: onMailBeforeTagsRendering
и onMailBeforeRendering
.
onMailBeforeRendering
- триггер, который позволяет добавлять свои шорт-коды для строковой замены в плагине. Отдать туда надо массив вида [ variable_name => variable_value ]
. Из админки свои переменные нужно добавлять уже с фигурными скобками: {variable_name}
заменится на variable_value
. Аргументом $event
плагина является экземпляр класса BeforeRenderingMailTemplateEvent
, в котором есть кроме прочих 2 метода: getTemplate()
(получение объекта мейлера, куда можно добавлять свои данные) и getTemplateId()
(получение id шаблона письма вида com_users.registration.admin.new_notification
), по которому мы определяем нужный ли это для нас email-шаблон или нет. Аналогично контексту в контент-плагинах.
Также полезное свойство класса для передачи данных из плагина в лейаут письма для рендера - $layoutTemplateData
. Это ассоциативный массив.
// Получаем текущий мейлер
$mailTemplate = $event->getTemplate();
$data = [
'variable_name' => 'variable_value'
];
// с Joomla 4 для всех типов писем. 2-й аргумент - plain - текстовый формат письма
$mailTemplate->addTemplateData($data, false);
// с Joomla 5.2 - для HTML-писем
$mailTemplate->addLayoutTemplateData($data);
// пример из ядра Joomla
// Add additional data to the layout template
$this->addLayoutTemplateData([
'siteName' => $app->get('sitename'),
'lang' => substr($this->language, 0, 2),
]);
onMailBeforeTagsRendering
- триггер, который добавляет ваши переменные в список доступных переменных для замены в окне редактирования email шаблона Joomla. Отдать туда нужно массив с переменными, но без их значений.