Программирование, веб-кодинг

Шпаргалки по Yii2

Некоторые помогающие моменты для разработки на Yii2

Шпаргалки по Yii2

Формирование списка для 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',
],