Filament框架:如何传递编辑状态至页面以生效表单控制?
问题描述
点击表格中的Edit按钮时,表单的hiddenOn()和disabledOn()功能正常生效;但点击View弹窗底部的Edit按钮时,这两个功能失效。相关代码如下:
public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required(), TextInput::make('email')->email()->required()->disabledOn('edit'), TextInput::make('password')->password()->required()->hiddenOn('edit'), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('id'), TextColumn::make('name'), TextColumn::make('email'), ]) ->actions([ Tables\Actions\ViewAction::make() ->extraModalFooterActions([ Tables\Actions\EditAction::make() ]), Tables\Actions\EditAction::make(), ]); } public static function getPages(): array { return [ 'index' => Pages\ListUsers::route('/'), ]; }
解决方案
问题根源是弹窗内的EditAction没有正确传递表单的编辑状态,可通过以下方式修复:
复用现有表单并显式指定编辑模式
直接让弹窗内的EditAction调用已定义的form方法,并强制设置表单模式为edit:Tables\Actions\EditAction::make() ->form(fn (Form $form) => static::form($form)->mode('edit'))手动构建表单并指定状态路径
如果需要自定义表单逻辑,可在EditAction内重新构建表单,同时确保状态路径正确:Tables\Actions\EditAction::make() ->form(function (Form $form) { return $form ->schema([ TextInput::make('name')->required(), TextInput::make('email')->email()->required()->disabledOn('edit'), TextInput::make('password')->password()->required()->hiddenOn('edit'), ]) ->statePath('data'); })
以上两种方式都能让弹窗内的Edit按钮触发的表单正确识别edit状态,使hiddenOn()和disabledOn()功能正常生效。
内容的提问来源于stack exchange,提问作者user1995781
相关产品推荐
相关产品推荐

