Как сделать dropdown
yii2
в yii2
с использованием activeform
и модели? Поскольку все методы изменились в yii2
, как это делается в новом?
Это похоже на
<?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) ?>
Кажется, вы уже нашли свой ответ, но, так как вы упомянули активную форму, я буду способствовать еще одному, даже если она будет немного отличаться.
<?php $form = ActiveForm::begin(); echo $form->field($model, 'attribute') ->dropDownList( $items, // Flat array ('id'=>'label') ['prompt'=>''] // options ); ActiveForm::end(); ?>
Есть несколько хороших решений выше, а мой – всего лишь комбинация из двух (я пришел сюда, чтобы найти решение).
Решение @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's и @ippi
Кажется, есть много хороших ответов на этот вопрос. Поэтому я попытаюсь дать подробный ответ
активная форма и жестко закодированные данные
<?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']); ?>
Посмотрите это:
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-']) ?>
Возможно, я ошибаюсь, но я думаю, что 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(); ?>
<?= $form->field($model, 'attribute_name')->dropDownList( ArrayHelper::map(Table_name::find()->all(),'id','field_name'), ['prompt' => 'Select'] ) ?>
Это поможет вам … Не забудьте использовать файл класса в заголовке.
В ActiveForm
просто используйте:
<?= $form->field($model, 'state_id') ->dropDownList(['prompt' => '---- Select State ----']) ->label('State') ?>
Речь идет о генерации данных, и поэтому более корректно делается из модели. Представьте, если вы когда-либо хотели изменить способ отображения данных в раскрывающемся списке, скажите, добавьте фамилию или что-то еще. Вам нужно будет найти каждый раскрывающийся arrayHelper
и изменить arrayHelper
. Я использую функцию в своих моделях, чтобы возвращать данные для выпадающего списка, поэтому мне не нужно повторять код в представлениях. Это также имеет то преимущество, что я могу указать здесь фильтр и применить их к каждому раскрывающемуся списку, созданному из этой модели;
/* Model Standard.php */ public function getDropdown(){ return ArrayHelper::map(self::find()->all(), 's_id', 'name')); }
Вы можете использовать это в своем файле вида следующим образом;
echo $form->field($model, 'attribute') ->dropDownList( $model->dropDown );
Если вы дошли до нижней части списка. Сохраните некоторый php-код и просто верните все из БД, как вам нужно:
$items = Standard::find()->select(['name'])->indexBy('s_id')->column();
Следующее также можно сделать. Если вы хотите добавить значок предварительного просмотра. Это будет полезно.
<?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();?>