在 Laravel Nova (v1.0.3) 中,有几种方法可以对资源字段的可见性进行细粒度控制(canSee、showOnDetail 等)。我找不到任何控制字段是否可编辑的方法。如何显示字段,但阻止用户编辑它(使其只读)?
例如,我想显示“创建于”字段,但我不希望用户能够更改它。
在 Laravel Nova (v1.0.3) 中,有几种方法可以对资源字段的可见性进行细粒度控制(canSee、showOnDetail 等)。我找不到任何控制字段是否可编辑的方法。如何显示字段,但阻止用户编辑它(使其只读)?
例如,我想显示“创建于”字段,但我不希望用户能够更改它。
此功能是在 v1.1.4(2018 年 10 月 1 日)中添加的。
示例用法:
Text:: make('SomethingImportant')
->withMeta(['extraAttributes' => [
'readonly' => true
]]),
从 Nova 开始>2.0
,您可以使用带有回调的 readonly 方法并检查资源:
Text::make("Read Only on Update")
->readonly(function() {
return $this->resource->id ? true : false;
}),
甚至更好:
Text::make("Read Only on Update")
->readonly(function() {
return $this->resource->exists;
}),
从 v2.0.1 开始,readonly() 是原生的,接受回调、闭包或布尔值,可以简单地调用为:
Text::make('Name')->readonly(true)
这可能是在此版本之前添加的,但更改日志未指定是否是这种情况。
由于App\Laravel\Nova\Fields\Field
是可宏的,您可以轻松添加自己的方法以使其只读,例如
在您可以在调用App\Providers\NovaServiceProvider
后添加此功能parent::boot()
\Laravel\Nova\Fields\Field::macro('readOnly', function(){
$this->withMeta(['extraAttributes' => [
'readonly' => true
]]);
return $this;
});
然后你可以像这样链接它
Text::make("UUID")->readOnly()->help('you can not edit this field');
除了MohKoma 的回答之外,还有一种巧妙的方法可以在编辑字段时将字段设为只读,但在创建时不会:
Text::make('Handle')
->readonly(fn ($request) => $request->isUpdateOrUpdateAttachedRequest()),
这种方法基于Laravel\Nova\Fields\Field@isRequired
,使用相同的验证来获取特定于每个操作的所需规则。
从 1.0.3开始,我不相信有办法做到这一点(在源文件中看不到任何内容)。
但是,您可以快速创建自己的“只读”字段,因为 Nova 可以很容易地添加更多字段类型。
不过,我可能会耐心等待 - 向字段添加属性的能力可能会成为未来版本的一项功能。
像这样的东西会很酷:
Text::make('date_created')
->sortable()
->isReadOnly()
或者
Text::make('date_created')
->sortable()
->attributes(['readonly'])
您也可以使用该canSee
功能。就我而言,我无法使用该withMeta
解决方案,因为我需要我的一些用户(管理员)能够编辑该字段,但不是普通用户。
例子:
Number::make('Max Business Locations')
->canSee(function ($request) {
//checks if the request url ends in 'update-fields', the API
//request used to get fields for the "/edit" page
if ($request->is('*update-fields')) {
return $request->user()->can('edit-subscription');
} else {
return true;
}
}),
2021 年 7 月,对于 Nova 版本3.0
,该readonly
方法可以接受不同类型的参数
默认:
Text::make('Email')->readonly()
直接布尔值:
Text::make('Email')->readonly(true/false)
关闭:
Text::make('Email')->readonly(function ($request) {
return !$request->user()->isNiceDude();
}
在这里阅读更多https://nova.laravel.com/docs/3.0/resources/fields.html#readonly-fields