
Формирование списка для dropDownList
1. Через select и indexBy (рекомендуется, если выбираем просто значение поля из БД)
<?= $form->field($model, 'parent_id')->dropDownList(app\models\Section::find()->select(['title', 'id'])->indexBy('id')->column(), ['prompt'=>'']) ?>
P.S. Так же делается и в форме редактирования для фильтрации по какому-либо полю
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'title', 'section_id', [ 'attribute'=>'parent_id', 'filter'=>Section::find()->select(['title', 'id'])->indexBy('id')->column(), 'value'=>'parent.title', /*'value'=> function (Section $section) { return $section->parent ? $section->parent->title : null; }*/ ], // 'position', ['class' => 'yii\grid\ActionColumn'], ], ]); ?>
При этом не забыть в классе для поиска (у меня это SectionSearch.php) условие для фильтра указать
... $query->andFilterWhere(['position' => $this->position,]) ->andFilterWhere(['parent_id' => $this->parent_id]); ...
И чтобы в таблице выводились не цифрами категории родителей, а их названия, указываю в 'value' связанное поле
'value'=>'parent.title',
Это же можно сделать анонимной функцией, где через связь $section->parent->title выводится название категории.
'value'=> function (Section $section) { return $section->parent ? $section->parent->title : null; }
Эта связь 'parent.title' создаётся в модели либо самим Gii из внешних ключей, либо если сразу не подумали и не создали внешние ключи в миграцию таблицы, то вручную в модель дописываем связь
public function getParent() { return $this->hasOne(Section::className(), ['id' => 'parent_id']); }
либо можно в виде в GridView получать value с помощью ArrayHelper::getValue указав составное поле 'parent.title'
'value'=> function (Section $section) { return ArrayHelper::getValue($section, 'parent.title'); }
Но GridView сам работает через ArrayHelper, поэтому самое простое сразу указать 'value'=>'parent.title'
Для DetailView надо указывать без анонимной функции
'value'=>ArrayHelper::getValue($model, 'parent.title')
2. Через ArrayHelper::map (если нужно как-то обработать поле из БД, например, своим геттером в модели)
<?= $form->field($model, 'parent_id') ->dropDownList(ArrayHelper::map(app\models\Section::find()->orderBy('title')->all(), 'id', 'childedSection'), ['prompt'=>'']) ?>
Булевые значения, поле статуса
Вместо 0 и 1, удобно показать значения Да и Нет. В GridView это просто приписывается к атрибуту тип
'status:boolean'
или если с фильтром надо
[ 'attribute'=>'status', 'filter'=>[0=>'Нет', 1=>'Да'], 'format'=>'boolean', ],
12 апреля 2016, Программирование, веб-кодинг / Метки: dropDownList boolean шпаргалки

