Bonjour,
Dans mon application j'ai une table "types" qui contient plusieurs champs dont un qui s'appelle "subtype". Ce champ va prendre plusieurs valeurs possibles en nombre limité mais je n'ai pas fait une table pour ces valeurs. Ce champ va également être utilisé à plusieurs endroits dans la base.
J'ai fait un trait subtype que j'utilise dans plusieurs modèles et qui contient donc la liste des différents subtypes possibles ainsi qu'une fonction getSubtypeAttribute. Pour plusieurs raisons, je voulais qu'en base soit stocké des valeurs comme 'select', 'boolean' ... mais qu'à l'affichage on ait quelque chose d'autre pour l'utilisateur.
trait Subtype
{
public $subtypes = [
'select' => 'Sélection',
'integer' => 'Entier',
'decimal' => 'Décimal',
'boolean' => 'Oui/Non',
'date' => 'Date',
'string' => 'Texte'
];
public function getSubtypeAttribute($value) {
return $this->$subtypes[$value];
}
}
Quand j'affiche l'attribut, tout se déroule correctement. Le problème est quand je fais mon formulaire en modification.
Je fais donc un champ select comme ci-dessous. Il m'affiche bien les différentes valeurs attendues mais ne se positionne pas sur la valeur par défaut. C'est normal car la valeur par défaut est l'attribut subtype qui est est transformé par la fonction getSubtypeAttribute ! Si je veux que mon select soit sur l'option "Entier", il faudrait que $type->subtype soit égale à integer. Dans le cas présent, ça renvoie "Entier" !
Si je fais un dd($type->subtype) ça affiche "Entier".
{{ Form::model($type, ['class' => "form", 'url' => action("Admin\TypeController@$action", $type), 'method' => ($action == 'store') ? 'Post' : 'Put' ]) }}
<div class="form-group row">
{{ Form::label('subtype', "Type", ['class' => 'col-sm-3 col-form-label']) }}
<div class="col-sm-8">
{{ Form::select('subtype', $type->subtypes, null, ['class' => 'form-control']) }}
</div>
</div>
Ca m'intéresse de garder cette fonction getSubtypeAttribute car elle est utile par ailleurs. Y a t-il un moyen simple de contourner le problème ?
Merci d'avance pour votre réponse.
Bonne journée.
Cordialement.