自定义字段
视图字段
除了创建自定义字段,你可以创建 "view" 字段,允许你在不使用额外的 PHP 类的情况下,创建自定义字段。
use Filament\Forms\Components\ViewField;
ViewField::make('rating')
->view('filament.forms.components.range-slider')
这假定你有一个 resources/views/filament/forms/components/range-slider.blade.php 文件。
传入数据到视图字段中
使用 viewData() 你可以传入视图数据的简单数组:
use Filament\Forms\Components\ViewField;
ViewField::make('rating')
->view('filament.forms.components.range-slider')
->viewData([
'min' => 1,
'max' => 5,
])
此外,更复杂的配置请查阅自定义字段类
自定义字段类
你可以创建自定义的字段类和视图,使之可以在整个应用中重用,甚至将其作为插件发布到社区。
如果你只是创建一个使用一次的简单自定义字段,你可以使用视图字段来渲染自定义 Blade 文件。
要创建自定义字段类和视图,请使用如下命令:
php artisan make:form-field RangeSlider
该命令将会创建如下字段类:
use Filament\Forms\Components\Field;
class RangeSlider extends Field
{
protected string $view = 'filament.forms.components.range-slider';
}
同时会新建一个 resources/views/filament/forms/components/range-slider.blade.php 视图文件。
字段工作原理
Livewire 组件是将状态(state)存储在用户浏览器中的 PHP 类。当发起网络请求时,将状态发送给服务器,并填入到 Livewire 组件类的公共属 性中,在那里可以像 PHP 中的任何其他类属性一样访问它。
假设 Livewire 组件中有一个公共属性叫做 $name。你可以以两种方式将该属性绑定到 Livewire 组件的 HTML 输入框字段中:使用 wire:model 属性,或者使用 Alpine.js 的 entangling:
<input wire:model="name" />
<!-- Or -->
<div x-data="{ state: $wire.entangle('name') }">
<input x-model="state" />
</div>
当用户输入到输入框中时,$name 属性会在 Livewire 组件类中更新。用户提交表单后,$name 属性将提交到服务器保存。
这就是字段在 Filament 中的基础工作原理。每个字段都分配到 Livewire 组件类公共属性,该属性是字段状态的存储位置。我们把该字段的名称称为字段的 "state path"。在字段视图中可以使用 $getStatePath() 函数访问字段的 state path:
<input wire:model="{{ $getStatePath() }}" />
<!-- Or -->
<div x-data="{ state: $wire.entangle('{{ $getStatePath() }}') }">
<input x-model="state" />
</div>
如果你的组件严重依赖第三方库,我们建议你使用 Filament 资源系统异步加载 Alpine.js 组件。这保证了 Alpine.js 组件只会在需要时加载,而不是每个页面都加载。要了解如何实现该功能,请查阅资源文档。