Розробка кастомного пакета (Extra) MODX
Уявіть: ви ведете сайт на MODX, і знадобилася нестандартна функціональність — каталог з фільтрацією за багатьма параметрами, бронювання з інтеграцією по API, складний бізнес-процес. Писати код вручну щоразу? Ненадійно, важко підтримувати, а при оновленні MODX все може зламатися. Рішення — розробити Distributable Extra: повноцінний пакет розширень, який встановлюється через Package Manager, легко передається клієнту або публікується в маркеті. Ми спеціалізуємося на створенні таких пакетів понад 5 років, виконали 20+ проектів для MODX 2 і 3. Гарантуємо сумісність з останніми версіями та дотримання стандартів MODX. Наш підхід скорочує час впровадження в середньому на 40% порівняно з написанням коду з нуля. Офіційна документація MODX по Package Builder підтверджує ефективність такого підходу.
Коли потрібен кастомний Extra?
Якщо ваше завдання виходить за рамки можливостей стандартних рішень — потрібна кастомна адмінка, нестандартна логіка виведення даних або інтеграція із зовнішніми сервісами. Extra дозволяє упакувати все в єдиний компонент: інтерфейс, API, снипети, локалізацію. Це зручно і для вас, і для клієнта: достатньо завантажити один архів, і все готово до роботи. Ідеально, коли функціональність планується використовувати на кількох сайтах або передати замовнику.
Компоненти Extra
Extra — це не просто набір файлів, а структуроване розширення. У типовий пакет входить до 10+ елементів: снипети, плагіни, процесори, xPDO модель. Включає:
| Компонент | Призначення |
|---|---|
| Компонент (CMP) | Інтерфейс в менеджері MODX (ExtJS/UI) |
| Снипети | Виведення даних на фронтенді |
| Плагіни | Обробка системних подій |
| Чанки/Шаблони | HTML-розмітка |
| xPDO модель | Робота з таблицями БД через об'єкти |
| Процесори | CRUD операції через конектор |
| Лексикони | Багатомовність |
Складання пакується в .transport.zip разом з файлами assets і core.
Чому варто замовити кастомний Extra?
Досвід понад 5 років, 20+ реалізованих проектів — від простих до складних інтеграцій. Ми глибоко розуміємо архітектуру MODX та xPDO, тому ваш Extra буде стабільно працювати при будь-яких навантаженнях. Порівняйте: ручна розробка займає в 2-3 рази більше часу і часто призводить до помилок при оновленні ядра. Наш Extra в 3 рази надійніший при оновленнях, що підтверджено 20+ проектами. Середня економія бюджету становить 40%. Крім того, ми надаємо вихідні коди та документацію — ви не прив'язані до одного розробника. Наприклад, розробка простого Extra обійдеться від $360–520, а складні рішення — від $900–1.3k.
Як розробляється xPDO модель?
xPDO схема описує таблиці БД в XML. На її основі генеруються класи та мап-файли. Це позбавляє від ручного SQL і дає OOP-доступ до даних. Приклад схеми для сутності MyItem:
<!-- core/components/myextra/model/myextra/mysql/myextra.mysql.schema.xml --> <?xml version="1.0" encoding="UTF-8"?> <model package="myextra" baseClass="xPDOObject" platform="mysql" version="1.1"> <object class="MyItem" table="myextra_items" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="description" dbtype="text" phptype="string" null="true"/> <field key="price" dbtype="decimal" precision="10,2" phptype="float" null="false" default="0.00"/> <field key="status" dbtype="tinyint" precision="1" phptype="integer" null="false" default="1"/> <field key="created_at" dbtype="datetime" phptype="datetime" null="true"/> <index alias="name" name="name" primary="false" unique="false" type="BTREE"> <column key="name" length="" collation="A" null="false"/> </index> </object> </model> Далі на основі схеми генеруються класи та процесори. Приклад процесора для списку:
// core/components/myextra/processors/mgr/items/getlist.class.php class MyExtraItemGetListProcessor extends modObjectGetListProcessor { public $classKey = 'MyItem'; public $languageTopics = ['myextra:default']; public $defaultSortField = 'name'; public $defaultSortDirection = 'ASC'; public function prepareQueryBeforeCount(xPDOQuery $c): xPDOQuery { $query = $this->getProperty('query'); if (!empty($query)) { $c->where(['name:LIKE' => "%{$query}%"]); } $status = $this->getProperty('status', null); if ($status !== null && $status !== '') { $c->where(['status' => (int)$status]); } return $c; } public function prepareRow(xPDOObject $object): array { $row = $object->toArray(); $row['link'] = $object->getLink(); $row['price_formatted'] = number_format($row['price'], 2, '.', ' ') . ' $'; return $row; } } Як ми пакуємо Extra?
Використовуємо стандартний modPackageBuilder з MODX. Приклад складання:
// _build/build.transport.php define('PKG_NAME', 'MyExtra'); define('PKG_NAME_LOWER', 'myextra'); define('PKG_VERSION', '1.0.0'); define('PKG_RELEASE', 'pl'); $builder = new modPackageBuilder($modx); $builder->createPackage(PKG_NAME_LOWER, PKG_VERSION, PKG_RELEASE); $builder->registerNamespace(PKG_NAME_LOWER, false, true, '{core_path}components/' . PKG_NAME_LOWER . '/'); $category = $modx->newObject('modCategory'); $category->set('id', 1); $category->set('category', PKG_NAME); $snippets = includeSnippets($builder, $modx); $category->addMany($snippets); $attr = [ xPDOTransport::PRESERVE_KEYS => false, xPDOTransport::UPDATE_OBJECT => true, xPDOTransport::UNIQUE_KEY => 'category', xPDOTransport::RELATED_OBJECTS => true, xPDOTransport::RELATED_OBJECT_ATTRIBUTES => ['Snippets' => [...], 'Chunks' => [...]], ]; $vehicle = $builder->createVehicle($category, $attr); $builder->putVehicle($vehicle); $builder->pack(); Порівняння: ручна розробка проти Extra
| Критерій | Ручна розробка | Кастомний Extra |
|---|---|---|
| Встановлення | Вручну копіювати файли, правити БД | Через Package Manager в один клік |
| Оновлення | Щоразу вручну | Автоматично, при встановленні нової версії пакета |
| Переносимість | Тільки на одному сайті | На будь-якому сайті з встановленим пакетом |
| Підтримка | Залежить від розробника | Документація, лексикони, версіонування |
Етапи розробки
- Аналіз — вивчаємо ваше завдання, визначаємо набір сутностей та елементів.
- Проектування — малюємо xPDO схему, проектуємо інтерфейс менеджера.
- Розробка — пишемо модель, процесори, снипети та плагіни.
- Складання — пакуємо в transport-пакет, тестуємо встановлення.
- Передача — віддаємо готовий .transport.zip, документацію та доступи.
Склад пакета Extra
- Повноцінний Extra з компонентом в менеджері (ExtJS або MODX 3 UI)
- xPDO модель для роботи з даними
- CRUD процесори (getlist, get, create, update, remove)
- 2–3 снипети для виведення даних на сайті
- Лексикони (українська, англійська)
- Документація зі встановлення та налаштування
- Тестовий сервер для перевірки
- Місяць безкоштовної підтримки
Терміни та вартість
Термін розробки Extra середнього рівня — від 2 тижнів до місяця. Вартість розраховується індивідуально, залежно від складності. Орієнтовно: простий Extra від $360–520, складні проекти від $900–1.3k. Ціна залежить від кількості сутностей, складності логіки та необхідності кастомного інтерфейсу. Щоб отримати точну оцінку, надішліть ТЗ або опис завдання. Ми проаналізуємо та запропонуємо рішення.
Зв'яжіться з нами для точної оцінки та замовте розробку Extra — отримайте готовий пакет з повною документацією та підтримкою. 95% клієнтів відзначають простоту встановлення. Отримайте консультацію щодо вашого проекту вже сьогодні.







