Filament 3:编辑页基于选择项动态加载Tab表单失效求助
问题解决方案
核心原因
编辑页面初始化时,$get('type_id')返回的是整数类型,但你在match分支里用的是字符串字面量(如'1'),类型不匹配导致始终进入default分支返回空数组,Data TAB因此无法加载表单。另外,默认的live()在页面初始化时不会触发更新,也会影响表单的初始渲染。
修复步骤
1. 统一类型匹配
把match里的字符串值改成整数,和type_id的数据库类型保持一致:
Tab::make('Data TAB') ->schema(fn (Get $get): array => match ($get('type_id')) { default => [], 1 => [ProductDataContactLensForm::make('cldata')->columns(4)], 3 => [ProductDataSunGlassForm::make('sgdata')->columns(4)], 5 => [ProductDataSpectacleFrameForm::make('sfdata')->columns(4)], }),
2. 开启初始化时的live更新
给type_id的live()方法添加onLoad: true参数,确保编辑页面初始化时就触发表单渲染:
Select::make('type_id') ->label(__('Product Type')) ->required() ->searchable() ->options(\App\Models\List\ProductType::orderBy('id', 'asc')->pluck('name', 'id')->toArray()) ->live(onLoad: true), // 新增onLoad参数触发初始更新
3. 验证关联表单的字段绑定
确保ProductDataContactLensForm等表单类中定义的字段,和模型中对应关联数据的字段名完全匹配。比如模型用cldata存储隐形眼镜数据,表单的make('cldata')要正确绑定该属性,才能在编辑时从数据库读取数据并渲染。
完整修改后代码
Tab::make('Default TAB') ->schema([ Select::make('type_id') ->label(__('Product Type')) ->required() ->searchable() ->options(\App\Models\List\ProductType::orderBy('id', 'asc')->pluck('name', 'id')->toArray()) ->live(onLoad: true), ])->columns(4), Tab::make('Data TAB') ->schema(fn (Get $get): array => match ($get('type_id')) { default => [], 1 => [ProductDataContactLensForm::make('cldata')->columns(4)], 3 => [ProductDataSunGlassForm::make('sgdata')->columns(4)], 5 => [ProductDataSpectacleFrameForm::make('sfdata')->columns(4)], }),
内容的提问来源于stack exchange,提问作者Fzol
相关产品推荐
相关产品推荐

