Yii2 создание блога (Часть 5 – вывод постов и категорий)

Пришло время вывести список постов и непосредственно сами посты на просмотр. Моделью постов предусмотрен статус публикации постов. Для того, что бы выводились посты только со статусом опубликовано, вносим изменения в модель постов.

/**
 * Возвращает опубликованные посты
 * @return ActiveDataProvider
 */
function getPublishedPosts()
{
    return new ActiveDataProvider([
        'query' => Post::find()
            ->where(['publish_status' => self::STATUS_PUBLISH])
    ]);
}

И добавляем шаблоны для вывода списка постов, короткой и полной новости.

Список постов:

$this->title = 'Посты';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="col-sm-8 post-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <?php
    foreach ($dataProvider->models as $model) {
        echo $this->render('shortView', [
            'model' => $model
        ]);
    }
    ?>

</div>

<div class="col-sm-3 col-sm-offset-1 blog-sidebar">
    <h1>Категории</h1>
</div>

Короткая новость:

<h1><?= $model->title ?></h1>

div class="meta">
    <p>Автор: <?= $model->author->username ?> Дата публикации: <?= $model->publish_date ?> Категория: <?= $model->category->title ?></p>
</div>

<div class="content">
    <?= $model->anons ?>
</div>

Полная новость:

<h1><?= $model->title ?></h1>

<div class="meta">
    <p>Автор: <?= $model->author->username ?> Дата публикации: <?= $model->publish_date ?> Категория: <?= $model->category->title ?></p>
</div>

<div class="content">
    <?= $model->anons ?>
</div>

<?= Html::a('Читать далее', ['view', 'id' => $model->id], ['class' => 'btn btn-success']) ?>

Для вывода категорий воспользуемся циклом, предыдущий шаблон примет вид:

<div class="col-sm-3 col-sm-offset-1 blog-sidebar">
    <h1>Категории</h1>
    <ul>
    <?php
    foreach ($categories->models as $category) {
        echo $this->render('//category/shortViewCategory', [
            'model' => $category
        ]);
    }
    ?>
    </ul>
</div>

В $this->render первым параметром передаётся путь к шаблону: ‘//category/shortViewCategory’. Путь начинается с двойного слыша, это alias к корню директории хранящей шаблоны.

Шаблон shortViewCategory очень прост:

<li><?= \yii\helpers\Html::a($model->title, ['category/index', 'id' => $model->id])?></li>

Для того, что бы выбрать все опубликованные посты относящиеся к категории в модель категории добавляем метод:

/**
 * Возвращает список постов принадлежащих категории.
 * @return ActiveDataProvider
 */
public function getPosts()
{
    return new ActiveDataProvider([
        'query' => $this->hasMany(Post::className(), ['category_id' => 'id'])
        ->where([
            'publish_status' => Post::STATUS_PUBLISH
        ])
    ]);
}

А контролер отображения списка постов в категории примет вид:

public function actionIndex($id)
{
    $category = Category::findOne(['id' => $id]);

    return $this->render('index', [
        'category' => $category->getCategory($id),
        'posts' => $category->getPosts($id),
        'categories' => $category->getCategories()
    ]);
}

Полностью исходный код можно посмотреть на GitHub: https://github.com/Georgynet/Blog-Yii2