Розробка кастомного компонента Joomla від ідеї до впровадження — наш профіль уже більше ніж 10 років. За цей час реалізували 50+ компонентів для каталогів, CRM, маркетплейсів та B2B-порталів. Працюємо строго за технічним завданням, передаємо весь вихідний код без обмежень і надаємо підтримку після запуску.
Кастомний компонент Joomla vs готове розширення
Уявіть: типове розширення для каталогу не підтримує потрібний фільтр, а доробка його коду перетворюється на пекло. Кожне оновлення ламає зміни, а клієнти скаржаться на гальма. Знайома біль? Ми стикалися з цим десятки разів. Саме тому розробляємо кастомні компоненти Joomla з нуля — під конкретну бізнес-логіку, без компромісів.
| Критерій | Готове розширення | Кастомний компонент |
|---|---|---|
| Функції | Багато зайвого | Тільки потрібне |
| Продуктивність | Середня, багато запитів | Оптимізовані запити, індекси |
| Безпека | Unknown codebase | Аудит та перевірка |
| Масштабування | Обмежене | Легко розширюється |
| Підтримка | Від вендора (часто платна) | Ми підтримуємо та доопрацьовуємо |
| Вартість володіння | Висока (підписки) | Низька (одноразово) |
Наприклад, у проєкті для мережі магазинів ми замінили три платних розширення одним кастомним компонентом. Кількість SQL-запитів на сторінку скоротилася з 50 до 5, TTFB впав на 40%, а LCP — на 35%. Бюджет на підтримку зменшився втричі.
Процес розробки кастомного компонента Joomla
Ми дотримуємося перевіреної методології. Починаємо з аудиту бізнес-вимог та проєктування схеми БД. Потім створюємо API на основі MVC-архітектури. Кожен компонент проходить код-рев'ю та навантажувальне тестування. Використовуємо Namespace, PSR-4, Dependency Injection — це спрощує підтримку.
Архітектура компонента Joomla
Компонент — основна одиниця функціональності (згідно з документацією Joomla). Має дві частини: Site та Administrator. Типова структура:
com_catalog/
├── catalog.xml # Маніфест
├── administrator/
│ └── components/
│ └── com_catalog/
│ ├── src/
│ │ ├── Controller/ # Контролери
│ │ ├── Model/ # Моделі
│ │ ├── View/ # В'юхи
│ │ └── Table/ # Таблиці БД
│ ├── tmpl/ # Шаблони
│ └── services/
│ └── provider.php # DI Provider
└── components/
└── com_catalog/
├── src/
│ ├── Controller/
│ ├── Model/
│ └── View/
└── tmpl/
Маніфест (catalog.xml)
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="4.0">
<name>Каталог товарів</name>
<namespace path="src">MyCompany\Component\Catalog</namespace>
<version>1.0.0</version>
<files folder="components/com_catalog">
<filename>index.html</filename>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<administration>
<files folder="administrator/components/com_catalog">
<filename>index.html</filename>
<folder>src</folder>
<folder>tmpl</folder>
<folder>services</folder>
</files>
<menu img="class:catalog">Каталог</menu>
</administration>
<install>
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.sql</file>
</sql>
</uninstall>
</extension>
Модель
// components/com_catalog/src/Model/ProductsModel.php
namespace MyCompany\Component\Catalog\Site\Model;
use Joomla\CMS\MVC\Model\ListModel;
class ProductsModel extends ListModel {
protected function getListQuery(): \Joomla\Database\QueryInterface {
$db = $this->getDatabase();
$query = $db->getQuery(true);
$query->select(['p.id', 'p.title', 'p.price', 'p.sku', 'p.category_id', 'c.title AS category_name'])
->from($db->quoteName('#__catalog_products', 'p'))
->join('LEFT', $db->quoteName('#__catalog_categories', 'c') . ' ON c.id = p.category_id')
->where($db->quoteName('p.published') . ' = 1');
// Фільтр за категорією
$categoryId = $this->getState('filter.category_id');
if ($categoryId) {
$query->where($db->quoteName('p.category_id') . ' = ' . (int) $categoryId);
}
// Пошук
$search = $this->getState('filter.search');
if ($search) {
$query->where($db->quoteName('p.title') . ' LIKE ' . $db->quote('%' . $search . '%'));
}
$query->order($db->quoteName($this->getState('list.ordering', 'p.title')) . ' ' . $this->getState('list.direction', 'ASC'));
return $query;
}
}
В'юха
// components/com_catalog/src/View/Products/HtmlView.php
namespace MyCompany\Component\Catalog\Site\View\Products;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Factory;
class HtmlView extends BaseHtmlView {
protected array $items = [];
protected object $pagination;
protected object $state;
public function display($tpl = null): void {
$model = $this->getModel();
$this->items = $model->getItems();
$this->pagination = $model->getPagination();
$this->state = $model->getState();
// Додати toolbar для адміністраторів
if (Factory::getApplication()->isClient('administrator')) {
$this->addToolbar();
}
parent::display($tpl);
}
protected function addToolbar(): void {
$toolbar = \Joomla\CMS\Toolbar\ToolbarHelper::class;
$toolbar::title('Каталог товарів', 'catalog');
$toolbar::addNew('product.add');
$toolbar::deleteList('', 'products.delete');
}
}
Типові помилки при розробці та їх вирішення
- N+1 запити: Joomla-моделі часто завантажують пов'язані дані окремими запитами. Ми використовуємо JOIN та eager loading (як у прикладі вище).
- Hydration mismatch: при кешуванні можливі конфлікти даних. Рішення — чітке розділення станів і коректна робота з кешем.
- Права доступу: ACL Joomla вимагає явних перевірок у коді. Ми додаємо їх у кожному контролері.
Що входить у розробку компонента Joomla
| Етап | Тривалість | Результат |
|---|---|---|
| Аналіз вимог | 2–5 днів | Технічне завдання |
| Проєктування | 3–7 днів | Схема БД, API-специфікація |
| Розробка | від 14 днів до 8 тижнів | Робочий код |
| Тестування | 3–5 днів | Звіт про помилки, покриття >80% |
| Документація | 1–2 дні | Інструкції, readme |
Строки та вартість
Строки — від 14 днів до 8 тижнів залежно від складності. Вартість визначається після аналізу вимог. Ми фіксуємо ціну в договорі та пропонуємо поетапну оплату.
Як ми гарантуємо якість?
Ми — команда з 10-річним досвідом розробки компонентів Joomla, реалізували 50+ проєктів. Кожен код проходить обов'язкове рев'ю та покривається unit-тестами — покриття від 80%. Використовуємо Git Flow та автоматизовані перевірки на CI/CD. Передаємо весь вихідний код без прив'язки до нашої команди. На всі роботи надаємо гарантійний період.
Часті помилки при самостійній розробці компонентів Joomla
- Відсутність DI Provider — компонент не бачить сервіс-контейнер, виникає помилка 500 при активації. Рішення: створити
services/provider.phpзComponentDispatcherFactoryInterface. - Прямі SQL-запити замість
QueryInterface— порушують сумісність з різними СУБД. Використовуйте$db->getQuery(true)та іменовані параметри. - Пропуск uninstall.sql — таблиці залишаються в БД після видалення компонента. Додайте SQL-скрипт у секцію
<uninstall>маніфесту. - Некоректні права ACL — користувачі бачать чужі дані або не можуть увійти в панель адміністратора. Перевіряйте
canDo('core.view')у кожному контролері. - Немає namespace у маніфесті — PSR-4 автозавантажувач Joomla 4+ не знаходить класи. Вкажіть
<namespace path="src">MyCompany\Component\Catalog</namespace>.
Як почати розробку кастомного компонента Joomla?
- Опишіть задачу — які дані компонент зберігає, який інтерфейс потрібен (site, admin або обидва).
- Безкоштовний аудит — ми вивчаємо вашу Joomla, встановлені розширення, схему БД.
- ТЗ та кошторис — фіксуємо функції, архітектуру та вартість у договорі до старту робіт.
- Розробка ітераціями — щотижня отримуєте робочий інкремент для перевірки.
- Здача та підтримка — документація, навчання команди, гарантійний період 3 місяці.
Розробка компонента обходиться значно дешевше багаторічної підписки на готові розширення — особливо при доопрацюваннях та оновленнях Joomla. Вартість фіксується в договорі, без прихованих витрат.
Зв'яжіться з нами для консультації — оцінимо проєкт безкоштовно та покажемо приклади подібних компонентів. Замовте розробку без ризику — ми надаємо фіксований кошторис.







