Розробка кастомного плагіна Joomla
Уявіть: ваш клієнт просить додати синхронізацію статей з CRM при публікації. Або потрібно інтегрувати зовнішній OAuth-провайдер для входу користувачів. Базовими засобами Joomla таке не зробити — потрібен кастомний плагін. Досвід показує, що готові розширення не покривають специфічні інтеграції, а кастомний плагін вирішує задачу в 3 рази швидше, ніж адаптація готового компонента. Ми розробляємо плагіни під будь-які події: від обробки контенту до автентифікації. Реалізували 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 |
| Підтримка | Гарантія 12 місяців, допомога при оновленні Joomla |
Додатково можемо налаштувати CI/CD, додати кешування, реалізувати фонові завдання.
Терміни та вартість
Розробка плагіна для однієї групи подій — від 2 до 5 днів. Приклади:
- Синхронізація із зовнішнім API (авторизація, пакетна відправка) — 3 дні.
- Плагін автентифікації через SSO (OAuth, LDAP) — 5 днів.
- Простий обробник контенту (фільтрація, модифікація) — 2 дні.
Точну оцінку дамо після аналізу вашого завдання. Вартість розраховується індивідуально.
Типові помилки при розробці плагінів Joomla
- Використання застарілих класів (JFactory, JDatabase замість DI).
- Неправильна обробка кешування — плагін виконується при кожному запиті, сповільнюючи сайт.
- Відсутність обробки винятків — критична помилка валить увесь сайт.
- Жорстка прив'язка до однієї версії Joomla без урахування сумісності.
Ми враховуємо ці ризики на етапі проектування.
Чому обирають нас?
- Багаторічний досвід розробки під Joomla.
- 30+ реалізованих плагінів для різних версій.
- Сертифіковані розробники Joomla.
- Гарантія на код — 12 місяців.
- Повний супровід: від ідеї до продакшену.
Отримайте консультацію щодо вашого проєкту. Оцінимо завдання та запропонуємо оптимальне рішення в найкоротші терміни.







