Публичные ресурсы оболочки v200.4.1
Теги {devcraft*}, siteAssets, зависимости, разделы показа и сжатие.
Введение
Оболочка публичного сайта получает CSS/JS/meta через теги в main.tpl. Состав хранится в таблицах Admin и собирается из siteAssets описания модуля плюс ручных записей.
Единственный канал для глобальных стилей и скриптов сателлита: Public/ + siteAssets → теги ниже. Не подключать модульный CSS/JS через {include} в теме, не вшивать в styles.css, не патчить main.tpl под отдельный файл модуля.
Теги в теме
| Тег | Куда | Содержимое |
|---|---|---|
{devcraft-header} | <head> | CSS + meta |
{devcraft-scripts} | перед </body> | только JS |
{devcraft} | одно место | CSS + meta + JS |
Для новых тем лучше раздельно: {devcraft-header} в шапке + {devcraft-scripts} внизу. Если одновременно стоят {devcraft} и раздельные теги — побеждает {devcraft}, раздельные остаются пустыми.
Патч: engine/modules/main.php после $tpl->load_template('main.tpl') → PublicAssetTagService.
{* в <head> *}
{devcraft-header}
{* … *}
{* перед </body> *}
{devcraft-scripts}siteAssets в описании модуля
В siteAssets кладите только глобальные файлы оболочки. Файлы одной страницы (админский UI, виджет) — в assets() или подстановку контроллера.
use DevCraft\Builders\ModuleSiteAssetsBuilder;
->siteAssets(
ModuleSiteAssetsBuilder::create()
->css('user_lists.css')
->js(
'user_lists_public.js',
dependsOn: ['devcraft/src/templates/core/assets/js/dc_public.js'],
available: ['main', 'showfull', 'lastnews', 'tags', 'allnews'],
)
)У js() / css() можно сразу задать то, что в таблице записи хранится в depends_on, available, not_available и active:
| Аргумент | Смысл |
|---|---|
$dependsOn | Пути файлов той же категории, от которых зависит этот (имя в Public/ или путь от корня сайта). При подстановке превращаются в id записей. |
$available | Ключи разделов ($do), где файл показывают; пусто — везде, кроме исключений |
$notAvailable | Ключи разделов, где файл не показывают |
$active | Включена ли запись при первом появлении. Уже существующую автозапись подстановка снова не включает. |
Поля из описания пишутся только при создании строки в БД. Если запись уже есть, подстановка её не меняет (ни зависимости, ни разделы, ни «включён»).
Контракт: ModuleSiteAssets, строитель: ModuleSiteAssetsBuilder.
Подстановка в БД
При открытии админки (главная и списки стилей, скриптов, заголовков) и при заходе на публичную страницу с тегами:
- PublicAssetSeedService —
dc_public.js - PublicAssetManifestSyncService — все описания модулей с непустым
siteAssets
Таблицы: dc_public_assets, dc_public_headers.
Страницы Admin
- Публичные стили — PublicStylesPage
- Публичные скрипты — PublicScriptsPage
- Публичные заголовки — PublicHeadersPage
Коды проверки сайта у поисковиков (google-site-verification, Яндекс и т.п.) добавляйте здесь, а не отдельным плагином. Старый Webmaster Verification не поддерживается.
UI: обычная таблица (не Metro data-role="table"), сверху штатная полоса фильтра (filter_bar), колонка с ручкой порядка (mif-move), переключатель «Активен». Добавление — окно (Добавить → форма → сохранить → строка в таблице). Логика — admin.js (DevCraftAdmin.PublicAssets). Id для включения/выключения — из tr[data-id]. Пока висит правило фильтра, порядок не пишется (иначе сбилась бы вся очередь).
Формы добавления — PublicAssetAdminFormService (FormSchema + Metro field_row).
Автозаписи (origin=auto) нельзя удалить — только выключить. Перетаскивание задаёт порядок и флаг public_assets_list_manually_ordered_{css|js|meta}.
Правка записи (зависимости и разделы)
Списки ведут на отдельные страницы public_asset_edit / public_header_edit (в меню боковой панели их нет — только ссылка «Изменить»).
На странице правки:
| Поле | Смысл |
|---|---|
depends_on | Другие записи той же категории (css / js / meta), от которых зависит эта |
available | Ключи разделов сайта, где запись показывается; пустой список = везде (кроме исключений) |
not_available | Ключи разделов, где запись не показывается (имеет приоритет над available) |
active | Включена ли запись |
Для автозаписей путь и источник только для чтения; зависимости и разделы править можно.
Цикл в зависимостях при сохранении отклоняется с понятной ошибкой. После успешного сохранения порядок категории пересчитывается так, чтобы зависимости шли раньше зависимых.
Удаление ручной записи, на которую ссылаются другие: сначала окно с выбором — отвязать ссылки или удалить вместе зависимые ручные записи. Автозаписи при «удалить вместе» не удаляются — только отвязываются.
Если перетащить строки так, что зависимость окажется ниже зависимой, сервер сохранит исправленный порядок и покажет предупреждение; таблица подстроится под ответ сервера.
Разделы сайта (available)
Ключи разделов — это режим страницы DLE. Берётся $dle_module (на полной новости, в архиве по дате и в каталоге $do пустой). Если главная сайта открывается как статическая страница, берётся $do = static. Пустое значение — main. Встроенный набор совпадает со стандартными режимами ядра:
main, date, cat, showfull, search, xfsearch, userinfo, register, stats, pm, feedback, favorites, newposts, addnews, lastnews, lastcomments, lostpassword, static, catalog, alltags, tags, allnews.
Сателлит со своим $do должен добавить ключ в справочник — иначе пункта не будет в форме правки публичных файлов. Вызов — при каждой загрузке модуля после запуска DevCraft, и на сайте, и в админке (глобальный include плагина, как у Уведомлений Site/include.php). Ключ = значение $do.
use DevCraft\Modules\Admin\Services\DleSiteSectionRegistry;
if(defined('DEVCRAFT_BOOTSTRAPPED') && class_exists(DleSiteSectionRegistry::class)) {
DleSiteSectionRegistry::instance()->register('notifications', __('Уведомления'));
}Эталон: DLE Уведомления — куда вставить.
На публичной странице оболочка берёт текущий ключ через DleSiteSectionRegistry::currentKey() ($dle_module, см. выше) и оставляет записи, у которых раздел не в not_available, а список available пуст или содержит этот ключ.
Если активная подходящая запись A зависит от B, а B не подходит по разделам или выключена — B всё равно попадает в оболочку раньше A (и дальше по цепочке). Так же собирается общий файл при включённом сжатии.
Сервис зависимостей: PublicAssetDependencyService. Фильтр списков в админке строится через FilterSchemaBuilder (в т.ч. по разделам показа).
Сжатие
Настройка Admin «Публичные ресурсы» → public_assets_compress. Сборка: PublicAssetBundleCacheService + PublicAssetMinify.
Собранные файлы лежат в devcraft/cache/public_assets/ отдельно по разделу сайта (ключ $do), чтобы главная и полная новость не делили один и тот же набор. Корень devcraft/.htaccess закрывает HTTP-доступ ко всему каталогу DevCraft, поэтому при сборке в public_assets/ автоматически пишется .htaccess с Require all granted (иначе браузер получит 403). Без AllowOverride для этого каталога на сервере файл не поможет — проверьте настройки Apache.
Что не класть в siteAssets
- JS админ-панели (
admin.js,dleapi.js,db_manager.js, …) - Разметка одной страницы темы (
templates/{skin}/devcraft/...— да; как канал CSS/JS оболочки — нет) connections_admin.js/ виджеты одной страницы админки
Админский UI модуля — только assets() описания модуля (ждёт window.DevCraft). На сайте оболочка даёт DevCraftPublic (dc_public.js); админский скрипт в siteAssets не класть.
Что не делать в теме
{include file="{THEME}/css/модуль.css"}рядом соstyles.css- Патч
install.xml→main.tpl, который вставляет<link>/{include}модульного CSS - Копировать стили сателлита в
templates/{skin}/css/styles.css
Глобальные стили модуля (шапка, колокольчик и т.п.) — файл в modules/{Name}/Public/ + siteAssets → {devcraft-header}.
При подстановке из описания модуля устаревшие автозаписи, которых больше нет в siteAssets, выключаются, собранные файлы пересобираются.