Разработка кастомного пакета (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 обойдётся от 40 000 ₽, а сложные решения — от 100 000 ₽.
Как разрабатывается 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 от 40 000 ₽, сложные проекты от 100 000 ₽. Цена зависит от количества сущностей, сложности логики и необходимости кастомного интерфейса. Чтобы получить точную оценку, отправьте ТЗ или описание задачи. Мы проанализируем и предложим решение.
Свяжитесь с нами для точной оценки и закажите разработку Extra — получите готовый пакет с полной документацией и поддержкой. 95% клиентов отмечают простоту установки. Получите консультацию по вашему проекту уже сегодня.







