Yii2 создание блога (Часть 3 – формы редактирования)

В предыдущей части было рассмотрено создание моделей и CRUD операции. В этой части рассмотрим настройку форм редактирования поподробней, сделаем их удобными для использования, для полей представляющих связи добавим поля с выпадающим списком и т.д.

Файлы с представлением (view) располагаются в директории ./views. В директории имеются поддиректории соответствующие названиям наших моделей. После генерации создаётся пять файлов:

_form.php: форма редактирования/создания объекта
create.php: шаблон страницы создания нового объекта
index.php: шаблон страницы вывода списка объектов
update.php: шаблон страницы редактирования объекта
view.php: шаблон страницы просмотра объекта

Начнём с формы создания/редактирования объекта. Для того что бы вывести список вариантов поля связанного с другой таблицей можно воспользоваться виджетом ActiveField::dropDownList. На вход он принимает два параметра: массив вариантов (id => label) и массив опций.

Для генерации массива представляющего key-value можно воспользоваться хэлпером ArrayHelper::map, которому передаём массив и два параметра-имена полей для ключа и значения соответственно.

Таким образом стандартно сгенерированный textInput

<?= $form->field($model, 'category_id')->textInput(['maxlength' => 10]) ?>

меняем на dropDownList:

<?= $form->field($model, 'category_id')->dropDownList(
    ArrayHelper::map($category, 'id', 'title')
) ?>

Теперь в переменную $category передадим список всех категорий. Для этого в контроллер ./controller/PostController.php внесём следующие изменения:

/**
 * Создание поста.
 * @return string|Response
 */
public function actionCreate()
{
    $model = new Post();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
            'category' => Category::find()->all(),
            'authors' => User::find()->all()
        ]);
    }
}

Аналогичные действия проделываем и для поля автор:

<?= $form->field($model, 'author_id')->dropDownList(
    ArrayHelper::map($authors, 'id', 'nickname')
) ?>

Пошаманим теперь со страницей вывода информации об авторе (view.php):

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'title',
        'anons:ntext',
        'content:ntext',
        'category_id',
        'author_id',
        'publish_status',
        'publish_date',
    ],
]) ?>

Меняем на следующий виджет:

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'title',
        'anons:ntext',
        'content:ntext',
        'category.title',
        'author.nickname',
        'publish_status',
        'publish_date',
    ],
]) ?>

Для того, что бы на странице со списком объектов в таблице вместо идентификаторов отображались значения отредактируем GridView::widget в файле index.php

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        'id',
        'title',
        'anons:ntext',
        'content:ntext',
        'category.title',
        'author.nickname',
        'publish_status',
        'publish_date',

        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>