OutBoxML: как мы построили свою ML‑платформу от архитектуры до продакшена
Если вы хоть раз выводили ML‑модель в прод, то знаете этот сценарий.
Папки final_final_v2, десятки Python‑скриптов, неотслеженные версии данных, ручной деплой на сервер, и тревожное чувство, что «где‑то что‑то точно отвалится».
Со временем даже хорошо построенный ML‑процесс превращается в хаос — набор несовместимых пайплайнов и моделей, где каждый инженер решает задачу по‑своему.
Мы столкнулись с этим тоже. Но вместо того чтобы латать процессы по частям, мы решили построить собственную ML‑платформу OutBoxML — систему, которая централизует всё: от обучения и управления фичами до продакшн‑деплоя и мониторинга качества моделей.
OutBoxML — это не концепция на слайдах, а реальный проект, который мы внедрили в продакшн, чтобы стабилизировать и масштабировать ML во всём ИТ‑контуре Страхового Дома ВСК.
В серии из трёх статей на Хабре наши инженеры подробно разбирают, как мы прошли путь от архитектуры до продакшена, какие решения приняли — и какие ошибки помогли нам вырасти.
Решение: платформа OutBoxML
Мы не остановились на обёртках вокруг сторонних инструментов — мы создали OutBoxML: платформу, способную управлять жизненным циклом моделей от разработки до стабильного продакшена.
Мы шаг за шагом описываем во всех трёх статьях, как родилась архитектура, как устроен компонент работы с признаками и как устроена надёжность при выводе моделей.
В первой статье мы показываем конструкцию ядра OutBoxML и обоснование архитектурных подходов.
Ключевой технический инсайт: мы ушли от монолитных систем и отдали предпочтение сервисам с чёткими границами ответственности, использованию событийной коммуникации и контейнеризации.
Мы описываем принципы маршрутизации данных, версионирования и взаимодействия между сервисами, а также как обеспечиваем воспроизводимость экспериментов.
Машинное обучение в страховании — это не только про красивые метрики на этапе тестирования. Самая большая проблема приходит позже, когда модель выходит «в прод»: данные начинают меняться, и точность предсказаний падает. Это явление называется Data Drift. В статье мы делимся практическим опытом:
как диагностировать дрифт с помощью PSI‑метрики;
как использовать SHAP‑анализ для переосмысления модели;
чем отличается модель «с дрифтом» от модели «без дрифта» на реальных страховых данных.
Мы показываем не теорию, а эксперимент с открытым кодом и цифрами: какие признаки пришлось исключить, как изменилась логика модели и что это дало бизнесу на практике.
Совсем скоро выйдет заключительная статья нашего первого цикла open source проекта OutBoxML!
Присоединяйтесь к нашему проекту на GitHub и в Telegram. К тому же, библиотека опубликована в pypi и доступна к установке через pip install outboxml
Пишите в комментариях, о каких аспектах автоматизации ML вам хотелось бы узнать подробнее. Удачи в реализации ваших проектов!
В репозитории Awesome First Pull Request Opportunities больше сотни проектов, в которые новички могут делать пул-реквесты и получать обратную связь и даже советы по изучению программирования. Все проекты разделены по языкам и темам: C#, C++, Java, JS, фронтенд, бэкенд, информбезопасность, мобильная разработка под iOS и Android. Каждый найдет проект и стек. Проекты и репозитории ведут реальные разработчики и постоянно их поддерживают. Каждая команда всегда читает пул-реквесты, часто дает советы по разработке и обучению, обратную связь новичкам и даже шанс попасть на стажировку.
Репозиторий с тысячами приложений, которые можно захостить на своем сервере. Больше 50 категорий приложений, внутри которых сотни инструментов под различные задачи. Есть всё для аналитики, бронирования ресторанов и отелей, автоматизации рутины, чтения книг и журналов. Можно использовать файлообменники, парсеры, приложения для мониторинга и многое другое. Каждая программа работает только локально.
О скрипте: быстрая и безопасная оценка экспозиции устройств Cisco IOS/IOS XE, связанная с CVE-2025-20352 (подсистема SNMP).
Сканируем подсети на SNMP через onesixtyone с дефолтными сообществами. Парсим баннеры sysDescr.0 Python-скриптом: помечаем Cisco IOS/IOS XE и проставляем статус Fixed (если в белом списке) или Potentially Vulnerable (проверить в Cisco Software Checker).
Проект не эксплуатирует уязвимость. Он лишь определяет устройства, отвечающие на дефолтные SNMP-сообщества, и извлекает версию из sysDescr.0.
Представлен инструментарий Stupid Meter для оценки в реальном времени работы крупных языковых моделей, включая OpenAI GPT-5, Anthropic Claude Opus 4 и Google Gemini 2.5 Pro. Система непрерывно запускает более 140 тестов, проверяя корректность, стабильность, эффективность и способность к восстановлению после ошибок. Результаты отображаются на виде таблице, показывающем текущее состояние моделей.
Также Stupid Meter анализирует затраты на выполнение задач. В расчёт берутся не только цены API, но и количество попыток, необходимых для получения правильного ответа. Таким образом, более дорогая модель может оказаться выгоднее «дешёвой», если справляется быстрее. Исходный код проекта на GitHub: AI Stupid Meter - API Server и AI Stupid Meter - Web Frontend.
Конкурс open source проектов, которые способны изменить мир 🌏🖥️
Зовем вас на «Код без границ» — грантовую программу для развития open source проектов, которую совместно с Cloud.ru и Хабром подготовили GitVerse. Поделитесь своими разработками на GitVerse, получите шанс выиграть 💸💸💸 и получить поддержку в масштабировании идеи.
Номинации конкурса:
AI-инновации.
Наука и образование без границ.
Для всех и каждого (приложения и сервисы).
Разработка для разработчиков — инструменты и библиотеки.
Как участвовать? Рассказываем:
Разместите репозиторий вашего проекта на GitVerse или импортируйте его с другой git-площадки.
Подайте заявку до 31 октября. В ней должна быть ссылка на уже размещенный конкурсный проект.
Подождите, пока жюри — опытные спецы из СберТеха (GitVerse), Сбера, Cloud.ru и лидеры отрасли — посмотрят работы и выберут финалистов.
Узнайте результаты в декабре.
Что по призам и плюшкам?
Гранты 150, 100 и 50 тысяч рублей — для первого, второго и третьего места.
Облачные ресурсы Cloud.ru для реализации ваших масштабных идей.
Помощь с масштабированием проекта, поддержка экспертов и нетворкинг.
Регистрируйтесь, принимайте участие и покажите силу открытого кода 💪
Всем привет. Позвольте показать вам как скачать содержимое чата Телеграм к себе на ПК, включая сообщения.
Нам понадобится скачать программу OpenTgResearcher. Исходные коды лежат на ГитХаб. Комьюнити лицензию можно получить бесплатно в автоматическом режиме через меню программы. Скачать можно стабильный релиз, либо самую новую превью версию в разделе релизов. Есть несколько вариантов установки: консольная версия (кроссплатформенная), докер версия (для продвинутых), десктоп версия (под Windows).
Установим десктоп версию. Для этого нам понадобится дистрибутив. В списке файлов релиза найдите OpenTgResearcherDesktop‑win‑x64-Setup.exe (64-разрядная архитектура ПО). Браузер может запросить разрешение на скачивание и сохранение файла, а также предупредить, что файлы редко скачиваются. После чего, Windows предупредит вас, что файл скачан из интернета и спросит разрешение на установку. Для проверки дистрибутива на вирусы можете воспользоваться онлайн сервисом проверки VirusTotal. По завершении установки ПО вы должны увидеть загрузочную страницу. Из которой вы можете попасть на главную страницу.
Главная страница
Поздравляю, вы справились! Теперь необходимо настроить локальные каталоги. В главном меню слева выбираем Settings. В них вы можете задать путь к хранилищу (Storage: c:\OpenTgResearcher\TgStorage\TgStorage.db) и путь к файлу сессии(Session: C:\Users\<userName>\AppData\Local\OpenTgResearcherDesktop\current\OpenTgResearcher.session). После чего, сохраняем настройки и закрываем ПО, запускаем заново.
Итак, у нас есть локальное хранилище и путь к файлу сессии. Теперь нам необходимо получить авторизацию от самого Телеграм и сохранить сессию. Для этого, в главном меню слева открываем Client connection. Кликаем по ссылке my.telegram.org, в открывшейся странице браузера, вводим свой номер телефона, код авторизации получаем в боте Telegram Service Notifications. Далее, мы заполняем поля App title, Short name. Выписываем поля App api_id, App api_hash. Переходим обратно в OpenTgResearcher и заполняем поля API hash, API ID, Phone number. Эти данные сохранятся в локальном хранилище в таблице APPS. Если вы используете пароль, то заполните поле Password (это поле не сохраняется в таблице, если сессия протухнет, придётся вводить заново). После чего нажмите кнопку Connect to TG server. Возможно, к вам снова придёт код авторизации, в таком случае, его необходимо скопировать и вставить в поле Login code. После чего снова нажать Connect to TG server. В случае успеха — поле Connection state изменит своё положение на крайнее правое и описание рядом Client is connected, а также заполнятся остальные поля блока Settings without saving. В случае ошибок, смотрим содержимое поля Data request и запрашиваем помощь в Телеграм группе.
Что дальше? Просканируем доступные каналы и группы. Для этого в главном меню слева кликнем по меню Chats. Изначально список будет пуст. Заполним его, кликнув по кнопке Online update. Вы увидите прогресс парсинга ваших чатов. Сверху отображается текущий статус чтения, сколько чатов всего. Снизу отображается защитный механизм Телеграм — Flood Control. После определённой порции данных, Телеграм просит подождать несколько секунд, эта информация обновляется автоматически. По завершении парсинга, можно открыть любой чат, дважды кликнув по строке с именем. В открывшейся странице деталей чата настроим каталог для сохранения медиа (Directory). Если чат содержит темы, то можете включить переключатель Creating subdirectories. Если нам нужны комментарии - включите переключатель Parsing comments. Далее сохраним настройки — Save chat settings. Поздравляю, всё готово для скачивания — жмём кнопку Online update. Запустится процесс скачивания медиа и парсинга сообщений. В случае отмены — нажмите кнопку Stop download. Прогресс отображается в строках Message и Media.
Это мой первый пост на хабре. Оставляйте свои комментарии и пожелания.
Инженер по безопасности компании Fortinet представил экспериментальный инструмент KittyLoader. Это небольшой загрузчик, написанный на C и Ассемблере, который автор сам называет крайне ненадёжным и не предназначенным для практического применения.
Решение KittyLoader задумывалось как учебный проект и демонстрация базовых принципов работы загрузчиков, а не как готовое решение для использования. Исходный код проекта открыт на GitHub, любой желающий может изучить репозиторий и поэкспериментировать с модификациями загрузчика.
По словам автора, проект KittyLoader не стоит рассматривать как инструмент для реальных задач: он создан в первую очередь ради интереса и в образовательных целях. Несмотря на минимализм и очевидные ограничения, KittyLoader может быть полезен исследователям и студентам, которые хотят понять, как устроена загрузка и выполнение программ на низком уровне.
Представлен музыкальный сервис OpenSpot Music с треками со многих стримингов с высоким качеством музыки. Алгоритмы подборки помогут найти новые песни, можно собрать собственные плейлисты.
Посткапитализм и open source: как свободный код меняет экономику
Прочитал книгу
Пол Мейсон в книге «Посткапитализм: путеводитель по нашему будущему» выдвигает радикальную мысль: информационные технологии не просто трансформируют капитализм, они постепенно подрывают его изнутри. В центре этой трансформации - феномен open source и совместного производства.
Нулевая стоимость копирования
Ключевой аргумент Мейсона заключается в том, что цифровые товары отличаются от всех предыдущих. Если производство автомобиля или стула требует новых затрат на каждый экземпляр, то программа, музыкальный файл или цифровая модель после создания копируются почти бесплатно. Экономисты называют это нулевыми предельными издержками.
В мире, где информация легко тиражируется, рушится основа рыночной системы - дефицит. Рынок всегда опирался на редкость: чем меньше товара, тем выше цена. Но когда продукт можно распространять свободно и массово, привычные механизмы перестают работать.
Википедия, Linux, Firefox
Мейсон иллюстрирует свои тезисы примерами:
Википедия, созданная усилиями добровольцев, фактически уничтожила рынок энциклопедий и лишила рекламную индустрию миллиардов долларов доходов.
Linux показал, что даже сложнейшие операционные системы можно развивать децентрализованно, без корпоративной иерархии.
Firefox доказал, что независимые сообщества способны конкурировать с монополистами вроде Microsoft.
Даже Android, который Google и Samsung коммерциализировали, остаётся вынужденно открытым в своей основе, иначе он потерял бы ту самую энергию сообществ, которая сделала его популярным.
Производство «на равных»
Открытый код - это не благотворительность, а новая форма организации труда. Мейсон называет её «одноранговым производством на равных». Люди участвуют в проектах не ради зарплаты, а потому что хотят сотрудничать, обмениваться знаниями, решать задачи и оставлять след в истории. Здесь мотивация выходит за пределы классического «экономического эгоизма», а деньги перестают быть главной мерой ценности.
Это уже сегодня создаёт «островки посткапитализма» внутри старой системы. Там, где действуют сообщества разработчиков, привычные границы между трудом и хобби, бизнесом и добровольчеством размываются.
Конфликт с капитализмом
Однако капитализм не сдаётся. Чтобы сохранить прибыль, он создаёт монополии, агрессивно защищает интеллектуальную собственность и искусственно поддерживает дефицит. Так формируется противоречие: между возможностью свободного доступа к информации и интересами корпораций, банков и правительств, которые стараются удержать старую модель.
И даже корпорации вынуждены адаптироваться. Microsoft, когда-то называвшая Linux «раком», сегодня является одним из крупнейших контрибьюторов в open source и владельцем GitHub. Google построила свою мобильную империю на открытом ядре Linux. Это не благотворительность, а прагматизм: чтобы оставаться конкурентоспособными, они вынуждены взаимодействовать с «всеобщим интеллектом», используя его и внося свой вклад. Тем самым, даже против своей воли, они легитимизируют и усиливают нерыночные принципы.
«Всеобщий интеллект» и новая экономика
Здесь Мейсон обращается к Марксу и его «Отрывку о машинах». Маркс ещё в XIX веке писал, что по мере развития индустрии главным производительным фактором становится не труд отдельного рабочего, а знание. Коллективное знание, или «всеобщий интеллект», невозможно адекватно оценить в рыночных терминах. Оно разрушает сам фундамент капитализма, который строится на частной собственности и измеримой стоимости.
Вместо итога
Книга Мейсона предлагает интересную перспективу: рассматривать свою деятельность в open source не просто как хобби или способ профессионального развития, а как участие в формировании принципиально нового типа экономических отношений.
Российская компания Selectel, развивающая Linux-дистрибутив Selectel OS на пакетной базе Debian, представила инициативу OpenFix, в рамках которой начнёт выплачивать энтузиастам денежные вознаграждения за участие в работе над задачами, связанными с развитием и исправлением ошибок в открытом ПО. Код выполненных проектов будет публиковаться под пермиссивной лицензией с сохранением авторства участников.
Вознаграждения назначается индивидуально и выплачивание после принятия изменения в Debian или Ubuntu и закрытия сообщения об ошибке.
Предложено три направления деятельности, выполнение задач в которых Selectel готов оплачивать:
переписывание известных открытых проектов на язык Rust. В настоящее время доступны три задачи, связанные с переписыванием с языка С на Rust кода проектов xz, c‑ares и libxml2 c сохранением поведения оригинала.
вознаграждение за переписывание библиотек libxml2 и c‑ares и определено в 350 тысяч рублей, а библиотеки xz в 200 тысяч рублей, но в случае xz указано, что достаточно переписать критические части библиотечных обвязок и связать с существующей Си‑реализацией алгоритма LZMA.
формирование и последующее сопровождение (подготовка обновлений) пакетов для Debian GNU/Linux. Приложения для которых предлагается создать deb‑пакеты (c опциональным продвижением созданного пакета в Debian Unstable): apache‑pulsar, bash‑it, bazel, bitwarden‑cli, composefs, cve‑bin‑tools, doh‑cli, dupd, dyff, firecracker, griddb, jailhouse, keycloak, oauth2-proxy, phoronix‑testsuite, photodedupe, purritobin, shh, skim, sssh‑tpm‑agent, uv, vaultwarden. Размер вознаграждения от 30 до 160 тысяч рублей. Премии меньше 50 тысяч рублей определены для uv, dyff, doh‑cli, purritobin и bash‑it, а больше 100 тысяч для jailhouse, bazel, sssh‑tpm‑agent, keycloak, griddb, firecracker и apache‑pulsar.
Исправление ошибок в существующих открытых проектах. Участники на своё усмотрение могут выбирать проблемы, подтверждённые в системах отслеживания ошибок Debian и Ubuntu (Launchpad), после чего согласовать возможность получения вознаграждения за их исправление с Selectel. Вознаграждения назначается индивидуально и выплачивание после принятия изменения в Debian или Ubuntu и закрытия сообщения об ошибке.
Как триггерить события для плагинов на манер Joomla 5+?
В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:
создать объект класса события
передать в него именованные параметры
use Joomla\CMS\Event\AbstractEvent;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
// Грузим плагины нужных групп
PluginHelper::importPlugin('system');
// Создаём объект события
$event = AbstractEvent::create('onAfterInitUniverse', [
'subject' => $this,
'data' => $data, // какие-то данные
'article' => $article, // ещё материал вдовесок
'product' => $product, // и товаров подвезли
]);
// Триггерим событие
Factory::getApplication()->getDispatcher()->dispatch(
$event->getName(), // Тут можно строку передать 'onAfterInitUniverse'
$event
);
// Получаем результаты
// В случае с AbstractEvent это может быть не 'result',
// а что-то ещё - куда сами отдадите данные.
// 2-й аргумент - значение по умолчанию,
// если не получены результаты
$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды.
Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;
$event = MyCoolEvent::create('onAfterInitUniverse', [
'subject' => $this,
'eventClass' => MyCoolEvent::class, // ваш класс события
'data' => $data, // какие-то данные
'article' => $article, // ещё материал вдовесок
'product' => $product, // и товаров подвезли
]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.
🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
Data Sapience приглашает на онлайн-конференцию «Kolmogorov Online Day» ⚙️
Эксперты Data Sapience раскроют секреты эффективного управления жизненным циклом моделей и расскажут, как увеличить отдачу от ML-инвестиций.
Дата: 18 сентября 📆 Время: 16:00 ⏰ Формат: онлайн 🌐
Что будет представлено: ▪️Достижения Kolmogorov AI: этапы развития, ключевые результаты; ▪️«Тессеракт» — обзор нового ПАКа для создания доверенных моделей ИИ; ▪️Срез практик MLOps — объективный взгляд на тренды и подводные камни, а также подходы к работе с AI от независимых экспертов; ▪️Демонстрация возможностей Kolmogorov AI для построения фабрики ИИ-агентов.
Вебинар будет полезен тем, кто хочет: ▪️Автоматизировать и ускорить вывод моделей в production; ▪️Наладить эффективный MLOps и перейти от экспериментов к промышленной эксплуатации; ▪️Найти подходящие инструменты и узнать об опыте создания надежной, масштабируемой и высокопроизводительной инфраструктуры для ML-моделей.
Представлен мегарепозиторий 500 + 𝗔𝗿𝘁𝗶𝗳𝗶𝗰𝗶𝗮𝗹 𝗜𝗻𝘁𝗲𝗹𝗹𝗶𝗴𝗲𝗻𝗰𝗲 𝗣𝗿𝗼𝗷𝗲𝗰𝘁 𝗟𝗶𝘀𝘁 𝘄𝗶𝘁𝗵 𝗰𝗼𝗱𝗲, который поможет прокачаться в ML, компьютерном зрении, парсинге данных для нейронок, NLP. Там 500 проектов с пошаговыми инструкциями. Все проекты распределены по уровням — есть задачи как для новичков, так и для продвинутых специалистов.
Представлен открытый проект TruffleHog, который умеет анализировать хранилища данных и приложений, чтобы найти пароли, важные сведения и другую приватную информацию. В сервис заложено больше 700 детекторов различных видов данных и тысячи API, по которым инструмент ищет нужную информацию. Решение имеет встроенную поддержку сканирования GitHub, GitLab, Docker, файловых систем, S3, GCS, Circle CI и Travis CI. Также TruffleHog умеет сканировать сертификаты TLS, двоичные файлы, документы и медиа.
Представлен проект Chatterbox Multilingual, который умеет бесплатно клонировать любой голос с короткой записи. Решение умеет озвучивать любой текст с эмоциями, поддерживает 23 языка, среди которых и русский. Также там можно расставлять акценты, делать паузы, выделять слова голосом, контролировать тон и тембр. А ещё есть библиотека голосов, которые можно использовать в проектах.
Microsoft представила открытый исходный код интерпретатора BASIC для восьмиразрядных микропроцессоров MOS Technology 6502, разработанный в 1975 году. Опубликованная в открытом виде версия BASIC устанавливалась в ПЗУ размером 8 КБ и поддерживала работу на системах Apple II, Commodore PET, Ohio Scientific, MOS KIM-1с и симуляторе PDP-10. Код включает 6955 строк на ассемблере и открыт под лицензией MIT. Последнее изменение датировано 28 июлем 1978 года.
Код BASIC для 6502 может представлять интерес для любителей ретрокомпьютеров, использующих эмуляторы и реализации на базе FPGA. Среди прочего, компания Commodore анонсировала модель Commodore 64 ULTIMATE на базе FPGA, начало продаж которого намечено на октябрь. В Commodore 64 ULTIMATE заявлена совместимость с более чем 10 тысячами ретро игр при таких возможностях, как передача игр по Wi‑Fi, поддержка USB и режим ускорения для запуска новых игр.
2 апреля 2025 года Билл Гейтс в честь 50-летия Microsoft в своём блоге Gates Notes представилисходный код Altair BASIC (более 7 тыс. строк с комментариями), который он написал в соавторстве с Полом Алленом. Гейтс назвал этот проект «самым крутым кодом», который он когда‑либо писал, и символом скромного начала компании. В 1976 году Билл Гейтс и Рик Вейланд подготовили порт Altair BASIC для микропроцессоров 6502, который был лицензирован компанией Commodore и поставлялся как Commodore BASIC в компьютерах Commodore PET, VIC-20 и Commodore 64.
Опубликован исходный код игры "Русская рулетка 2: закрытые планеты".
2 сентября 2025 года исходники были выложены на Internet Archive, архив включает в себя тексты программ на языках C++/Asm (Требуются Turbo Assembler и Watcom C/C++), дополнительные утилиты для сборки и набор игровых данных для версий игры на разных языках (русский, английский, немецкий, итальянский).
Исходный код был предоставлен одним из разработчиков игры, Святославом "Suavik" Образцовым, под лицензией правообладателя:
Все оригинальные файлы разработаны и предоставлены компанией Logos.
Лицензия позволяет публикацию и использование исходных текстов программ и данных с любыми изменениями при обязательном указании, что оригинальные файлы были разработаны компанией Logos.
All original files are developed and provided by Logos.
The license allows publication and use of source code of programs and data with any changes, provided that the original files were developed by Logos.
Раскопал интересный тип поля в Joomla - Groupedlist.
В процессе работы над компонентом нужно разделить опции выпадающего списка на группы. Я писал ранее как это сделать просто в коде тут: статья, пост.
Но как сделать такой список для использования в описаниях форм в xml? Первой мыслью было сделать свой тип поля, расширяющий стандартный \Joomla\CMS\Form\Field\ListField. Однако, в ядре Joomla нашёлся уже готовый класс поля для группированных списков \Joomla\CMS\Form\Field\GroupedlistField. Он расширяет напрямую FormField и имеет 2 метода - getGroups() и getInput().
В getInput() вызывается метод getGroups() для получения массивов с группами опций и его можно было спокойно заменить на getcollectLayoutData(), где этой работе самое и место, но это не слишком принципиально. И там и там работа делается. Поэтому нас интересует именно метод getGroups().
Мы создаём свой класс поля, расширяем GroupedlistField. Делаем обязательно свой $type для поля и реализуем метод getGroups(). Всё.
<?php
use Joomla\CMS\Form\Field\GroupedlistField;
use Joomla\CMS\HTML\HTMLHelper;
class ServerschemelistField extends GroupedlistField
{
// type совпадает с именем файла и класса
// без суффикса 'Field'
protected $type = 'Serverschemelist';
/**
* Method to get the field options.
*
* @return array The field option objects.
*
* @throws Exception
*
* @since 1.0.0
*/
protected function getGroups(): array
{
// наши группы
$group1 = [];
$group2 = [];
// Собираем первую группу опций
foreach ($data as $item) {
$optionattr = [];
// Атрибуты для <option>
if ($something_happend) {
$optionattr['option.attr'] = [
'selected' => 'selected',
'onclick' => 'earthQuake()',
'showon' => 'field1:value1000',
];
}
$group1[] = HTMLHelper::_(
'select.option',
$item->option_value,
$item->option_label_text,
$optionattr
);
}
// Аналогично собираем $group2
// ...
$groups = [
['Имя группы 1'] = $group1,
['Имя группы 2'] = $group2,
];
// В parent::getGroups() будут значения
// из xml-описания формы, если они есть.
// Соединяем их с нашими.
return array_merge(parent::getGroups(), $groups);
}
}