DevCraft Документации
Гайды

Создание модуля 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()
codeJSON настроек devcraft/config/{code}.jsonMyModuleIdentity::code()
metaимя, версия, иконка, ссылки
menuпункты админки; у сателлитов 5-й аргумент AdminLink::page = mod
ajaxadmin methods и опционально public
changelogстраница «История изменений»
assetsJS/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

  • dleversion 20.0, needplugin: DevCraft Admin
  • в <notice> напомнить про composer dump-autoload

Локали модуля: devcraft/locales/{locale}/{code}.xliff (генерация языков).

Чеклист после создания

  1. composer dump-autoload в devcraft/
  2. Открыть ?mod=your_mod в админке
  3. Проверить пункт меню и одну AJAX-кнопку
  4. При отдельном ZIP — install.xml и каталог upload/

См. также

На этой странице