php - dropdownlist - ¿Cómo hacer una lista desplegable en yii2?
yii2 dropdownlist dependent (11)
¿Cómo hacer un dropdown
en yii2
usando una forma activeform
y un modelo? Como todos los métodos han cambiado en yii2
, ¿cómo se hace en el nuevo?
Echa un vistazo a 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-'']) ?>
En ActiveForm
simplemente use:
<?=
$form->field($model, ''state_id'')
->dropDownList([''prompt'' => ''---- Select State ----''])
->label(''State'')
?>
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) ?>
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 bloque de ayuda para los 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, crédito completo a: @Sarvar Nishonboyev y @ippi
Parece que hay muchas buenas respuestas para esta pregunta. Por lo tanto, trataré de 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'']);
?>
forma activa y datos de una tabla db
vamos a usar ArrayHelper así que primero agréguelo al espacio de nombres
<?php
use yii/helpers/ArrayHelper;
?>
ArrayHelper tiene muchas funciones completas que se pueden usar para procesar arrays. Map () es el que vamos a usar aquí. Esta función ayuda a hacer un mapa (de pares clave-valor) 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 una forma activa sino datos de una tabla db
<?php
echo Html::activeDropDownList($model, ''filed_name'',ArrayHelper::map(User::find()->all(),''id'',''username''),[''prompt''=>''Select User'']);
?>
Parece que ya has encontrado tu respuesta, pero como mencionaste el formulario activo, contribuiré con uno más, aunque solo difiera un poco.
<?php
$form = ActiveForm::begin();
echo $form->field($model, ''attribute'')
->dropDownList(
$items, // Flat array (''id''=>''label'')
[''prompt''=>''''] // options
);
ActiveForm::end();
?>
Se trata de generar datos y, por lo tanto, se hace más correctamente desde el modelo. Imagine si alguna vez quiso cambiar la forma en que se muestran los datos en el cuadro desplegable, por ejemplo, agregar un apellido o algo. Tendría que encontrar todos los arrayHelper
desplegables y cambiar el arrayHelper
. Utilizo una función en mis modelos para devolver los datos para 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 el filtro aquí y hacer que se apliquen a cada menú desplegable creado a partir de este modelo;
/* Model Standard.php */
public function getDropdown(){
return ArrayHelper::map(self::find()->all(), ''s_id'', ''name''));
}
Puedes usar esto en tu archivo de vista así;
echo $form->field($model, ''attribute'')
->dropDownList(
$model->dropDown
);
Si llegó al final de la lista. Guarde algunos códigos php y simplemente devuelva todo lo que necesita de la base de datos:
$items = Standard::find()->select([''name''])->indexBy(''s_id'')->column();
Tal vez estoy equivocado, pero creo que la consulta SQL de la vista es una mala idea
Esta es mi manera
En el 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(); ?>
Lo siguiente también se puede hacer. Si quieres agregar un icono de anteponer. Esto será útil.
<?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();?>
<?= $form->field($model, ''attribute_name'')->dropDownList(
ArrayHelper::map(Table_name::find()->all(),''id'',''field_name''),
[''prompt'' => ''Select'']
) ?>
Esto te ayudará ... No te olvides de usar el archivo de clase en el encabezado.