Comment créer une liste déroulante dans yii2?

85

Comment faire un dropdownen yii2utilisant un activeformet un modèle? Puisque toutes les méthodes ont changé yii2, comment cela se passe-t-il dans la nouvelle?

Dency GB
la source
Cette question est-elle modifiée. Si oui, quelle était la question initiale.
Kshitiz
@Dency GBJe cherche des réponses à ma autre question similaire à celle-ci .. Est-il possible pour vous d'y jeter un œil ?? Lien ici
Mohan Prasad

Réponses:

122

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 la liste CHtml dans Yii 1.1. [Veuillez charger les données du tableau à partir de votre contrôleur]

ÉDITER

Chargez les données 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) ?>
Dency GB
la source
1
Rappelez-vous que Yii2 utilise des espaces de noms, d'où «utiliser des espaces de noms» dans la solution. Il m'a fallu un certain temps pour réfléchir à leur utilité.
johnsnails
11
Veuillez ne pas suivre directement cet exemple et avoir une logique de récupération / construction de données dans vos vues!
AndrewPK
@AndrewPK: pourriez-vous donner un exemple de la façon dont vous préféreriez que cela soit fait? Passé probablement par le contrôleur?
almcnicoll
@AndrewPK pourquoi? c'est comme des widgets, vous pouvez récupérer des données dans vos vues et ce n'est pas un anti-pattern. Mais vous ne pouvez pas créer de requêtes qui créent quelque chose dans db et ainsi de suite
Auine
2
@Auine avez-vous créé votre propre modèle? mvc, mvvm, etc., décrivent tous une séparation des préoccupations. une vue ne devrait jamais être concernée que par l'affichage des données qui lui ont été fournies - elle ne devrait pas exécuter de requêtes, de GET, etc. Si vous ne voulez pas adhérer à l'un de ces modèles, c'est cool aussi - mais cela rend les choses plus difficiles lorsque vous devez échanger des vues pour prendre en charge différentes plates-formes à l'avenir. La réponse modifiée fournie par l'auteur ci-dessus est une solution plus idéale dans MVC - avoir le find () dans le contrôleur et transmettre les données au rendu de la vue.
AndrewPK
93

Il semble que vous ayez déjà trouvé votre réponse, mais puisque vous avez mentionné le formulaire actif, je contribuerai avec un autre, même s'il ne diffère que légèrement.

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

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

    ActiveForm::end();
?>
ippi
la source
@DencyGB le plus simple et je pense que la seule solution serait de donner le premier nom de champ de sélection et de manipuler l' .on('change')événement dans jquery pour remplir le deuxième champ en fonction de la sélection du premier.
Arman P.
Je veux supprimer le numéro ordinaire de la liste qui s'affiche automatiquement.
Mohammad Aghayari le
56

Il y a quelques bonnes solutions ci-dessus, et la mienne est juste une combinaison de deux (je suis venu ici à la recherche d'une solution).

La solution de @Sarvar Nishonboyev est bonne car elle maintient la création de l'étiquette d'entrée du 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, merci à: @Sarvar Nishonboyev et @ippi

johnsnails
la source
21

Il semble qu'il y ait beaucoup de bonnes réponses à cette question.Je vais donc essayer de donner une réponse détaillée

forme active 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 nom en

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

ArrayHelper a de nombreuses fonctions complètes d'utilisation qui pourraient être utilisées pour traiter des tableaux map () est celui que nous allons utiliser ici cette fonction aide à créer une carte (de paires clé-valeur) à partir d'un tableau multidimensionnel ou d'un tableau d'objets.

<?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']);
?>
Midhun
la source
15

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-']) ?>
Sarvar Nishonboev
la source
10

Peut-être que je me trompe, mais je pense que la requête SQL de 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(); ?>
DespeiL
la source
Il indique des éléments variables non définis lors de l'accès à la vue. J'ai utilisé de cette manière le code ajouté au contrôleur $this->view->params['items'] = $items;et dans ma page d'affichage<?php echo $form->field($model, 'plan_type', ['options' => ['class' => ' input select']])->dropdownList( $this->params['items'],['prompt'=>'Select Plan','class' => 'selectpicker', 'data-live-search' => 'true','label'=>false]);?>
RN Kushwaha
J'ai le même problème, la variable $ items est vide à mon avis
MeV
8
<?= $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.

Kalai S
la source
1
En plus du fichier de vue, il faut écrire use yii\helpers\ArrayHelper; pour pouvoir utiliser l'assistant.
Gogol
5

En ActiveFormutilisation juste:

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

Il s'agit de générer des données, et c'est donc plus correctement fait à partir du modèle. Imaginez si vous vouliez changer la façon dont les données sont affichées dans la liste déroulante, par exemple ajouter un nom de famille ou quelque chose. Vous devrez trouver chaque liste déroulante et modifier le fichier arrayHelper. J'utilise une fonction dans mes modèles pour renvoyer les données d'une liste déroulante, donc je n'ai pas à répéter le code dans les vues. Cela a également l'avantage de pouvoir spécifier un filtre ici et de les 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
        );
Joe Miller
la source
1

Si vous avez atteint le bas de la liste. Enregistrez du code php et ramenez tout simplement de la base de données selon vos besoins, comme ceci:

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

Html :: activeDropDownList ($ model, 'id', ArrayHelper :: map (AttendanceLabel :: find () -> all (), 'id', 'label_name'), ['prompt' => 'Attendance Status']) ;

Gajendra Mehra
la source
-3

Le suivi peut également être fait. Si vous souhaitez ajouter l'icône de préfixe. Ce sera utile.

<?php $form = ActiveForm::begin();    
   echo $form->field($model, 'field')->begin();
     echo Html::activeLabel($model, 'field', ["class"=>"control-label col-md-4"]); ?>
       <div class="col-md-5">
          <?php echo Html::activeDropDownList($model, 'field', $array_list, ['class'=>'form-control']); ?>
          <p><i><small>Please select field</small></i>.</p>
          <?php echo Html::error($model, 'field', ['class'=>'help-block']); ?>
       </div>
   <?php echo $form->field($model, 'field')->end(); 
ActiveForm::end();?>
Kshitiz
la source