Поддержка
Поля

Конструктор блоков

Поле-конструктор контента из произвольных блоков с собственными полями (Builder)

Builder — поле-конструктор контента: запись складывается из произвольного числа блоков, где каждый блок выбирает свой тип и несёт собственный набор полей. Подходит для страниц, лендингов, статей — там, где структура контента заранее не фиксирована.

Значение хранится в одной колонке в формате JSON (массив блоков), поэтому модель должна кастовать её к массиву/JSON или хранить как text/json.

Объявление

app/Frame/Resources/PageResource.php
use Frame\Laravel\Fields\Builder;

Builder::make('content')
    ->maximum(6) // ограничение на число блоков (необязательно)
    ->blocks([
        'hero' => [
            'label' => 'Hero',
            'fields' => [
                Text::make('heading')->required(),
                Text::make('subheading'),
            ],
        ],
        'paragraph' => [
            'label' => 'Параграф',
            'fields' => [
                Textarea::make('body')->required(),
            ],
        ],
        'quote' => [
            'label' => 'Цитата',
            'fields' => [
                Textarea::make('text')->required(),
                Text::make('author'),
            ],
        ],
    ])

Параметры

blocks
array $blocks → static
Описывает доступные типы блоков. Ключ — машинное имя блока, значение — массив с label (подпись кнопки добавления) и fields (поля блока — обычные поля Frame).
maximum
?int $val = null → static
Ограничивает максимальное число блоков в записи. Без вызова число блоков не ограничено.

Поведение на форме

  • Блоки добавляются кнопками по типам, каждый блок редактируется как мини-форма из своих полей.
  • Порядок блоков меняется перетаскиванием (drag-and-drop).
  • Поля блока проходят валидацию своих правил (required() и т.п.).

Отображение в Infolist

Те же блоки можно отрендерить в режиме «только чтение» на детальной странице — Builder в Infolist показывает сохранённые блоки как панели. Достаточно объявить поле с тем же набором blocks():

Builder::make('content')->blocks(PageResource::contentBlocks())