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







