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.