Концепция
Слоты — это механизм встраивания произвольных компонентов в фиксированные точки интерфейса Frame. Они позволяют расширять UI без изменения исходного кода.
Два подхода
Фронтенд-слоты (App Slots)
Регистрируются на клиенте через AppSlotRegistry. Компонент передаётся напрямую как Vue-объект. Подходит для модулей и страниц, где вся логика на фронтенде.
import { AppSlotRegistry } from '@frame/core'
import { markRaw } from 'vue'
import MyButton from './MyButton.vue'
AppSlotRegistry.register({
name: 'my-button',
location: 'resource-page-actions',
component: markRaw(MyButton),
})
Серверные слоты
Регистрируются на бэкенде через Frame::registerSlots(). Компонент указывается по строковому имени, а на фронтенде резолвится через SlotComponentRegistry. Подходит для случаев, когда решение о показе принимает сервер.
use Frame\Core\Enums\SlotLocation;
use Frame\Core\Frame;
use Frame\Core\Slot;
Frame::registerSlots([
SlotLocation::LOGIN_BEFORE_FORM->value => Slot::make('Banner', [
'text' => 'Плановые работы с 20:00 до 22:00',
'variant' => 'warning',
]),
]);
Когда что использовать
| Фронтенд (App Slots) | Серверные | |
|---|---|---|
| Регистрация | AppSlotRegistry.register() | Frame::registerSlots() |
| Компонент | Прямая ссылка на Vue-компонент | Строковое имя → SlotComponentRegistry |
| Данные | Фронтенд context (resource, resourceId) | PHP props (любые JSON-значения, включая HTML) |
| Доставка | Мгновенно, без запроса | Через /meta (авторизованные) или /slots (публичные) |
| Use case | Кнопки, инъекции из модулей | Баннеры, уведомления, контент, управляемый сервером |
Оба подхода работают одновременно — AppSlotRenderer мержит результаты из обоих источников.
Где рендерятся слоты
В интерфейсе Frame расставлены компоненты <AppSlotRenderer location="..." />, которые автоматически рендерят все зарегистрированные для данного location компоненты.
Полный список locations — в разделе Locations.