Jump to main content Jump to doc navigation

Все приличные дополнения к MODX распространяются транспортными пакетами: это zip-файлы с определённой структурой.

При установке они могут выполнять разные действия: создавать таблицы, менять системные настройки, копировать файлы и т.д.

Писать транспортный пакет с нуля долго, муторно и чревато ошибками. Лучше взять проверенную заготовку modExtra: почти все мои дополнения написаны с её помощью.

Для MODX 2.x берите modx-pro/modExtra, для MODX 3.x: modx-pro/ModExtra3. Структура каталогов та же по смыслу. Скачайте одну заготовку и разберите дерево ниже.

На этой странице также разбор сборщика: как запускается и как настраивается.

Загружаем modExtra

Заготовка на GitHub. Клонируйте её (или скачайте zip), затем скопируйте файлы в проект.

git clone https://github.com/modx-pro/modExtra.git
# или: git clone https://github.com/modx-pro/ModExtra3.git

Вложенный .git можно удалить, если история заготовки не нужна. Остальное скопируйте в путь проекта с прошлого урока. PhpStorm проиндексирует файлы.

Должно получиться так:

test.php можно смело удалить.

Структура компонента

Обычный пакет состоит из 3 каталогов:

  • _build: скрипты сборки компонента в транспортный пакет
  • assets: файлы, которые должны быть доступны снаружи
  • core: файлы внутренней логики компонента
  • README.md: файл с общим описанием компонента, нужен для будущего репозитория на GitHub
  • rename_it.php: новый скрипт переименования заготовки на PHP
  • rename_it.sh: старый скрипт переименования на Perl

Каталог core

Самый важный каталог компонента: здесь вся логика его работы.

Этот каталог нужно копировать на рабочий сайт, поэтому он выглядит так:

- core
-- components
--- component_name
---- everything is necessary here

То есть структура каталогов устроена так, чтобы скопироваться в нужное место /core сайта.

Основные каталоги

  • controllers: файлы подготовки страниц админки. Загружают нужные скрипты и стили.
  • docs: история изменений, инструкция и лицензия. Эти файлы участвуют в описании пакета.
  • elements: устанавливаемые чанки, сниппеты и другие возможные наследники modElement
  • lexicon: словари компонента, обычно только en и ru
  • model: каталог с объектами компонента и моделями таблиц БД, обычно только для MySQL. Здесь же лежит основной рабочий класс компонента.
  • processors: файлы, которые выполняют одну небольшую функцию. Как правило, обрабатывают запросы из админки. Обратите внимание: к файлам в этом каталоге нельзя обратиться снаружи. То есть здесь нельзя хранить скрипты, к которым вы хотите обратиться из браузера.

Это файлы ядра. В MODX каталог core можно вынести за пределы сайта или даже использовать один core для нескольких установок.

Если нужно открыть что-то из браузера, для этого есть assets.

Каталог assets

Каталог, доступный из браузера для запросов. Здесь хранятся файлы *.js, *.css and php-connectors для запросов админки.

По умолчанию коннектор один: именно к нему обращаются страницы админки, чтобы выполнить задачи. Здесь особо рассказывать нечего, всё и так понятно.

Каталог _build

Этот каталог не попадает в transport zip. Его скрипты собирают пакет. В актуальных заготовках (modExtra, ModExtra3):

Путь Назначение
_build/build.php Точка входа (CLI или браузер)
_build/config.inc.php Имя, версия, 'install', 'update', 'static', логирование
_build/elements/ PHP-массивы меню, чанков, сниппетов и т.д.
_build/resolvers/ PHP при установке / обновлении / удалении

В старых текстах курса ещё фигурируют build.transport.php, build.config.php, константы BUILD_* и _build/data/. В указанных заготовках их нет.

Конфигурация

config.inc.php возвращает массив. Полезные ключи:

  • name / name_lower / version / release
  • 'install' => true: собрать и сразу установить
  • 'update': по типам элементов, перезаписывать ли при апгрейде пакета
  • 'static': статичность по умолчанию для plugins, snippets, chunks

В build.php обычно не лезут: правят массивы и запускают скрипт.

Элементы

В _build/elements/ подхватываются PHP-файлы, имя которых не начинается с . или _. Базовое имя (без .php) должно совпадать с методом класса сборки (menus, chunks, snippets, …). Чтобы упаковать чанки, переименуйте _chunks.php в chunks.php (для нового типа добавьте и метод в build.php).

Пример списка чанков:

return [
    'tpl.ModExtra.item' => [
        'file' => 'item', // core/components/<name>/elements/chunks/item.tpl
        'description' => '',
        // 'properties' => [...], // свойства сниппета/чанка по желанию
    ],
];

Остальные типы устроены так же: уникальные ключи в массиве, значения по умолчанию в методе сборки, static/update берутся из config.inc.php.

Свойства сниппета можно задать в массиве элемента ключом properties. Отдельного каталога _build/properties/ в текущих modExtra / ModExtra3 нет.

Ресолверы

PHP в _build/resolvers/. То же правило: имена с . или _ в начале пропускаются. Остальные файлы выполняются при действиях с пакетом.

/** @var xPDOTransport $transport */
/** @var array $options */
/** @var modX $modx */

if ($transport->xpdo) {
    $modx = $transport->xpdo;

    switch ($options[xPDOTransport::PACKAGE_ACTION]) {
        case xPDOTransport::ACTION_INSTALL:
            // первая установка
            break;
        case xPDOTransport::ACTION_UPGRADE:
            // обновление
            break;
        case xPDOTransport::ACTION_UNINSTALL:
            // удаление
            break;
    }
}

return true;

В ModExtra3 типичны tables.php (схема/таблицы) и symlinks.php (ссылки core / assets обратно в Extras/ для разработки).

Заключение

Настройки пакета в _build/config.inc.php и _build/elements/, ресолверы по необходимости. Сборка: _build/build.php.

На следующем занятии загрузим заготовку на сервер, переименуем в Sendex, чуть подправим, соберём и установим.

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • deJaya
  • JT Skaggs
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$204 per month—let's make that $500!

Learn more