Разработка кастомного плагина 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 месяцев.
- Полное сопровождение: от идеи до продакшена.
Получите консультацию по вашему проекту. Оценим задачу и предложим оптимальное решение в кратчайшие сроки.







