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

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


person Dency G B    schedule 05.02.2014    source источник
comment
Этот вопрос редактируется. Если да, то какой был первоначальный вопрос.   -  person Kshitiz    schedule 28.05.2014
comment
@Dency G B Я ищу ответы на свой другой вопрос, похожий на этот .. Можно ли вам взглянуть на него ?? Ссылка здесь   -  person Mohan Prasad    schedule 16.09.2016


Ответы (12)


Это похоже на

<?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) ?>
person Dency G B    schedule 05.02.2014
comment
Напомним, что Yii2 использует пространства имен, следовательно, в решении используется «использовать пространства имен». Мне потребовалось время, чтобы подумать, для чего они нужны. - person johnsnails; 05.06.2014
comment
Пожалуйста, не следуйте этому примеру напрямую и не используйте логику выборки / построения данных в ваших представлениях! - person AndrewPK; 11.03.2015
comment
@AndrewPK: не могли бы вы привести пример того, как вы бы предпочли, чтобы это было сделано? Предположительно прошел через контроллер? - person almcnicoll; 17.04.2015
comment
@AndrewPK почему? это похоже на виджеты, вы можете получать данные в ваших представлениях, и это не анти-паттерн. Но вы не можете создавать запросы, которые создают что-то в db и т. Д. - person Auine; 24.01.2016
comment
@Auine вы создали свой собственный узор? mvc, mvvm и т. д. описывают разделение задач. представление должно быть связано только с отображением данных, которые оно было предоставлено - оно не должно выполнять запросы, GET и т. д. Если вы не хотите придерживаться одного из этих шаблонов, это тоже круто, но это усложняет вам нужно поменять местами представления для поддержки различных платформ в будущем. Отредактированный ответ, предоставленный автором выше, является более идеальным решением в MVC - наличие find () в контроллере и передача данных в рендеринг представления. - person AndrewPK; 26.01.2016
comment
@ Подлинное размещение запросов в представлениях или виджетах - плохая практика. Это приводит к плохому масштабированию нагрузки в БД. Часто, если представления повторно используются на платформе, разработчики теряют отслеживание количества запросов, выполняемых для определенной загрузки страницы. В результате запрос, который нужно выполнить только один раз, может быть запущен много раз без необходимости. Особенно, если виджет появляется более одного раза в данном представлении. Это не считается СУХОЙ, en.wikipedia.org/wiki/Don%27t_repeat_yourself - person BajaBob; 21.04.2016
comment
@BajaBob, поэтому, когда вы используете какой-либо виджет в ВИДЕ с некоторыми данными из БД, как вы получаете данные? - person Auine; 05.05.2016
comment
@Auine, запросы обрабатываются в контроллере и отправляются в представление через метод render. Таким образом, если у вас есть несколько виджетов или представлений, которым требуются одни и те же данные, в результате выполняется меньше запросов. В конечном итоге, следуя этому соглашению, вы можете легко обнаружить в своем контроллере, сможете ли вы объединить запросы. Например, если два запроса можно объединить в один, вы улучшите производительность загрузки. - person BajaBob; 05.05.2016
comment
@BajaBob В течение нескольких лет я думал (и кодил) догматически, как и вы. Но работа с Craft CMS (на основе Yii) с тех пор показала мне, что иногда запросы более аккуратно выполняются из представления. Пример: если у вас есть виджет, отображающий предстоящие события, и этот виджет должен отображаться в нескольких областях вашего сайта (домашняя страница, область новостей, область событий и т. Д.). Вместо того, чтобы запускать этот запрос в каждом контроллере, он просто кодируется один раз внутри этого представления. Если вы перестаете отображать виджет в области, запрос автоматически подавляется, в противном случае о нем часто можно забыть. - person Simon East; 26.04.2017

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

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

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

    ActiveForm::end();
?>
person ippi    schedule 05.02.2014
comment
@DencyGB - самое простое, и я думаю, что единственным решением было бы дать имя первого поля выбора и манипулировать событием .on('change') в jquery для заполнения второго поля на основе выбора первого. - person Arman P.; 07.02.2014
comment
Я хочу удалить обычный номер из списка, который отображается автоматически. - person Mohammad Aghayari; 15.06.2016

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

Решение @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

person johnsnails    schedule 05.06.2014

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

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

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

or

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

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

мы собираемся использовать 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']) ;
?>

or

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

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

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

Взгляните на это:

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-']) ?>
person Sarvar Nishonboyev    schedule 01.04.2014

Может я ошибаюсь, но считаю, что 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(); ?>
person DespeiL    schedule 11.06.2015
comment
Он говорит, что при доступе к представлению неопределенные элементы переменных. Я использовал этот способ, добавил код в контроллер $this->view->params['items'] = $items; и на моей странице просмотра <?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]);?> - person RN Kushwaha; 11.10.2015
comment
У меня такая же проблема, переменная $ items, на мой взгляд, пуста - person MeV; 20.04.2016

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

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

person Kalai S    schedule 09.05.2015
comment
В верхней части файла представления нужно написать use yii\helpers\ArrayHelper;, чтобы иметь возможность использовать помощник. - person Gogol; 08.07.2015

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

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

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

/* Model Standard.php */

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

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

echo $form->field($model, 'attribute')
        ->dropDownList(
            $model->dropDown
        );
person Joe Miller    schedule 16.12.2015

Если вы добрались до конца списка. Сохраните немного php-кода и просто верните все из БД, как вам нужно, например:

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

Html :: activeDropDownList ($ model, 'id', ArrayHelper :: map (AttendanceLabel :: find () - ›all (), 'id', 'label_name'), ['prompt' =› 'Статус посещаемости']) ;

person Gajendra Mehra    schedule 16.09.2020

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

<?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();?>
person Kshitiz    schedule 27.03.2014