Розробка кастомного компонента 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. Вартість фіксується в договорі, без прихованих витрат.
Зв'яжіться з нами для консультації — оцінимо проєкт безкоштовно та покажемо приклади подібних компонентів. Замовте розробку без ризику — ми надаємо фіксований кошторис.







