¿Cómo hacer una lista desplegable en yii2?

85

Cómo hacer una dropdownen yii2el uso de una activeformy un modelo? Dado que todos los métodos han cambiado yii2, ¿cómo se hace en el nuevo?

Dency GB
fuente
¿Se ha editado esta pregunta? En caso afirmativo, ¿cuál fue la pregunta inicial?
Kshitiz
@Dency GB Estoy buscando respuestas a mi otra pregunta similar a esta ... ¿Es posible que le eches un vistazo? Enlace aquí
Mohan Prasad

Respuestas:

122

Es como

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

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

ArrayHelper en Yii2 reemplaza los datos de la lista CHtml en Yii 1.1. [Cargue los datos de la matriz desde su controlador]

EDITAR

Cargue datos de su controlador.

Controlador

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

En vista

<?= Html::activeDropDownList($model, 's_id',$items) ?>
Dency GB
fuente
1
Recuerde que Yii2 hace uso de espacios de nombres, de ahí el 'uso de espacios de nombres' en la solución. Me tomó un tiempo pensar para qué eran.
johnsnails
11
¡No siga directamente este ejemplo y tenga lógica de generación / obtención de datos en sus vistas!
AndrewPK
@AndrewPK: ¿podría dar un ejemplo de cómo prefiere que se haga esto? ¿Pasó del controlador presumiblemente?
almcnicoll
@AndrewPK ¿por qué? es como widgets, puede obtener datos en sus vistas y no es anti-patrón. Pero no puede crear consultas que creen algo en db y así sucesivamente
Auine
2
@Auine, ¿creaste tu propio patrón? mvc, mvvm, etc., todos describen una separación de preocupaciones. una vista solo debe preocuparse por mostrar los datos que se le proporcionaron; no debe realizar consultas, GET, etc. necesita intercambiar vistas para admitir diferentes plataformas en el futuro. La respuesta editada que el autor proporcionó anteriormente es una solución más ideal en MVC: tener el find () en el controlador y pasar los datos al renderizado de la vista.
AndrewPK
93

Parece que ya ha encontrado su respuesta, pero como mencionó el formulario activo, contribuiré con uno más, incluso si difiere solo ligeramente.

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

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

    ActiveForm::end();
?>
ippi
fuente
@DencyGB es el más simple y creo que la única solución sería dar el primer nombre de campo de selección y manipular el .on('change')evento en jquery para completar el segundo campo según la selección del primero.
Arman P.
Quiero eliminar el número normal de la lista que se muestra automáticamente.
Mohammad Aghayari
56

Hay algunas buenas soluciones arriba, y la mía es solo una combinación de dos (vine aquí buscando una solución).

La solución de @Sarvar Nishonboyev es buena porque mantiene la creación de la etiqueta de entrada del formulario y el bloque de ayuda para mensajes de error.

Yo fui 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')
            )
?>

Nuevamente, todo el crédito para: @Sarvar Nishonboyev y @ippi

johnsnails
fuente
21

Parece que hay muchas buenas respuestas para esta pregunta, así que intentaré dar una respuesta detallada

forma activa y datos codificados

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

formulario activo y datos de una tabla de base de datos

vamos a usar ArrayHelper, así que primero agréguelo al espacio de nombres por

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

ArrayHelper tiene muchas funciones completas de uso que podrían usarse para procesar matrices map () es la que vamos a usar aquí, esta función ayuda a hacer un mapa (de pares clave-valor) a partir de una matriz multidimensional o una matriz de objetos.

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

no es parte de una forma activa

<?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) ;
?>

no es un formulario activo sino datos de una tabla db

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

Mira esto:

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
fuente
10

Tal vez me equivoque, pero creo que la consulta SQL desde la vista es una mala idea

Esta es mi manera

En controlador

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


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

Y a la vista

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

O usando ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>
DespeiL
fuente
Dice elementos variables indefinidos al acceder a la vista. Utilicé de esta manera código agregado al controlador $this->view->params['items'] = $items;y en mi página de vista<?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
Tengo el mismo problema, la variable $ items está vacía en mi vista
MeV
8
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

Esto te ayudará ... No olvides usar el archivo de clase en el encabezado.

Kalai S
fuente
1
En la parte superior del archivo de vista, es necesario escribir use yii\helpers\ArrayHelper; para poder usar el asistente.
Gogol
5

En ActiveFormel uso justo:

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

Se trata de generar datos y, por lo tanto, se hace más correctamente a partir del modelo. Imagínese si alguna vez quisiera cambiar la forma en que se muestran los datos en el cuadro desplegable, por ejemplo, agregue un apellido o algo. Tendría que encontrar cada cuadro desplegable y cambiar el arrayHelper. Utilizo una función en mis modelos para devolver los datos de un menú desplegable, por lo que no tengo que repetir el código en las vistas. También tiene la ventaja de que puedo especificar filtros aquí y hacer que se apliquen a todos los menús desplegables creados a partir de este modelo;

/* Model Standard.php */

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

Puede usar esto en su archivo de vista de esta manera;

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

Si llegó al final de la lista. Guarde un poco de código php y simplemente recupere todo de la base de datos cuando lo necesite de esta manera:

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

Html :: activeDropDownList ($ modelo, 'id', ArrayHelper :: map (AttendanceLabel :: find () -> all (), 'id', 'label_name'), ['prompt' => 'Estado de asistencia']) ;

Gajendra Mehra
fuente
-3

También se puede hacer lo siguiente. Si desea agregar el icono de anteposición. Esto será de gran ayuda.

<?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
fuente