提问人:stevan06 提问时间:8/23/2023 最后编辑:stevan06 更新时间:10/17/2023 访问量:937
Filament PHP v3:在禁用的表单字段上,Id 不会写入数据库中
Filament PHP v3: Id does not get written in the database on disabled form-field
问:
我目前正在开发一个 Filament PHP 应用程序,我有一个问题:我想显示注释创建者的用户名(在我的情况下),我想在 Filament 中使该字段不可修改。所以我想到了这一点:
Select::make('user_id')
->options([
User::query()
->select([
DB::raw("name as name"),
'id',
])
->where('id', auth()->id())
->pluck('name', 'id')
->toArray()
])
->default(
auth()->id()
)->label(__('messages.created_by'))
->disabled(),
如果我禁用该字段,则不会将任何内容写入数据库。我基本上得到空。
有没有办法禁用字段并确保将user_id写入数据库?
答:
2赞
AmooAti
8/24/2023
#1
禁用的 HTML 输入将不会提交。
Boolean disabled 属性(如果存在)会使元素不可变、不可聚焦,甚至不能随表单一起提交。
您可以考虑使用 with ,但它在 select 上不可用,这是合理的,因为如果它是 select,它怎么可能是 readOnly 字段?readOnly
default
您可能希望使用具有默认值的文本输入,如下所示:
Forms\Components\TextInput::make('user_id')
->default(
auth()->id()
)
->readOnly()
->label(__('messages.created_by')),
更新:如果要显示用户名,可以使用以下两个输入:
Forms\Components\Hidden::make('user_id')
->default(
auth()->id()
),
Forms\Components\TextInput::make('user_name')
->default(
auth()->user()->name
)
->label(__('messages.created_by'))
->disabled(),
显示用户名旁边的隐藏用户 ID
更新2:
您可以在创建页面中使用,并在创建对象之前自定义表单数据。您将需要上一个解决方案中的该用户名字段,对于用户的 ID,请使用以下解决方案。下面是一个示例:mutateFormDataBeforeCreate
...
use Filament\Facades\Filament;
class CreatePost extends CreateRecord
{
...
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = Filament::auth()->id();;
return $data;
}
}
以这种方式保存敏感数据更安全。
评论
0赞
stevan06
8/24/2023
我使用 select,因为我想显示名称并使用 id 作为写入数据库的值。
1赞
AmooAti
8/24/2023
@stevan06 我已经更新了答案
0赞
stevan06
8/24/2023
谢谢!一个解决方案将起作用。但是,如果您隐藏或禁用 TextInput-> null 就会被写入 te databasel。这很奇怪。
0赞
AmooAti
8/24/2023
@stevan06 也许列 () 可以为 null,因此当它不在请求中时,数据库会将其设置为 NULLuser_id
0赞
stevan06
8/24/2023
是的,当然可以。但是,如果 TextColumn 被禁用或隐藏,则 filaemnt 不会将 TextInput 的值插入到数据库中。不知道为什么
0赞
DariusIII
10/17/2023
#2
与 一起使用,但不能与 一起使用。所以它应该看起来像这样dehydrated()
disabled()
hidden()
->disabled()->dehydrated()
评论