Поля
Конструктор блоков
Поле-конструктор контента из произвольных блоков с собственными полями (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())