Cómo hacer una lista desplegable en yii2?

Cómo hacer un dropdown en yii2 el uso de un activeform y un modelo? Dado que todos los métodos que ha cambiado en yii2,cómo se hace en el nuevo?

  • Es esta pregunta editado. Si sí, ¿cuál fue la primera pregunta.
  • G B estoy buscando respuestas a mi otra pregunta similar a este.. Es posible que usted tenga una mirada en ella?? Enlace aquí
InformationsquelleAutor Dency G B | 2014-02-05

11 Kommentare

  1. 118

    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 sustituye a la CHtml de datos de la lista en Yii 1.1.[Favor de carga de la matriz de datos del controlador]

    EDITAR

    Carga de datos desde el controlador.

    Controlador de

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

    A La Vista

    <?= Html::activeDropDownList($model, 's_id',$items) ?>
    • Recordatorio de que Yii2 hace uso de espacios de nombres, de ahí el «uso de espacios de nombres» en la solución. Me tomó un tiempo para pensar lo que se para.
    • Por favor, no siga este ejemplo y tener los datos de captura/la construcción de la lógica en sus puntos de vista!
    • ¿podría dar un ejemplo de cómo prefieres que este hecho? Pasa a través del controlador, presumiblemente?
    • por qué? es como widgets, usted puede recuperar datos de puntos de vista y no es anti-patrón. Pero no se puede crear consultas que crean algo en db y así sucesivamente
    • ¿usted cree su propio diseño? mvc, mvvm, etc., todos describir una separación de preocupaciones. una vista sólo debe siempre estar preocupado con la visualización de datos fue dado – no debe ser la realización de consultas, Obtiene, etc. Si usted no desea adherirse a uno de esos patrones, que también es bueno – pero hace las cosas más difíciles cuando usted necesita para intercambiar puntos de vista para apoyar las diferentes plataformas en el futuro. La edición respuesta el autor, siempre de arriba es una más en la solución ideal en MVC – tener el find() en el controlador y pasar los datos para el renderizado de la vista.
    • poniendo consultas en las vistas o los widgets es una mala práctica. Esto conduce a una baja escala de db de carga. A menudo, si las opiniones son reutilizados a través de la plataforma dev le pierde la pista del número de consultas que se están llevando a cabo para una determinada carga de la página. Como resultado de una consulta que sólo necesita ejecutar una vez que se puede ejecutar muchas más veces innecesariamente. Especialmente si un widget aparece más de una vez en un determinado punto de vista. Esto no se considera «SECO», en.wikipedia.org/wiki/Don%27t_repeat_yourself
    • así que cuando usted usa algún widget en la VISTA con algunos datos de DB, ¿cómo se puede obtener los datos?
    • las consultas se manejan en el controlador y se envía a la vista a través de la render método. De esa manera, si usted tiene varios widgets o puntos de vista que requieren los mismos datos menos las consultas se ejecutan como un resultado. En última instancia, por el siguiente de la presente convención puede descubrir fácilmente en el controlador si usted puede consolidar las consultas. Por ejemplo, si dos consultas pueden ser combinados en un solo puedes mejorar el rendimiento de la carga.
    • Durante varios años he pensado (y código) dogmáticamente como usted. Pero el trabajo con el arte de la CMS (basado en Yii) ha mostrado que a veces las consultas son más limpiamente realiza desde dentro de una vista. Ejemplo: Si usted tiene un widget para mostrar los próximos eventos y ese widget necesita ser demostrado en múltiples áreas de su sitio web (página de inicio, área de noticias, área de eventos, etc.). En lugar de tener que ejecutar esa consulta en cada controlador, se codifica sólo una vez dentro de ese punto de vista. Si usted deja de mostrar el widget en un área de la consulta se suprimen automáticamente, mientras que a menudo puede ser olvidado, de lo contrario.

  2. 89

    Parece que ha encontrado su respuesta ya, pero ya que usted menciona la forma activa voy a contribuir con uno más, aunque difiere sólo ligeramente.

    <?php
        $form = ActiveForm::begin();
    
        echo $form->field($model, 'attribute')
            ->dropDownList(
                $items,           //Flat array ('id'=>'label')
                ['prompt'=>'']    //options
            );
    
        ActiveForm::end();
    ?>
    • la forma más sencilla y creo que la única solución sería dar el primer seleccione el campo nombre y manipular .on('change') evento en jquery para rellenar segundo campo basada en la selección de la primera.
    • Quiero quitar ordinario número de la lista que se muestra automáticamente.
  3. 56

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

    @Sarvar Nishonboyev la solución es buena porque mantiene la creación de la forma de la etiqueta de entrada y la ayuda de bloque de mensajes de error.

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

    De nuevo, lleno de crédito a: @Sarvar Nishonboyev y @realiza ippi

  4. 21

    Parece que hay muchas buenas respuestas para esta pregunta .Así que voy a intentar dar una respuesta detallada

    forma activa y codificado de datos

    <?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 los datos de una db tabla

    vamos a usar ArrayHelper así que primero agregar a la de espacio de nombre por

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

    ArrayHelper tiene muchos uso completo de las funciones que podría ser utilizado para el proceso de matrices
    mapa () es el que vamos a utilizar aquí
    esta función ayuda a hacer un mapa ( de pares clave-valor) de una matriz multidimensional o un array de objetos.

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

    no 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 de una forma activa, pero los datos de un db tabla

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

    Echar 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-']) ?>
  6. 10

    Tal vez estoy equivocado, pero creo que la consulta SQL de vista es una mala idea

    Esta es mi manera

    Controlador

    $model = new SomeModel();
    $items=ArrayHelper::map(TableName::find()->all(),'id','name');
    
    
    return $this->render('view',['model'=>$model, 'items'=>$items])

    Y en Vista de

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

    O el uso de ActiveForm

    <?php $form = ActiveForm::begin(); ?>
     <?= $form->field($model, 'item_id')->dropDownList($items) ?>
    <?php ActiveForm::end(); ?>
    • Dice que su undefined variable de elementos al acceder a la vista. He usado esta manera añadido código para el controlador de $this->view->params['items'] = $items; y en mi página de vista de <?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]);?>
    • Tengo el mismo problema, la variable $elementos está vacío en mi punto de vista
  7. 8
    <?= $form->field($model, 'attribute_name')->dropDownList(
             ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
            ['prompt' => 'Select']
    ) ?>

    Esto le ayudará a…no se olvide de utilizar el archivo de clase en el encabezado.

    • En la parte superior de la vista de archivos, uno necesita escribir use yii\helpers\ArrayHelper; a ser capaz de utilizar el helper.
  8. 5

    En ActiveForm sólo tiene que utilizar:

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

    Esto es acerca de la generación de los datos, y lo es más si se hace bien desde el modelo. Imagínese si usted alguna vez ha querido cambiar la forma en que se muestran los datos en el cuadro de lista desplegable, decir agregar un apellido o algo. Usted tendría que encontrar cada cuadro de lista desplegable y cambie el arrayHelper. Yo uso una función en mis modelos para devolver los datos de una lista desplegable, para no tener que repetir el código de las vistas. También tiene la ventaja de que puedo especificar el filtro de aquí y les han de aplicar a cada desplegable creado a partir de este modelo;

    /* Model Standard.php */
    
    public function getDropdown(){
          return ArrayHelper::map(self::find()->all(), 's_id', 'name'));
    }

    Usted puede utilizar esto en su archivo de vista de como esta;

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

    Si lo hizo en la parte inferior de la lista. Ahorrar algo de código php y acaba de traer todo de vuelta de la DB como usted necesita, como este:

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

    Siguientes también se puede hacer. Si desea anexar anteponer icono. 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();?>

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea