Создание модуля v200.4.0
Каркас модуля DevCraft: каталоги, manifest, settings, changelog, страницы, AJAX и install.xml.
Зачем: собрать свой плагин так, чтобы он появился в меню DLE и жил на общем каркасе DevCraft.
Быстрый путь — генератор модулей. Ниже — что именно лежит в файлах и как подключить модуль вручную.
Что нужно заранее
- DLE 20.0, PHP 8.3, DevCraft Admin ≥ 200.4.0
- PSR-4:
DevCraft\Modules\{Name}\→devcraft/src/modules/{Name}/ - После новых классов:
composer dump-autoloadвdevcraft/
Shared DTO (AbstractType, reflection) — devcraftclub/dev-tools. Границы: Shared-пакеты.
Структура каталога
devcraft/src/modules/MyModule/
├── MyModuleIdentity.php # MODULE / CODE
├── manifest.php
├── settings.schema.php # если есть настройки
├── changelog.data.php
├── Pages/
├── Ajax/
├── templates/*.twig
└── Public/ # js/css/иконки по необходимостиmod и code — только через Identity: Module Identity.
Точка входа DLE
Файл engine/inc/{mod}.php:
require_once DLEPlugins::Check(ROOT_DIR . '/devcraft/init.php');
DevCraft\Core\Application::instance()->runAdmin(moduleDir: 'MyModule');{mod} должен совпадать с mod в манифесте.
manifest.php
Можно вернуть fluent-объект или массив — оба варианта ок (Fluent Types):
return ModuleManifestBuilder::create()
->mod('my_module')
->code('my_module')
->name('Мой модуль')
->version('200.1.0')
->menu([
AdminLink::page(__('Главная'), 'dashboard', DashboardPage::class, 'mif-home', 'my_module'),
])
->ajax(
ModuleAjaxConfigBuilder::create('admin')
->method('settings', SettingsHandler::class)
)
->changelog(require DLEPlugins::Check(__DIR__ . '/changelog.data.php'))
->build(__DIR__);| Поле | Зачем |
|---|---|
mod | ?mod= в URL DLE — берите MyModuleIdentity::mod() |
code | JSON настроек devcraft/config/{code}.json — MyModuleIdentity::code() |
meta | имя, версия, иконка, ссылки |
menu | пункты админки; у сателлитов 5-й аргумент AdminLink::page = mod |
ajax | admin methods и опционально public |
changelog | страница «История изменений» |
assets | JS/CSS из Public/ |
Не хардкодьте строки mod/code — см. Module Identity.
Версия 200.x.y: major 200 = DLE 20 (версионирование). Полная схема: Манифест.
AJAX только через devcraft/ajax.php, не engine/ajax/…. DevCraft.Ajax.post() подставляет mod из layout.
settings.schema.php
return FormSchemaBuilder::create(MyModuleIdentity::code())
->layout(FormLayout::TABS)
->section(__('Основные'))
->text('export_path', __('Путь'))
->default('devcraft/backup')
->build();Конфиг пишется в devcraft/config/{code}.json. Рендер — settings_page.twig. Сохранение — SettingsHandler / SettingsFormService. Примеры полей: Form examples.
changelog.data.php
return [
ChangelogBuilder::create('200.1.0')
->date('2026-01-01')
->added([__('Новая возможность')])
->build(),
];Либо legacy-массив с ключами version, date, changes — dual accept тот же.
Фильтры (опционально)
Filter/{name}.filter.schema.php + FilterFormService — образец: логи в модуле Admin.
Страницы и AJAX
- Pages: наследник
AbstractPage,handle()→['view' => '….twig', 'data' => …] - AJAX:
AjaxHandlerInterface, ответJsonResponseилиFileResponse - Файлы:
UploadedFile, multipart на фронте — шаблоны
CRUD-паттерн: CRUD-страница.
install.xml
dleversion20.0,needplugin: DevCraft Admin- в
<notice>напомнить проcomposer dump-autoload
Локали модуля: devcraft/locales/{locale}/{code}.xliff (генерация языков).
Чеклист после создания
composer dump-autoloadвdevcraft/- Открыть
?mod=your_modв админке - Проверить пункт меню и одну AJAX-кнопку
- При отдельном ZIP —
install.xmlи каталогupload/