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.

3 réponses


Bonjour,

ton implémentation est naïve. Tu utilises le getAttribute pour traduire le type. Le système des langues est déjà là pour ça.
Si tu ne veux rien changer à ton code enlève le getSubtypeAttribute de ton trait et tu récupéreras la valeur attendue.

fanou
Auteur

** Je donnais un exemple mais le problème n'est pas de traduire. Si je remplace les valeurs de subtypes par '1' => 'toto', '2' => 'tata', '3' => 'titi', ... le système de langue ne me traduira rien. Ce n'est pas de traduire qui m'intéresse mais de voir s'il est possible d'outre passer la fonction getAttribute dans certains cas. Si dans une table, j'ai un champ qui prend les valeurs 1, 2 ou 3 correspondant à toto, tata, titi dans mon $subtypes ci-dessus, la fonction getAttribute m'affichera toujours ces valeurs là alors que j'aimerai des fois récupérer 1,2 ou 3. C'était ça le sens de ma question **

Quel est l'intérêt de ce tableau :

public $ubtypes = [
        'select'    => 'Sélection',
        'integer'   => 'Entier',
        'decimal'   => 'Décimal',
        'boolean'   => 'Oui/Non',
        'date'      => 'Date',
        'string'    => 'Texte'
    ];

A ce moment là retire getSubtypeAttribute de ton trait et tout revient dans l'ordre :) Si tu veux récupérer parfois une valeur ou une autre selon le contexte il faut le coder. Le système ne le permet pas d'emblée.