DevCraft Документации

История изменений

Журнал изменений 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.xml Admin (маркеры // DevCraft Admin). Гайд: Условия в шаблонах DLE.
  • Опциональный блок статистики на pages/dashboard.twig: передайте dashboard.stats (список {key,label,value,icon,url}) и опционально stats_title — карточки выводятся сразу под шапкой блока. Пример: Connections DashboardStatsService.
  • 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 из mod URL (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 сохраняет _ и -; Identity MODULE=%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 5 customButtons / 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)

Добавлено

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 в комплекте.

Исправлено

  • Фильтры на странице логов.

Предыдущие версии

MH Admin (Legacy)

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