PageCharm

Разработчикам

Медиа и файлы

Руководство разработчика PageCharm

Как хранить изображения, файлы и бэкапы через storage-провайдеры.

Storage

Sample использует локальное хранилище: медиа попадают в wwwroot/uploads, а бэкапы — в storage/backups. В пакетной архитектуре можно заменить storage-провайдер без переписывания UI.

Поля Image/File/Video

Медиа можно прикреплять к контенту или конкретному полю. В форме контента загрузка в поле работает до первого сохранения страницы: файл временно загружается в storage, а после сохранения CMS привязывает его к созданному атрибуту. При удалении контента CMS удаляет связанные медиа-активы и файлы из настроенного хранилища.

Для видео файл не загружается: в поле Video/Videos вставляется ссылка на youtube.com, vk.com, vkvideo.ru или rutube.ru. CMS сохраняет ссылку, провайдера, id ролика, preview и embed URL, если их удалось определить. Если preview не пришел автоматически, в поле можно указать URL картинки вручную. Максимальное количество роликов задается в настройках поля так же, как у картинок и файлов.

Пресеты изображений

Размеры картинок задаются в админке в разделе «Медиа» через кнопку настроек. Пресет описывает ширину, высоту, режим обработки (по ширине, fit, crop, pad), формат, качество и набор ширин для srcset. На уровне поля шаблона или настройки типа Image/Images выбираются только те пресеты, которые реально нужны этому месту сайта. Если пресетов нет или в поле они не выбраны, картинка отдается в оригинальном размере.

В Razor оригинал берется из media.Url, а resized-вариант — через media.GetPresetUrl("alias"). Первый запрос лениво создаст файл и положит его в storage-кэш; следующие запросы отдадут уже готовый вариант.

@{
    var cover = Model.Content.GetFirstMedia("foto");
    var gallery = Model.Content.GetImages("gallery");
    var documents = Model.Content.GetFiles("documents");
    var trailer = Model.Content.GetVideo("trailer");
}

@if (cover is not null)
{
    <img src="@cover.GetPresetUrl("kartochka-tovara")" alt="@cover.Alt">
}

@foreach (var image in gallery)
{
    <img src="@image.GetPresetUrl("kartochka-tovara")" alt="@image.Alt">
}

@foreach (var file in documents)
{
    <a href="@file.Url">@file.FileName</a>
}

@if (trailer is not null)
{
    <a href="@trailer.Url">
        @if (trailer.GetPreviewUrl() is { } previewUrl)
        {
            <img src="@previewUrl" alt="@trailer.Title">
        }
        Смотреть видео
    </a>
}

Точка фокуса

У изображения в медиатеке можно указать точку фокуса. Она хранится как относительные координаты FocalX/FocalY от 0 до 1 и используется при генерации crop-вариантов, чтобы автоматическое кадрирование не теряло важную часть изображения.

Копирование контента

При копировании контента копируются его дочерние элементы и медиа. Новые записи получают собственные storage keys.

Пример

options.UseLocalStorage(
    rootPath: "wwwroot/uploads",
    publicBasePath: "/uploads",
    backupRootPath: "storage/backups");

Бэкапы

Админка умеет создавать логические JSON-бэкапы и полные ZIP-бэкапы с медиа.