Поддержка

Концепция

Механизм инъекции компонентов в интерфейс Frame

Слоты — это механизм встраивания произвольных компонентов в фиксированные точки интерфейса 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.