Разработка кастомного плагина Joomla
Представьте: ваш клиент просит добавить синхронизацию статей с CRM при публикации. Или нужно интегрировать внешний OAuth-провайдер для входа пользователей. Базовыми средствами Joomla такое не сделать — нужен кастомный плагин. Опыт показывает, что готовые расширения не покрывают специфические интеграции, а кастомный плагин решает задачу в 3 раза быстрее, чем адаптация готового компонента. Мы разрабатываем плагины под любые события: от обработки контента до аутентификации. За 7 лет реализовали 30+ плагинов для Joomla 3, 4 и 5, используя современные API и Joomla! Documentation: Plugin Development.
Какие проблемы решаем
Стандартные расширения Joomla ограничены. Например, при сохранении статьи нельзя автоматически отправить данные во внешнюю систему. Или при входе пользователя — проверить его через корпоративный LDAP. Плагины перехватывают события жизненного цикла CMS и выполняют свою логику без правки ядра.
Мы сталкивались с типичными сложностями:
- N+1 запросы при синхронизации большого объёма контента. Решение: агрегируем данные в один запрос, используем пакетную обработку.
- Конфликты с кэшированием Joomla. Плагин, вызывающий внешний API при каждом показе страницы, может замедлить сайт. Решение: кэшируем ответы в Redis или выносим тяжёлые операции в фоновые задачи (Joomla Task Scheduler).
- Ошибки при обновлении Joomla. Устаревшие API вызывают 500-е ошибки. Решение: поддерживаем только Joomla 4 и 5, используем современные события и DI.
Как мы это делаем?
Стек: PHP 8.1+, MySQL 8, Redis (опционально). Для аутентификации — OpenID Connect, OAuth 2.0. Для интеграций — REST, SOAP, GraphQL.
Подход: применяем SubscriberInterface и DI-контейнер Joomla. Код покрываем модульными тестами (PHPUnit). Результат — стабильный плагин, готовый к продакшену.
Схема работы
Проектирование архитектуры, написание кода, тестирование на Joomla 4 и 5, деплой. Подробнее в этапах ниже.Кейс: недавно реализовали плагин для сети аптек на Joomla 5. Он синхронизирует цены и остатки с 1С через REST API. Обработка 2000 товаров за 10 минут, 0 ошибок за месяц работы.
Структура плагина
Плагины Joomla реагируют на системные события. Перехватывают моменты жизненного цикла: до/после сохранения статьи, при аутентификации, при поиске, при отправке формы. Это самый правильный способ расширить поведение системы без модификации ядра.
Группы плагинов
| Группа | Событие | Применение |
|---|---|---|
| content | onContentBeforeSave, onContentAfterSave | Обработка контента |
| user | onUserLogin, onUserAfterSave | Аутентификация, синхронизация |
| system | onAfterRoute, onBeforeRender | Глобальные перехваты |
| authentication | onUserAuthenticate | Внешние провайдеры входа |
| finder | onFinderIndexItem | Поисковый индекс Smart Search |
| task | onExecuteTask | Планировщик задач (Joomla 4+) |
Структура плагина
plg_content_synccrm/ ├── plg_content_synccrm.php # Точка входа (для legacy) ├── plg_content_synccrm.xml # Манифест ├── services/ │ └── provider.php # DI Provider └── src/ └── Extension/ └── SyncCrmPlugin.php # Основной класс Манифест
<?xml version="1.0" encoding="utf-8"?> <extension version="4.0" type="plugin" group="content"> <name>plg_content_synccrm</name> <author>Your Company</author> <version>1.0.0</version> <description>Синхронизация контента с CRM при публикации</description> <namespace path="src">MyCompany\Plugin\Content\SyncCrm</namespace> <files> <filename plugin="plg_content_synccrm">plg_content_synccrm.php</filename> <folder>services</folder> <folder>src</folder> </files> <config> <fields name="params"> <fieldset name="basic"> <field name="crm_api_url" type="text" label="URL CRM API" /> <field name="crm_api_key" type="password" label="API Key CRM" /> <field name="sync_types" type="checkboxes" label="Синхронизировать типы"> <option value="article">Статьи</option> <option value="product">Товары</option> </field> </fieldset> </fields> </config> </extension> Как создать плагин Joomla под задачу?
Шаги разработки:
- Определяем группу событий (content, user, system или другую).
- Создаём манифест, DI-провайдер и основной класс с подпиской на события.
- Реализуем логику обработки события — отправка в CRM, проверка токенов, вызов внешнего API.
- Настраиваем параметры плагина через XML-форму (URL, ключи, флаги).
- Тестируем на Joomla 4 и 5, покрываем unit-тестами.
Пример кода основного класса:
// src/Extension/SyncCrmPlugin.php namespace MyCompany\Plugin\Content\SyncCrm\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\Event; use Joomla\Event\SubscriberInterface; class SyncCrmPlugin extends CMSPlugin implements SubscriberInterface { public static function getSubscribedEvents(): array { return [ 'onContentAfterSave' => 'syncToCrm', ]; } public function syncToCrm(Event $event): void { [$context, $article, $isNew] = array_values($event->getArguments()); if ($context !== 'com_content.article') return; if ((int) $article->state !== 1) return; $syncTypes = $this->params->get('sync_types', []); if (!in_array('article', (array) $syncTypes)) return; try { $this->sendToCrm([ 'type' => 'article', 'external_id'=> $article->id, 'title' => $article->title, 'url' => \Joomla\CMS\Router\Route::link('site', 'index.php?option=com_content&view=article&id=' . $article->id), 'published' => (bool) $article->state, 'updated_at' => $article->modified, ]); } catch (\Exception $e) { $this->getApplication()->getLogger()->error('CRM sync failed: ' . $e->getMessage()); } } private function sendToCrm(array $data): void { $apiUrl = rtrim($this->params->get('crm_api_url'), '/') . '/articles'; $apiKey = $this->params->get('crm_api_key'); $http = \Joomla\CMS\Factory::getContainer() ->get(\Joomla\Http\HttpFactory::class) ->getHttp(); $response = $http->post($apiUrl, json_encode($data), [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $apiKey, ]); if ($response->code >= 400) { throw new \RuntimeException('CRM API error: ' . $response->code); } } } Что входит в работу?
| Этап | Результат |
|---|---|
| Анализ | Описание события, требования к интеграции |
| Проектирование | Архитектура, конфигурация, обработка ошибок |
| Реализация | Код плагина, манифест, параметры настройки |
| Тестирование | Модульные тесты, интеграция с Joomla |
| Документация | Инструкция по установке, настройке и API |
| Поддержка | Гарантия 1 год, помощь при обновлении Joomla |
Дополнительно можем настроить CI/CD, добавить кэширование, реализовать фоновые задачи.
Сроки и стоимость
Разработка плагина для одной группы событий — от 2 до 5 дней. Примеры:
- Синхронизация с внешним API (авторизация, пакетная отправка) — 3 дня.
- Плагин аутентификации через SSO (OAuth, LDAP) — 5 дней.
- Простой обработчик контента (фильтрация, модификация) — 2 дня.
Точную оценку дадим после анализа вашей задачи. Стоимость рассчитывается индивидуально.
Типичные ошибки при разработке плагинов Joomla
- Использование устаревших классов (JFactory, JDatabase вместо DI).
- Неправильная обработка кэширования — плагин выполняется при каждом запросе, замедляя сайт.
- Отсутствие обработки исключений — критическая ошибка валит весь сайт.
- Жёсткая привязка к одной версии Joomla без учёта совместимости.
Мы учитываем эти риски на этапе проектирования.
Почему выбирают нас?
- 7+ лет опыта разработки под Joomla.
- 30+ реализованных плагинов для разных версий.
- Сертифицированные разработчики Joomla.
- Гарантия на код — 12 месяцев.
- Полное сопровождение: от идеи до продакшена.
Получите консультацию по вашему проекту. Оценим задачу и предложим оптимальное решение в кратчайшие сроки.







