web-dev-qa-db-fra.com

cakephp 3.0 comment remplir un champ de sélection avec des valeurs au lieu de id

je cherchais une réponse précédente, mais celles que j'ai trouvées sont liées aux anciennes versions de Cakephp

j'ai deux tables, 'magazines' et 'issues' où il y a une relation 'questions' appartient 'à' magazines ', voici à quoi ressemble IssuesTable:

public function initialize(array $config){

$this->belongsTo('Magazines', [
    'foreignKey' => 'id'
]);
}

table magazines a deux champs, magazines.id et magazines.name

table issues a deux champs, issues.id, issues.magazine_id où issues.magazine_id est la clé étrangère

pour renseigner une entrée sélectionnée dans la vue des problèmes avec les valeurs magazine.name et enregistrer le numéro issues.magazine_id, j'ai configuré le contrôleur de la manière suivante

$this->set('magazines', $this->Issue->Magazine->find('list'));

alors j'ai ajouté le code suivant à la vue du problème add.cpt

    <?php
    echo $this->Form->input('name', [
    'type' => 'select',
    'multiple' => false,
    'options' => $magazines, 
    'empty' => true]);
    ?>

mais je reçois l'entrée select avec les issues.magazine_id en tant que valeurs au lieu de magazines.name

merci pour votre aide et vos commentaires

9

Vous voulez utiliser find('list') car ceci retournera la clé primaire et le champ d'affichage: -

$this->set(
    'magazines', 
    $this->Issues->Magazines->find('list')
);

Ensuite, dans votre formulaire, vous devez indiquer le nom de l'entrée magazine_id si vous souhaitez définir la clé étrangère de l'association: -

echo $this->Form->input(
    'magazine_id', 
    [
        'type' => 'select',
        'multiple' => false,
        'options' => $magazines, 
        'empty' => true
    ]
);

Voir le docs pour plus d’informations.

Mise à jour

Si vous rencontrez des problèmes avec find('list'), c'est peut-être parce que la variable displayField de votre modèle n'est pas correctement définie. Cake détermine normalement la displayField du modèle à l’initialisation. Si cela ne fonctionne pas ou si vous voulez un autre champ, vous pouvez le définir manuellement dans la méthode initialize() du modèle. Par exemple.:-

class MagazinesTable extends Table
{

    public function initialize(array $config)
    {
        $this->displayField('name');
    }
}

Changer 'name' dans le champ approprié.

Vous pouvez également choisir le champ que Cake utilisera pour les valeurs renvoyées par find('list') (cela est particulièrement utile lorsque vous souhaitez remplacer la valeur par défaut displayField). Par exemple.:-

$this->Issues->Magazines->find('list', [
    'keyField' => 'id',
    'valueField' => 'name'
]);
17
drmonkeyninja

Affiche l'option sélectionnée dans l'aide mensuelle

$this->Form->month('students.month', [
'label' => false, 
'value'=>date('m'),
'required'=>true
]); 
0
Dinesh Vaitage