История изменений
Журнал изменений DevCraft Admin.
200.4.1 — 2026-09-10
Добавлено
- Гайд Отладка: как включить режим отладки и логирование, снять журнал и прислать его разработчику (со снимками экрана настроек и «Вывода логов»).
- Интерактивные конструкторы билдеров в гайдах: форма на странице собирает Fluent-цепочку и копирует PHP. Раздел Конструкторы билдеров. При смене публичного API класса в
classes/Buildersстраницу и схему обновляют в той же работе. - QueryBuilder / DataLoaderService — условия
in,like,find_in_setи группа_or:['op'=>'in'|'like'|'find_in_set', 'value'=>…];find_in_setчерезExpression FIND_IN_SETс параметром в запросе (значение не вклеивается в SQL);_or— список веток через ИЛИ, с остальными условиями снаружи через И. Справочник: QueryBuilder, DataLoaderService. - Публичные теги оболочки
{devcraft}/{devcraft-header}/{devcraft-scripts}: подстановка послеload_template('main.tpl')(патчengine/modules/main.php). Состав — три страницы Admin (стили / скрипты / заголовки) плюс автоматическая подстановкаsiteAssetsиз описания модуля; сжатие — настройка «Публичные ресурсы». Описание модуля:ModuleManifestBuilder::siteAssets()/ModuleSiteAssets. Гайд: Публичные ресурсы оболочки. Справочник: PublicAssetTagService, ModuleSiteAssets и связанные классы Admin. - Публичный шаблонизатор DLE (
dle_template): у[if]— опциональный[else]; новый блок[has value="…" condition="!=" comparison=""]с[else]. Включается только приcompile(..., true). Поставка — патчengine/classes/templates.class.phpвinstall.xmlAdmin (маркеры// DevCraft Admin). Гайд: Условия в шаблонах DLE. - Опциональный блок статистики на
pages/dashboard.twig: передайтеdashboard.stats(список{key,label,value,icon,url}) и опциональноstats_title— карточки выводятся сразу под шапкой блока. Пример: ConnectionsDashboardStatsService. - DLE SDK в ядре Admin —
devcraft/src/sdk/dle/(DcApi,DevCraft\Dle\Schema\*,DevCraft\Dle\Fluent\*,DevCraft\Dle\Xfield\*). Переехал из пакета DLE API: сателлитам больше не нужен установленный HTTP API,DcApiдоступен сразу послеdevcraft/init.php. Выбор слоя — Слои данных. - Мост равенств
TableQuery↔QueryBuilder—TableQuery::toQueryBuilder()/TableQuery::fromQueryBuilder():columns/ равенства /order/limit/offset. LIKE, отрицание,RelationMapиwhereXfield()не переносятся (SdkExceptionс кодомquery_bridge_unsupported). - Экспорт плагина из БД —
PluginPresenter()->withName(...)->export(?$path, bool $archivate = false): install.xml как download в админке DLE; при$archivate— ZIP с XML в корне и файлами изplugins.filelist. Путь по умолчанию: настройка Admin Пути →plugin_exports_path/Paths::pluginExports(). - SDK Schema mail-кампаний —
MailCampaignsSchema/MailCampaignUsersSchemaпо DDL DLE 21 (mail_campaigns,mail_campaign_users);SchemaTableNames,RelationMap,TableRowUnion. - Публичные ресурсы оболочки: зависимости и разделы показа — между записями можно задать зависимости; список разделов, где показывать, и список исключений; отдельные страницы правки; справочник режимов страницы DLE (
$do). Зависимости попадают в оболочку даже если раздел не совпал. При удалении — отвязать ссылки или удалить зависимые ручные записи. При перетаскивании с нарушением порядка — предупреждение и исправленный порядок. ВModuleSiteAssetsBuilder::js()/css()те же поля задаются при регистрации файла (dependsOn,available,notAvailable,active). Гайд: Публичные ресурсы оболочки.
Изменено
- Меню «Страницы DLE»: у листовых пунктов иконка Metro из
modURL (DleMenuBuilder); запасной классmif-link. Вложенные пункты navview показывают иконку при непустомextra. - Публичные ресурсы оболочки: канон для глобальных CSS/JS сателлита — каталог
Public/и блокsiteAssetsв описании модуля → теги{devcraft-header}/{devcraft-scripts}(не{include}CSS в теме, не вшивать вstyles.css). Собранные файлы хранятся отдельно по разделу сайта; в оболочке зависимости идут раньше зависимых. Гайд: Публичные ресурсы оболочки. - Документация skills (
development_help/skills): на страницах полный текст инструкций агента (не только краткое «зачем»), общие фрагменты вcontent/includes/devcraft_admin/skill-*-200.4.1.md. - Namespace SDK —
DleApi\{Schema,Fluent,Xfield,Sdk}→DevCraft\Dle\.... ФасадDcApiи сигнатуры методов не изменились. - Публичный include сателлитов: канон —
devcraft/src/modules/{Name}/Controller/show_*.php(путь от корня сайта). Неengine/modules/devcraft/для новых модулей; вengine/только admin glue и патчи по необходимости. См. PHP DevCraft Standards. - Шлюз БД / схема: логика вынесена в
SchemaSyncService. Debug Admin →SyncTablesпосле наката ожидающих; без debug — файл только при реальном diff и сразу накат. Кэш схемы без лишней пересборки. Гайд: Схема шлюза БД и автор записи. - Автор записи (
creator/lastEditorнаAbstractEntity): только поведения Cycle;beforeSaveбольше не пишет автора. ID из$member_id['user_id']или0. - Публичный AJAX
allow_guest: дляcontroller=publicиpublicMethod(..., true)проверкаuser_hashне требуется (cron URL, гостевые колбэки). Остальные public-методы по-прежнему с хешем и (если не guest) с входом участника.
Устарело
- Имена классов
DleApi\{Schema,Fluent,Xfield,Sdk}\*— работают через автоматические алиасы, будут удалены в следующем мажоре.
Исправлено
- Таблицы
dle_dc_public_headersиdle_devcraft_logs: каждый файл миграции создаёт их вместе с соседней таблицей (стили и данные Composer). Сосед уже был, повторный запуск откатывал весь шаг, а старые правки колонок вставали в очередь раньше. Теперь такой файл не запускают снова; на каждую недостающую таблицу Cycle пишет свой файл и накатывает его раньше этих правок. - Подсказки путей в настройках: «По умолчанию» показывало буквально
{path}. Во время сборки формы параметры в текст не подставлялись. Теперь на месте виден настоящий каталог. - Метка Composer: после установки в корне
devcraftпишется.composer_initializedс датой и временем. Уже существующийcomposer.lockтоже означает, что установка была: метка тогда создаётся один раз, экран инициализации больше не открывается. - Экран инициализации после установки пакетов: админка смотрела на флаг «пакетов нет», который ставила копия
init.phpиз кэша плагина. Файлvendor/autoload.phpуже был, а экран «Инициализация завершена» открывался снова. Теперь вход в админку смотрит на сам файл и подключает настоящийdevcraft/init.php. - Сохранение публичного заголовка: новая запись ещё без ключа, а форма читала
id()— PHP отвечал «Typed property AbstractEntity::$id must not be accessed before initialization». У несохранённой записиid()теперь0. То же для нового стиля или скрипта. - Разделы показа публичных файлов: ключ страницы брался из
$do. На полной новости, в архиве по дате и в каталоге$doпустой, поэтому эти страницы считались главной и запрет показа не действовал. Теперь берётся$dle_module; если главная открыта как статическая страница —$do. Гайд: Публичные ресурсы оболочки. - Публичный скрипт
dc_public.js: строка в «Публичные скрипты» создаётся при входе в админку (главная и списки стилей / скриптов / заголовков), а не только после захода на публичную страницу. Путь:devcraft/src/templates/core/assets/js/dc_public.js. Гайд: Публичные ресурсы оболочки. - Bootstrap без vendor: страница инициализации запрашивает
devcraft/bootstrap.ajax.php(composer.phar и фоновыйcomposer install). Файла не было — Apache отвечал 404 «Ошибка bootstrap». Точка входа проверяет вход в админку и отдаёт JSON изbootstrap-install.php. - Схема БД: повторная сборка при недостающих таблицах шла в тот же реестр Cycle и падала с
Duplicate entity composer_data(страницы вроде «Публичные стили»). Вторая сборка создаёт новый реестр. - Bootstrap после Composer: когда пакеты уже стоят, экран оставался на «[finalize] Инициализация завершена» и ждал ручной переход. Теперь страница сама обновляется и открывает админку.
- Требования PHP: для установки пакетов из админки нужны функции
execиputenv(их нельзя держать вdisable_functions). Иначе bootstrap отвечает ошибкой вместо обрыва «Call to undefined function exec()». Требования: Установка. - Кэш без
dev-tools: еслиDevcraft\Cache\FileCachePoolещё нет (пакет не установлен),CacheControlпереключается на пустой запасной пул — админка и переводы не падают на экране ошибки. Послеcomposer installснова файловый кэш. Справочник: CacheControl. - Схема БД / отсутствующие таблицы: пропуск create смотрел только первую таблицу в имени; кэш мог отдаваться без таблиц; добор шёл через SyncTables. Теперь: skip только если все create-таблицы есть; кэш без таблиц сбрасывается; при дыре — снятие ложного «выполнена» (если нет ни одной таблицы миграции) +
GenerateMigrationsи накат файлов, без ручного CREATE и без SyncTables вне debug. Гайд: Схема шлюза БД. - Composer: заглушка «Установить все»: на свежей установке неустановленный пакет из
composer.json(напримерdevcraftclub/dev-tools) больше не нужно ставить по одному. Кнопка / виртуальная строкаdevcraft/composer-install-allзапускаетcomposer installдля всегоrequire. Справочник: Composer-пакеты модулей. - Composer в админке (
action=composer): на хостингах сputenvвdisable_functionsвызов без\искалDevCraft\Core\Composer\putenv()и падал сinternal_error. Теперь\putenvтолько приfunction_exists, плюс$_ENV/$_SERVERи префиксenv HOME=… COMPOSER_HOME=…уexec. То же для bootstrap-install. Справочник: ComposerRuntimeAdapter. - Публичные списки (фильтр и перетаскивание): Metro
data-role="table"пересобиралаtbodyбезdata-id— ручка порядка не работала; поиск смотрел колонкиlabel/path, а Metro брала русские заголовки. Списки — обычная таблица + штатныйfilter_bar. При активном фильтре порядок не меняется. - Публичные стили/скрипты/заголовки — переключатель «Активен»: Metro Switch переносит CSS-класс на
label,data-idостаётся на checkbox. Обработчик брал id с обёртки → «Запись не найдена», плюс дваchange/уведомления. Id берётся изtr[data-id]; повторныйchangeв том же тике отбрасывается. Гайд: Публичные ресурсы оболочки. - Публичный собранный CSS/JS (
403):devcraft/.htaccessзакрывает весь каталог; при сборке PublicAssetBundleCacheService пишет вcache/public_assets/.htaccessдоступ (Require all granted). Иначеbundle.css/bundle.jsотдаются с кодом 403. Гайд: Публичные ресурсы оболочки. - Подстановка из
siteAssets: если модуль убрал файлы из публичной оболочки (или опустошилsiteAssets), старые автозаписи вdc_public_assetsвыключаются и запас копии сбрасывается — иначе на сайте остаётся админский JS (напримерconnections.jsбезwindow.DevCraft). Подстановка больше не включает снова записи, которые выключили вручную. DevCraft.copyText: копирование в буфер из ядраdevcraft.jsна всех страницах админки; на HTTP — запаснойdocument.execCommand('copy')(Clipboard API только в защищённом контексте).- Cycle ORM /
DatabaseGateway: синхронизация схемы —SchemaSyncService, без безусловного GenerateMigrations на каждый промах кэша. Recovery: удалитьdevcraft/cache/cycle_orm_schema.serи снова открыть админку / модуль. - SDK
create()— INSERT шёл через builder Cycle, у которого префикс уже настроен, из-за чего таблица искалась какPREFIX_PREFIX_post. Префикс больше не удваивается. - SDK и USERPREFIX —
admin_logs,banned,twofactor,conversations*,social_login,ignore_list,downloads_log,lostdb,mail_logиспользовалиPREFIX. На установках с разнымиPREFIX/USERPREFIXзапросы шли не в ту таблицу. - SDK Schema типы (install + dump DLE 21):
category.schema_org,storage.name,vote.date—string;rss.category—int. - Канон сателлитов: публичный слой
Controller/; патчи DLE — маркеры// DevCraft {Name}: start/end. - Генератор модулей: latin/
toTranslitсохраняет_и-; IdentityMODULE=%dir%,CODE=%latin%; каталог — PascalCase от имени;engine/incбез префиксаdle_. - Стили и скрипты модуля:
layout.twigподключает не толькоassets.js, но иassets.cssиз описания модуля (module_css_urls/ PluginContext::cssAssetFiles). Без этого CSS изPublic/сателлита не загружался. - Окна Metro (
DevCraft.Metro.dialogCreate): кнопки изactions/caption(старый вызов) приводятся к Metro 5customButtons/text. Иначе окно открывалось без кнопок (только крестик).
200.4.0 (документация и API типов)
Добавлено
- Fluent Types —
ModuleManifestBuilder,ChangelogBuilder,ModuleAjaxConfigBuilder(в т. г.publicMethodдля публичного AJAX). Dual accept:manifest.php/settings.schema.php/ changelog принимают массив или готовый DTO. Гайд: Fluent Types. - Документация версионирования плагинов (major = DLE без точки).
- QueryBuilder + DataLoader; enum SortDirection.
QueryBuilder/DataLoaderService: insert / update / delete через Cycle;values+Fragmentдля инкрементов; reload после записи; DELETE только сconditions.
Breaking
DataLoaderServiceиDleDataService— только static API (::loadData,::users, …). УдаленыApplication::dataLoader()/dleData().- QueryBuilder:
selects/where→columns/conditions; write-payload — отдельноvalues.
Upload API (после 200.4.0)
Добавлено
DevCraft.Ajax.postMultipart— multipart с прогрессом.- Twig
core/includes/upload/drop_form.twig. UploadedFile,FileResponse.FormFieldBuilder::editor(),FormFieldBuilder::codeViewer().
200.4.0
Добавлено
- DevCraft Admin — преемник MHAdmin (
?mod=devcraft), DLE 20.0. - Metro UI вместо Semantic / Fomantic.
- Логи с AJAX-таблицей и фильтрами.
- Обновление assets с assets.devcraft.club.
- Генератор модулей.
- Локали: ru, en, de, uk.
Изменено
- Каталог плагина:
devcraft/вместоengine/inc/maharder/. - Меню «Страницы DLE», changelog с группами added/changed/fixed.
Удалено
- MHAdmin /
?mod=maharder, Fomantic, Font Awesome Pro в комплекте.
Исправлено
- Фильтры на странице логов.