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







