DevCraft Документации
Руководства

Публичные ресурсы оболочки 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.

Подстановка в БД

При открытии админки (главная и списки стилей, скриптов, заголовков) и при заходе на публичную страницу с тегами:

  1. PublicAssetSeedService — dc_public.js
  2. PublicAssetManifestSyncService — все описания модулей с непустым siteAssets

Таблицы: dc_public_assets, dc_public_headers.

Страницы Admin

Коды проверки сайта у поисковиков (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, выключаются, собранные файлы пересобираются.

Связанные разделы

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