Схемы¶
Эндпоинты для получения схем, используемых для шаблонов страниц, учётных записей пользователей, групп, плагинов, тем, конфигурации и определений разрешений, а также GET /blueprint-files, который перечисляет файлы для полей выбора папки схемы. Загрузка и удаление файлов для полей схемы с типом file описаны в разделе Медиафайлы: POST /blueprint-upload и DELETE /blueprint-upload.
Список типов страниц¶
GET /blueprints/pages
Выводит шаблоны страниц (схемы), доступные для новых страниц, после применения хуков onAdminPageTypes / onAdminModularPageTypes и настроенных скрытых типов. Требуется api.pages.read.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
modular |
boolean | Нет | Параметр запроса: true (или 1 / yes) выводит модульные шаблоны вместо обычных шаблонов страниц |
Ответ
{"data": [{"type": "default", "label": "Default"}, {"type": "blog", "label": "Blog"}, {"type": "post", "label": "Post"}]}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.read |
Получение схемы страницы¶
GET /blueprints/pages/{template}
Возвращает полностью разрешённую схему для шаблона страницы, включая унаследованные поля и импорты. Требуется api.pages.read. Вызывает onApiBlueprintResolved с context: page, чтобы плагины могли скорректировать сериализованные поля.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
template |
string | Да | Имя шаблона страницы (например, default, blog, post или modular/hero для модульного шаблона) |
Ответ
{"data": {"name": "default", "title": "Default", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "header.title", "type": "text", "label": "Title"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.read |
404 |
Схема шаблона не найдена |
Получение схемы пользователя¶
GET /blueprints/users
Возвращает схему учётной записи пользователя для рендеринга формы редактирования пользователя. Нужно только api.access, так как каждый вошедший пользователь рендерит с её помощью форму своего профиля. Вызывает onApiBlueprintResolved с context: account.
Ответ
{"data": {"name": "account", "title": "Account", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "username", "type": "text", "label": "Username"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
404 |
Схема пользователя не найдена |
Получение разрешений¶
GET /blueprints/users/permissions
Возвращает все зарегистрированные в системе действия разрешений, организованные иерархически с переведёнными метками. Требуется api.users.read. Ключ children появляется только у действий, у которых есть дочерние действия.
Ответ
{"data": [{"name": "admin", "label": "Admin", "children": [{"name": "admin.login", "label": "Login"}]}]}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.users.read |
Получение схемы страницы плагина¶
GET /blueprints/plugins/{plugin}/pages/{pageId}
Возвращает пользовательскую схему страницы для плагина. Требуется api.config.read. Загружает YAML-файл из admin/blueprints/{pageId}.yaml в папке плагина и возвращает его как сериализованную схему с разрешёнными полями. Если этот файл отсутствует, а pageId совпадает со slug плагина, вместо него используется основной blueprints.yaml плагина. Вызывает onApiBlueprintResolved с context: plugin-page.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
plugin |
string | Да | Slug плагина |
pageId |
string | Да | Идентификатор схемы страницы (совпадает с именем файла без расширения) |
Ответ
{"data": {"name": "licenses", "title": "Licenses", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "licenses", "type": "array", "label": "Licenses"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.config.read |
404 |
Плагин или схема страницы не найдены |
Получение схемы плагина¶
GET /blueprints/plugins/{plugin}
Возвращает blueprints.yaml плагина с разрешёнными полями (метки переведены, параметры данных раскрыты). Требуется api.config.read. Вызывает событие onApiBlueprintResolved с context: plugin, чтобы плагины могли изменить сериализованные поля (например, добавить динамические параметры).
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
plugin |
string | Да | Slug плагина. |
Ответ
{"data": {"name": "simplesearch", "title": "SimpleSearch", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "enabled", "type": "toggle", "label": "Plugin status"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Схема возвращена. |
401 |
Не авторизован. |
403 |
Нет разрешения api.config.read. |
404 |
Плагин или его blueprints.yaml не найдены. |
Получение схемы темы¶
GET /blueprints/themes/{theme}
Возвращает blueprints.yaml темы с разрешёнными полями. Требуется api.config.read. Вызывает onApiBlueprintResolved с context: theme.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
theme |
string | Да | Slug темы. |
Ответ
{"data": {"name": "quark", "title": "Quark", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "dropdown.enabled", "type": "toggle", "label": "Dropdown in navbar"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Схема возвращена. |
401 |
Не авторизован. |
403 |
Нет разрешения api.config.read. |
404 |
Тема или её blueprints.yaml не найдены. |
Получение схемы конфигурации¶
GET /blueprints/config/{scope}
Возвращает схему, описывающую область конфигурации system/site. Admin2 использует её вместе с GET /config/{scope} для рендеринга форм конфигурации. Ищет схему через поток blueprints://, чтобы учитывались переопределения плагинов (например, media.yaml плагина admin), а затем откатывается к system://blueprints/config/{scope}.yaml.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
scope |
string | Да | Одна из основных областей system, site, media, security, scheduler, backups или пользовательская область конфигурации верхнего уровня, заданная сайтом (например, user/blueprints/config/<scope>.yaml). Другие системные схемы, такие как streams, отклоняются. |
Ответ
{"data": {"name": "system", "title": "System Configuration", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "cache.enabled", "type": "toggle", "label": "Caching"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Схема возвращена. |
401 |
Не авторизован. |
403 |
Нет разрешения api.config.read. |
404 |
Неизвестная область или файл схемы не найден. |
Разрешение параметров данных¶
GET /data/resolve
Разрешает директивы data-options@: \Some\Class::method, используемые в определениях полей схемы (например, список шаблонов страниц, список тем). Admin2 вызывает его при рендеринге схемы, поле select/checkboxes которой ссылается на вызываемый метод. Принимаются только вызываемые методы Class::method из белого списка утверждённых поставщиков данных (Blueprint::isSafeDynamicCall()) — белый список с точным совпадением предотвращает выполнение произвольного кода. Поставщики ядра утверждены заранее; плагины и темы регистрируют свои через Blueprint::addAllowedDynamicCallable() при запуске. Результаты нормализуются до [{value, label}] для использования с select.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
callable |
string | Да | Полное имя \Class\Name::method для вызова. Должно быть утверждённым поставщиком данных (из белого списка ядра или зарегистрированным через Blueprint::addAllowedDynamicCallable()). |
type |
string | Нет | Дополнительный аргумент, передаваемый, когда callable — это Grav\Common\Page\Pages::pageTypes (standard / modular). По умолчанию standard. |
Ответ
Коды ответов
| Код | Описание |
|---|---|
200 |
Параметры возвращены (пустой массив, если метод не возвращает массив). |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read. |
404 |
Класс или метод не существует. |
422 |
Отсутствует или неверен callable, либо вызываемый метод не является утверждённым поставщиком данных, либо не соответствует формату Class::method. |
Получение схемы группы¶
GET /blueprints/groups
Возвращает схему редактирования группы пользователей (user/group.yaml, разрешается через поток blueprints://, поэтому переопределения сайта применяются). Требуется api.users.read. Вызывает onApiBlueprintResolved с context: group.
Ответ
{"data": {"name": "group", "title": "Group", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "readableName", "type": "text", "label": "Display Name"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.users.read |
404 |
Схема группы не найдена |
Получение схемы новой группы¶
GET /blueprints/groups/new
Возвращает схему создания группы пользователей (user/group_new.yaml, разрешается через поток blueprints://, поэтому переопределения сайта применяются). Требуется api.users.read. Вызывает onApiBlueprintResolved с context: group_new.
Ответ
{"data": {"name": "group_new", "title": "Add Group", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "groupname", "type": "text", "label": "Group Name"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.users.read |
404 |
Схема создания группы не найдена |
Получение схемы конфигурации учётных записей¶
GET /blueprints/config/accounts
Возвращает схему конфигурации учётных записей Flex — форму на вкладке «Конфигурация» страницы «Пользователи». Требуется api.config.read. Строится по той же схеме директории Flex, что использует классическая админка, поэтому включает общую вкладку кэширования наряду с настройками учётных записей пользователей. Используйте её вместе с GET /config/accounts. Вызывает onApiBlueprintResolved с context: config и template: accounts.
Ответ
{"data": {"name": "accounts", "title": "Accounts Configuration", "type": null, "child_type": null, "validation": "loose", "fields": [{"name": "object.cache.index.enabled", "type": "toggle", "label": "Enable Index Caching"}]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.config.read |
404 |
Flex Objects недоступен или директория Flex user-accounts не зарегистрирована |
Список файлов папки схемы¶
GET /blueprint-files
Выводит файлы в папке, на которую указывает поле схемы со своим параметром folder: (filepicker, mediapicker), как taskGetFilesInFolder в классической админке. Требуется api.media.read.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
folder |
string | Да | Параметр запроса: папка для вывода. Поток Grav (user://media, theme://images, account://), токен self@:subpath, разрешаемый относительно scope, или путь относительно user/ |
scope |
string | Нет | Параметр запроса: владелец схемы, используемый для разрешения self@:. Одно из значений: plugins/<slug>, themes/<slug>, pages/<route>, users/<username> |
accept |
string | Нет | Параметр запроса: фильтр расширений через запятую (.pdf, *.jpg) или шаблонов MIME (image/*). * совпадает со всем |
Ответ
{"data": [{"filename": "logo.png", "url": "/user/themes/quark/images/logo.png", "type": "image/png", "size": 18432, "dimensions": {"width": 400, "height": 120}, "thumbnail_url": "/api/v1/thumbnails/3f2a9c1e4b5d6a7f8e9d0c1b2a394857.png", "modified": "2026-09-01T10:15:00+00:00"}], "meta": {"pagination": {"page": 1, "per_page": 1, "total": 1, "total_pages": 1}, "folder": "themes/quark/images", "scope": null, "exists": true}, "links": {"self": "/api/v1/blueprint-files?page=1&per_page=1"}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех. Ещё не существующая папка возвращает пустой список с meta.exists: false |
401 |
Не авторизован |
403 |
Нет разрешения api.media.read или используется область users/<username> другого аккаунта без api.users.write |
422 |
Отсутствует folder, есть обход пути, неразрешимый поток или область, либо папка медиафайлов страницы @self / self@ |
Результат использует обёртку с постраничной разбивкой, но на самом деле никогда не разбивается на страницы: все подходящие файлы приходят на странице 1.
Литералы медиафайлов страницы @self и self@ (без подпути) здесь не обрабатываются, так как у клиента уже есть медиафайлы страницы из GET /pages/{route}/media. Они возвращают стандартную ошибку валидации 422, в записи errors для folder которой стоит сообщение PAGE_MEDIA_ONLY:
{"status": 422, "title": "Unprocessable Entity", "detail": "Use /pages/{route}/media for @self / self@ folders.", "errors": [{"field": "folder", "message": "PAGE_MEDIA_ONLY"}]}