表单构造器
表单字段控件
开始
字段类(Field)位于 Filament\Form\Components
命名空间中。
字段组件和布局组件一起,在表单 schema 中。
如果你想在 Livewire 组件中使用这些字段,可以将它们放到 getFormSchema()
方法中:
protected function getFormSchema(): array{ return [ // ... ];}
如果你在后台面板的资源或者关联管理器中使用,必须将它们放在 $form->schema()
方法中:
public static function form(Form $form): Form{ return $form ->schema([ // ... ]);}
字段可以用静态方法 make()
传入字段名为参数创建。字段名应该对应 Livewire 组件的属性名。你可以使用 Livewire "点语法"将字段绑定到像数组或者 Eloquent 模型这样的嵌套属性中。
use Filament\Forms\Components\TextInput; TextInput::make('name')
设置标签
默认情况下,字段标签会按照字段名自动生成。你可以使用 label()
方法重写字段标签。如果你想使用语言本地化,可以使用这种方法自定义标签:
use Filament\Forms\Components\TextInput; TextInput::make('name')->label(__('fields.name'))
此外,你也可以使用 translateLabel()
方法自动翻译标签:
use Filament\Forms\Components\TextInput; TextInput::make('name')->translateLabel() // 相当于 label(__('Name'))
设置 ID
像设置标签一样,字段ID会根据他们的字段名自动生成。可以使用 id()
重写:
use Filament\Forms\Components\TextInput; TextInput::make('name')->id('name-field')
设置默认值
字段可以有默认值。如果表单 fill()
方法调用时没有传参,就会填充这个默认值。使用 default()
方法,可以定义默认值:
use Filament\Forms\Components\TextInput; TextInput::make('name')->default('John')
帮助消息及提示
有时,你需要为表单用户提供额外消息。这种情况下,你可以使用帮助消息或者提示。
帮助消息显示在字段下面。helperText()
方法支持 Mardown 格式:
use Filament\Forms\Components\TextInput; TextInput::make('name')->helperText('Your full name here, including any middle names.')
提示可以显示在标签旁边:
use Filament\Forms\Components\TextInput; TextInput::make('password')->hint('[Forgotten your password?](forgotten-password)')
提示也可以添加图标,将其渲染在旁边:
use Filament\Forms\Components\RichEditor; RichEditor::make('content') ->hint('Translatable') ->hintIcon('heroicon-s-translate')
提示也可以添加颜色 color()
。默认是灰色,不过你也可以设为 primary
、success
、warning
或 danger
:
use Filament\Forms\Components\RichEditor; RichEditor::make('content') ->hint('Translatable') ->hintColor('primary')
自定义属性
可以在 extraAttributes()
中传入一个数组,自定义字段所在代码块的 HTML 属性:
use Filament\Forms\Components\TextInput; TextInput::make('name')->extraAttributes(['title' => 'Text input'])
如果要将额外的 HTML 属性添加到输入框本身,则使用 extraInputAttributes()
:
use Filament\Forms\Components\TextInput; TextInput::make('categories') ->extraInputAttributes(['multiple' => true])
禁用
你可以禁用字段,使之不能编辑:
use Filament\Forms\Components\TextInput; TextInput::make('name')->disabled()
另外,也可以传一个布尔值控制字段是否禁用:
use Filament\Forms\Components\Toggle; Toggle::make('is_admin')->disabled(! auth()->user()->isAdmin())
请注意,禁用字段并不会影响保存,懂技术的用户仍然可以操作页面 HTML 改变他的值。
要阻止字段值被保存,请使用 dehydrated(false)
方法:
Toggle::make('is_admin')->dehydrated(false)
此外,你也可以根据情况决定是否保存一个字段,比如当用户是管理员时:
Toggle::make('is_admin') ->disabled(! auth()->user()->isAdmin()) ->dehydrated(auth()->user()->isAdmin())
use Filament\Resources\Pages\CreateRecord;use Filament\Resources\Pages\Page; TextInput::make('slug') ->disabled() ->dehydrated(fn (Page $livewire) => $livewire instanceof CreateRecord)
隐藏字段
你可以隐藏一个字段:
use Filament\Forms\Components\TextInput; TextInput::make('name')->hidden()
另外,你也可以传入一个布尔值来控制字段是否隐藏:
use Filament\Forms\Components\TextInput; TextInput::make('name')->hidden(! auth()->user()->isAdmin())
自动聚焦
大部分字段时可自动聚焦的。一般来说,让你表单中第一个重要的字段获得自动聚焦,会带来最好的用户体验。
use Filament\Forms\Components\TextInput; TextInput::make('name')->autofocus()
设置占位符
很多字段当值为空时,通常会有一个占位符。你可以使用 placeholder()
方法自定义:
use Filament\Forms\Components\TextInput; TextInput::make('name')->placeholder('John Doe')
全局设置
如果你想要全局修改字段的默认行为,你可以在服务提供者的 boot()
方法中调用静态方法 configrueUsing()
,传入闭包修改其使用的组件。比如,你想让所有的复选框 inline(false)
,你可以这样做:
use Filament\Forms\Components\Checkbox; Checkbox::configureUsing(function (Checkbox $checkbox): void { $checkbox->inline(false);});
当然,你仍然可以对每个字段单独重写这一样式:
use Filament\Forms\Components\Checkbox; Checkbox::make('is_admin')->inline()
文本框
文本框(Text Input)用于与字符串交互:
use Filament\Forms\Components\TextInput; TextInput::make('name')
你可以用一系列方法设置文本框类型。其中有些,比如像 email()
,同时也提供验证:
use Filament\Forms\Components\TextInput; TextInput::make('text') ->email() ->numeric() ->password() ->tel() ->url()
同样的,你也可以使用 type()
传入一个 HTML 文本框类型参数:
use Filament\Forms\Components\TextInput; TextInput::make('backgroundColor')->type('color')
你可以设置 minLength()
和 maxLength()
限制输入文本长度。此方法会同时添加前端和后端验证:
use Filament\Forms\Components\TextInput; TextInput::make('name') ->minLength(2) ->maxLength(255)
你也可以通过设置 length()
指定输入框的精确长度。此方法同样在前后端都添加了验证:
use Filament\Forms\Components\TextInput; TextInput::make('code')->length(8)
另外,你也可以设置 minValue()
和 maxValue()
验证输入的最小和最大值:
use Filament\Forms\Components\TextInput; TextInput::make('number') ->numeric() ->minValue(1) ->maxValue(100)
你可以使用 autocomplete()
方法,为文本输入框设置自动补全配置:
use Filament\Forms\Components\TextInput; TextInput::make('password') ->password() ->autocomplete('new-password')
你也可以用 disableAutocomplete()
,它是关闭自动补全的快捷方法:
use Filament\Forms\Components\TextInput; TextInput::make('password') ->password() ->disableAutocomplete()
更多自动补全选项,文本框也支持 datalists。
电话号码验证
使用 tel()
字段时,字段值将会使用如下规则进行验证:/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\.\/0-9]*$/
。
如果你需要修改验证规则,可以使用 telRegex()
方法:
use Filament\Forms\Components\TextInput; TextInput::make('phone') ->tel() ->telRegex('/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\.\/0-9]*$/')
另外,要在全局中自定义 telRegex()
,请使用服务提供者:
use Filament\Forms\Components\TextInput; TextInput::configureUsing(function (TextInput $component): void { $component->telRegex('/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\.\/0-9]*$/');});
前后缀
你也可以使用 prefix()
和 suffix()
方法,在文本框前后添加文本内容:
use Filament\Forms\Components\TextInput; TextInput::make('domain') ->url() ->prefix('https://') ->suffix('.com')
你可以使用 prefixIcon()
和 suffixIcon()
方法在输入框前后放入图标:
use Filament\Forms\Components\TextInput; TextInput::make('domain') ->url() ->prefixIcon('heroicon-o-external-link') ->suffixIcon('heroicon-o-external-link')
你也可以使用 prefixAction()
和 suffixAction()
方法,在输入框前后渲染 Action 按钮:
use Filament\Forms\Components\Actions\Action;use Filament\Forms\Components\TextInput; TextInput::make('domain') ->suffixAction(fn (?string $state): Action => Action::make('visit') ->icon('heroicon-s-external-link') ->url( filled($state) ? "https://{$state}" : null, shouldOpenInNewTab: true, ), )
输入遮罩
输入遮罩(Input mask)定义了输入必须遵循的格式。
Filament 中,你可以在 mask()
方法中与 Mask
对象进行交互,配置你的 mask:
use Filament\Forms\Components\TextInput; TextInput::make('name') ->mask(fn (TextInput\Mask $mask) => $mask->pattern('+{7}(000)000-00-00'))
在底层,masking 使用 imaskjs
驱动。它主要的特性在 Filament 中同样可用。先阅读指南,再使用 Filament 实现,或许是最便利的方法。
你可以定义和配置一个 numeric mask,用来处理数字:
use Filament\Forms\Components\TextInput; TextInput::make('number') ->numeric() ->mask(fn (TextInput\Mask $mask) => $mask ->numeric() ->decimalPlaces(2) // Set the number of digits after the decimal point. ->decimalSeparator(',') // Add a separator for decimal numbers. ->integer() // Disallow decimal numbers. ->mapToDecimalSeparator([',']) // Map additional characters to the decimal separator. ->minValue(1) // Set the minimum value that the number can be. ->maxValue(100) // Set the maximum value that the number can be. ->normalizeZeros() // Append or remove zeros at the end of the number. ->padFractionalZeros() // Pad zeros at the end of the number to always maintain the maximum number of decimal places. ->thousandsSeparator(','), // Add a separator for thousands. )
Enum masks 可以限制用户的输入选项:
use Filament\Forms\Components\TextInput; TextInput::make('code')->mask(fn (TextInput\Mask $mask) => $mask->enum(['F1', 'G2', 'H3']))
Range masks 可被用作限制数字输入范围:
use Filament\Forms\Components\TextInput; TextInput::make('code')->mask(fn (TextInput\Mask $mask) => $mask ->range() ->from(1) // Set the lower limit. ->to(100) // Set the upper limit. ->maxValue(100), // Pad zeros at the start of smaller numbers.)
除了简单样式,你也可以定义多重模式块 pattern blocks:
use Filament\Forms\Components\TextInput; TextInput::make('cost')->mask(fn (TextInput\Mask $mask) => $mask ->patternBlocks([ 'money' => fn (Mask $mask) => $mask ->numeric() ->thousandsSeparator(',') ->decimalSeparator('.'), ]) ->pattern('$money'),)
里面也包含了一个 money()
方法,可以更容易格式化货币输入。本例,前缀符号是 $
、千位分隔符 ,
及两位小数:
use Filament\Forms\Components\TextInput; TextInput::make('cost')->mask(fn (TextInput\Mask $mask) => $mask->money(prefix: '$', thousandsSeparator: ',', decimalPlaces: 2))