Как сделать выпадающий список в yii2?

Как сделать dropdown в yii2 с помощью activeform и модели? Поскольку все методы были изменены в yii2, как это делается в новом?

Ответ 1

Это похоже на

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

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

ArrayHelper в Yii2 заменяет данные списка CHtml в Yii 1.1. [Пожалуйста, загрузите данные массива с вашего контроллера]

ИЗМЕНИТЬ

Загрузите данные с вашего контроллера.

контроллер

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

В представлении

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

Ответ 2

Кажется, вы нашли свой ответ уже, но так как вы упоминали активную форму, я буду вносить еще один вклад, даже если он будет немного отличаться.

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

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

    ActiveForm::end();
?>

Ответ 3

Есть несколько хороших решений выше, а мой - всего лишь комбинация из двух (я пришел сюда для поиска решения).

@Решение Sarvar Nishonboyev является хорошим, потому что оно поддерживает создание входной метки формы и блок справки для сообщений об ошибках.

Я пошел с:

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

Снова, полный кредит: @Sarvar Nishonboyev и @ippi

Ответ 4

Кажется, есть много хороших ответов на этот вопрос. Поэтому я попытаюсь дать подробный ответ

активная форма и жестко закодированные данные

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

или

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

активная форма и данные из таблицы db

мы собираемся использовать ArrayHelper, поэтому сначала добавьте его в пространство имен

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

ArrayHelper использует множество функций, которые можно использовать для обработки массивов map() - это тот, который мы будем использовать здесь эта функция помогает сделать карту (пар ключ-значение) из многомерного массива или массива объектов.

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

не является частью активной формы

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

или

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

не активная форма, а данные из таблицы db

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

Ответ 5

Посмотрите это:

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

Возможно, я ошибаюсь, но я думаю, что запрос SQL из представления - плохая идея

Это мой путь

В контроллере

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


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

И в представлении

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

Или используя ActiveForm

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

Ответ 7

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

Это поможет вам... Не забудьте использовать файл класса в заголовке.

Ответ 8

В ActiveForm просто используйте:

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

Ответ 9

Речь идет о генерации данных, и поэтому более корректно делается из модели. Представьте, если вы когда-либо хотели изменить способ отображения данных в раскрывающемся списке, скажите, добавьте фамилию или что-то еще. Вам нужно будет найти каждый раскрывающийся список и изменить arrayHelper. Я использую функцию в своих моделях, чтобы возвращать данные для выпадающего списка, поэтому мне не нужно повторять код в представлениях. Это также имеет то преимущество, что я могу указать фильтр здесь и применить их к каждому раскрывающемуся списку, созданному из этой модели;

/* Model Standard.php */

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

Вы можете использовать это в своем файле вида следующим образом:

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

Ответ 10

Если вы дошли до нижней части списка. Сохраните некоторый код php и просто верните все данные из БД, как вам это нужно:

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

Ответ 11

Следующее также можно сделать. Если вы хотите добавить значок предварительного просмотра. Это будет полезно.

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