Repeater
概述
Repeater 组件允许你输出重复表单组件的 JSON 数组:
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
Repeater::make('members')
->schema([
TextInput::make('name')->required(),
Select::make('role')
->options([
'member' => 'Member',
'administrator' => 'Administrator',
'owner' => 'Owner',
])
->required(),
])
->columns(2)
建议将 repeater 数据存储在数据库的 JSON
字段中。此外,如果你使用了 Eloquent,请确保该对该字段进行 array
cast。
上例可以明显看出,组件 Schema 在组件的 schema()
方法中定义:
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\TextInput;
Repeater::make('members')
->schema([
TextInput::make('name')->required(),
// ...
])
如果你想要使用可以以任何顺序重复的多个 Schema 块来定义 Repeater,请使用 Builder。
设置空默认项
使用 defaultItems()
方法,Repeater 可以创建特定数量的默认项:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->defaultItems(3)
请注意,默认项只会表单中没有加载已有数据 时创建。在面板资源内,它只会在创建页面生效,因为编辑页面始终回从模型中填充数据。
添加项目
Repeater 下面有一个 Action 按钮,用来添加新项目。
设置添加按钮标签
使用 addActionLabel()
方法,你可以设置添加按钮上显示的标签文本:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->addActionLabel('Add member')
阻止用户添加项目
使用 addable(false)
方法,你可以阻止用户添加项目到 Repeater:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->addable(false)
删除项目
每个项目上都有个 Action 按钮,用以删除项目。
防止用户删除项目
使用 deletable(false)
方法,你可以阻止用户删除 Repeater 中的项目:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->deletable(false)
项目重新排序
每个项目上都有一个按钮,用于允许用户拖拽来对项目进行重新排序。
防止用户重新排序
使用 reorderable(false)
方法,你可以阻止用户在 Repeater 中对项目进行重新排序:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->reorderable(false)
使用按钮重新排列项目
使用 reorderableWithButtons()
方法,你可以启用通过按钮重新排序,将项目上下移动:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->reorderableWithButtons()
阻止使用拖拽进行重新排序
使用 reorderableWithDragAndDrop(false)
方法,可以阻止项目通过拖拽进行排序:
use Filament\Forms\Components\Repeater;
Repeater::make('members')
->schema([
// ...
])
->reorderableWithDragAndDrop(false)
可折叠的项目
使用 collapsible()
方法,可以将 Repeater 设为可折叠的,使其在长表单中隐藏内容:
use Filament\Forms\Components\Repeater;
Repeater::make('qualifications')
->schema([
// ...
])
->collapsible()
你可以将所有项目设置成默认折叠:
use Filament\Forms\Components\Repeater;
Repeater::make('qualifications')
->schema([
// ...
])
->collapsed()
克隆项目
使用 cloneable()
方法,可以将 Repeater 项目设为可复制的。
use Filament\Forms\Components\Repeater;
Repeater::make('qualifications')
->schema([
// ...
])
->cloneable()
集成 Eloquent 关联
如果你在 Livewire 组件内创建表单,请确保设置好表单模型。否则,Filament 不知道应该使用哪个模型去检索关联。
你可以使用 Repeater
上的 relationship()
方法去配置 HasMany
关联。Filament 将从关联中加载项目数据,并在表单提交后将其保存回关联。如果没有将自定义关联名传入到 relationship()
,Filament 将回使用字段名作为关联名:
use Filament\Forms\Components\Repeater;
Repeater::make('qualifications')
->relationship()
->schema([
// ...
])