Dans Laravel Nova (v1.0.3), plusieurs méthodes permettent d’optimiser le contrôle de la visibilité d’un champ de ressource (canSee, showOnDetail, etc.). Je ne trouve aucune méthode permettant de contrôler si un champ est modifiable. Comment puis-je afficher un champ tout en empêchant l'utilisateur de le modifier (le lire en lecture seule)?
Par exemple, j'aimerais afficher le champ "Créé à", mais je ne souhaite pas que l'utilisateur puisse le modifier.
Cette fonctionnalité a été ajoutée à la v1.1.4 (1 er octobre 2018).
Exemple d'utilisation:
Text:: make('SomethingImportant')
->withMeta(['extraAttributes' => [
'readonly' => true
]]),
Puisque App\Laravel\Nova\Fields\Field
est macroable vous pouvez facilement ajouter votre propre méthode pour le rendre en lecture seule, e.x.
dans App\Providers\NovaServiceProvider
, vous pouvez ajouter cette fonction après l'appel parent::boot()
\Laravel\Nova\Fields\Field::macro('readOnly', function(){
$this->withMeta(['extraAttributes' => [
'readonly' => true
]]);
return $this;
});
et alors vous pouvez l'enchaîner comme ça
Text::make("UUID")->readOnly()->help('you can not edit this field');
Vous pouvez également utiliser la fonction canSee
. Dans mon cas, je ne pouvais pas utiliser la solution withMeta
car j'avais besoin que certains de mes utilisateurs (administrateurs) puissent modifier le champ, mais pas d'un utilisateur normal.
Exemple:
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;
}
}),
À partir de 1.0.3 Je ne crois pas qu'il y ait un moyen de faire cela (rien ne peut être vu dans le fichier source).
Cependant, vous pouvez rapidement créer votre propre champ "ReadOnly", car Nova facilite l'ajout de types de champs.
Je serais probablement patient, cependant - la possibilité d'ajouter des attributs aux champs sera probablement une fonctionnalité dans les versions futures.
Quelque chose comme ça serait cool:
Text::make('date_created')
->sortable()
->isReadOnly()
ou
Text::make('date_created')
->sortable()
->attributes(['readonly'])