web-dev-qa-db-fra.com

Comment faire une liste déroulante dans yii2?

Comment créer une dropdown dans yii2 en utilisant une activeform et un modèle? Puisque toutes les méthodes ont changé dans yii2, comment cela se fait-il dans la nouvelle?

80
Dency G B

C'est comme

<?php
use yii\helpers\ArrayHelper;
use backend\models\Standard;
?>

<?= Html::activeDropDownList($model, 's_id',
      ArrayHelper::map(Standard::find()->all(), 's_id', 'name')) ?>

ArrayHelper dans Yii2 remplace les données de liste CHtml dans Yii 1.1. [Veuillez charger les données de tableau à partir de votre contrôleur]

MODIFIER

Charger des données à partir de votre contrôleur.

Manette

$items = ArrayHelper::map(Standard::find()->all(), 's_id', 'name');
...
return $this->render('your_view',['model'=>$model, 'items'=>$items]);

En vue

<?= Html::activeDropDownList($model, 's_id',$items) ?>
116
Dency G B

Il semble que vous ayez déjà trouvé votre réponse, mais puisque vous avez mentionné la forme active, je vais contribuer avec une autre, même si elle ne diffère que très légèrement.

<?php
    $form = ActiveForm::begin();

    echo $form->field($model, 'attribute')
        ->dropDownList(
            $items,           // Flat array ('id'=>'label')
            ['Prompt'=>'']    // options
        );

    ActiveForm::end();
?>
88
ippi

Il existe quelques bonnes solutions ci-dessus, et la mienne est juste une combinaison de deux (je suis venu ici pour chercher une solution).

La solution de @Sarvar Nishonboyev est bonne car elle conserve la création du libellé d'entrée de formulaire et du bloc d'aide pour les messages d'erreur.

J'y suis allé avec:

<?php
use yii\helpers\ArrayHelper;
use app\models\Product;
?>
<?=
$form->field($model, 'parent_id')
     ->dropDownList(
            ArrayHelper::map(Product::find()->asArray()->all(), 'parent_id', 'name')
            )
?>

Encore une fois, crédit complet à: @Sarvar Nishonboyev's et @ippi

54
johnsnails

Il semble y avoir beaucoup de bonnes réponses à cette question. Alors je vais essayer de donner une réponse détaillée

formulaire actif et données codées en dur

<?php
    echo $form->field($model, 'name')->dropDownList(['1' => 'Yes', '0' => 'No'],['Prompt'=>'Select Option']);
?>

ou

<?php
    $a= ['1' => 'Yes', '0' => 'No'];
    echo $form->field($model, 'name')->dropDownList($a,['Prompt'=>'Select Option']);
?>

formulaire actif et données d'une table de base de données

nous allons utiliser ArrayHelper alors ajoutez-le d'abord à l'espace de noms en

<?php
    use yii\helpers\ArrayHelper;
?>

ArrayHelper a de nombreuses fonctions complètes qui pourraient être utilisées pour traiter des tableaux.

<?php
    echo $form->field($model, 'name')->dropDownList(ArrayHelper::map(User::find()->all(),'id','username'),['Prompt'=>'Select User']);
?>

ne fait pas partie d'un formulaire actif

<?php
    echo Html::activeDropDownList($model, 'filed_name',['1' => 'Yes', '0' => 'No']) ;
?>

ou

<?php
    $a= ['1' => 'Yes', '0' => 'No'];
    echo Html::activeDropDownList($model, 'filed_name',$a) ;
?>

pas un formulaire actif mais des données d'une table de base de données

<?php
    echo Html::activeDropDownList($model, 'filed_name',ArrayHelper::map(User::find()->all(),'id','username'),['Prompt'=>'Select User']);
?>
20
Midhun

Regardez ceci:

use yii\helpers\ArrayHelper; // load classes
use app\models\Course;
    .....
$dataList=ArrayHelper::map(Course::find()->asArray()->all(), 'id', 'name');
<?=$form->field($model, 'center_id')->dropDownList($dataList, 
         ['Prompt'=>'-Choose a Course-']) ?>
15

Peut-être que je me trompe mais je pense que la requête SQL vue est une mauvaise idée

C'est mon chemin

Dans le contrôleur

$model = new SomeModel();
$items=ArrayHelper::map(TableName::find()->all(),'id','name');


return $this->render('view',['model'=>$model, 'items'=>$items])

Et en vue

<?= Html::activeDropDownList($model, 'item_id',$items) ?>

Ou en utilisant ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>
10
DespeiL
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['Prompt' => 'Select']
) ?>

Cela vous aidera ... N'oubliez pas d'utiliser le fichier de classe dans l'en-tête.

8
Kalai S

Il s’agit de générer des données, et est donc plus correctement réalisé à partir du modèle. Imaginez si vous avez toujours voulu modifier la façon dont les données sont affichées dans la liste déroulante, par exemple, ajoutez un nom de famille ou quelque chose du genre. Vous devez trouver chaque liste déroulante et changer le arrayHelper. J'utilise une fonction dans mes modèles pour renvoyer les données pour une liste déroulante. Je n'ai donc pas à répéter le code dans les vues. Cela présente également l’avantage de pouvoir spécifier un filtre ici et de l’appliquer à chaque liste déroulante créée à partir de ce modèle;

/* Model Standard.php */

public function getDropdown(){
      return ArrayHelper::map(self::find()->all(), 's_id', 'name'));
}

Vous pouvez utiliser ceci dans votre fichier de vue comme ceci;

echo $form->field($model, 'attribute')
        ->dropDownList(
            $model->dropDown
        );
5
Joe Miller

Dans ActiveForm, utilisez simplement:

<?=
    $form->field($model, 'state_id')
         ->dropDownList(['Prompt' => '---- Select State ----'])
         ->label('State')
?>
5
Bhola Singh

Si vous avez atteint le bas de la liste. Sauvegardez du code php et ramenez tout ce qui se trouve dans la base de données, comme vous le souhaitez:

 $items = Standard::find()->select(['name'])->indexBy('s_id')->column();
1
Reginald Goolsby