Come creare un elenco a discesa in yii2?


85

Come fare un dropdownin yii2utilizzando un activeforme un modello? Dal momento che tutti i metodi sono cambiati yii2, come è fatto in quello nuovo?


Questa domanda è stata modificata. Se sì, qual era la domanda iniziale.
Kshitiz

@Dency GB Sto cercando risposte ad un'altra mia domanda simile a questa .. È possibile che tu la dia un'occhiata ?? Link qui
Mohan Prasad

Risposte:


122

È come

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

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

ArrayHelper in Yii2 sostituisce i dati dell'elenco CHtml in Yii 1.1. [Carica i dati dell'array dal controller]

MODIFICARE

Carica i dati dal tuo controller.

Controller

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

In vista

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

1
Ricorda che Yii2 utilizza gli spazi dei nomi, da cui "usa spazi dei nomi" nella soluzione. Mi ci è voluto un po 'per pensare a cosa servissero.
johnsnails

11
Per favore non seguire direttamente questo esempio e avere la logica di recupero / costruzione dei dati nelle tue viste!
AndrewPK

@ AndrewPK: potresti fornire un esempio di come preferiresti che fosse fatto? Presumibilmente passato dal controller?
almcnicoll

@AndrewPK perché? è come i widget, puoi recuperare i dati nelle tue visualizzazioni e non è anti-pattern. Ma non puoi creare query che creano qualcosa in db e così via
Auine

2
@Auine hai creato il tuo modello? mvc, mvvm, ecc., descrivono tutti una separazione delle preoccupazioni. una vista dovrebbe sempre e solo preoccuparsi di visualizzare i dati che le sono stati forniti - non dovrebbe eseguire query, GET, ecc. Se non vuoi aderire a uno di questi modelli, anche questo è bello, ma rende le cose più difficili quando è necessario scambiare le visualizzazioni per supportare diverse piattaforme in futuro. La risposta modificata che l'autore ha fornito sopra è una soluzione più ideale in MVC: avere find () nel controller e passare i dati al rendering della vista.
AndrewPK

93

Sembra che tu abbia già trovato la tua risposta ma visto che hai menzionato il modulo attivo ne contribuisco con uno in più, anche se differisce solo leggermente.

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

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

    ActiveForm::end();
?>

@DencyGB il più semplice e penso che l'unica soluzione sarebbe quella di dare al primo nome del campo di selezione e manipolare l' .on('change')evento in jquery per popolare il secondo campo in base alla selezione del primo.
Arman P.

Voglio rimuovere il numero ordinario dall'elenco che viene visualizzato automaticamente.
Mohammad Aghayari

56

Ci sono alcune buone soluzioni sopra, e la mia è solo una combinazione di due (sono venuto qui cercando una soluzione).

La soluzione di @Sarvar Nishonboyev è buona perché mantiene la creazione dell'etichetta di input del modulo e del blocco di aiuto per i messaggi di errore.

Sono andato con:

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

Ancora una volta, pieno merito a: @Sarvar Nishonboyev's e @ippi


21

Sembra che ci siano molte buone risposte per questa domanda. Quindi cercherò di dare una risposta dettagliata

forma attiva e dati codificati

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

o

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

forma attiva e dati da una tabella db

useremo ArrayHelper, quindi aggiungilo prima allo spazio dei nomi di

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

ArrayHelper ha molte funzioni complete che potrebbero essere utilizzate per elaborare array map () è quello che useremo qui questa funzione aiuta a creare una mappa (di coppie chiave-valore) da un array multidimensionale o un array di oggetti.

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

non fa parte di una forma attiva

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

o

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

non un modulo attivo ma dati da una tabella db

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

15

Dai un'occhiata a questo:

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-']) ?>

10

Forse mi sbaglio ma penso che la query SQL dalla vista sia una cattiva idea

Questa è la mia strada

Nel controller

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


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

E in vista

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

O usando ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>

Dice elementi variabili non definiti quando si accede alla visualizzazione. Ho usato in questo modo il codice aggiunto al controller $this->view->params['items'] = $items;e nella mia pagina di visualizzazione<?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

Ho lo stesso problema, la variabile $ items è vuota a mio avviso
MeV

8
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

Questo ti aiuterà ... Non dimenticare di usare il file di classe nell'intestazione.


1
In cima al file di visualizzazione, è necessario scrivere use yii\helpers\ArrayHelper; per poter utilizzare l'helper.
Gogol

5

In ActiveFormappena uso:

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

5

Si tratta di generare dati, quindi è più appropriato dal modello. Immagina se volessi cambiare il modo in cui i dati vengono visualizzati nella casella a discesa, ad esempio aggiungi un cognome o qualcosa del genere. Dovresti trovare ogni casella a discesa e modificare il file arrayHelper. Uso una funzione nei miei modelli per restituire i dati per un menu a discesa, quindi non devo ripetere il codice nelle viste. Ha anche il vantaggio di poter specificare il filtro qui e di applicarlo a ogni elenco a discesa creato da questo modello;

/* Model Standard.php */

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

Puoi usarlo nel tuo file di visualizzazione in questo modo;

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

1

Se sei arrivato in fondo alla lista. Salva un po 'di codice php e riporta tutto dal DB di cui hai bisogno in questo modo:

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

0

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


-3

Può anche essere fatto quanto segue. Se vuoi aggiungere anteponi icona. Questo sarà 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();?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.