Каким образом вывести пагинацию?

Приветствую.

Подскажите, пожалуйста, каким образом вывести пагинацию на странице?

Имеется модель категорий, связанная с моделью постов:

public function getPost()
{
    return $this->hasMany(Post::className(), ['category_id' => 'id'])
        ->select(['id', 'title', 'category_id', 'alias', 'content', 'img_preview', 'date_create'])
        ->with(['categories', 'tags'])
        ->orderBy(['date_create' => SORT_DESC])
        ->where(['post.status' => 'on']);
}


В контроллере получаю категорию со связанными постами (нужно вывести все посты с переданной категорией):
public function actionView($alias)
{
    $alias = Html::encode($alias);

    $query = Category::find()
        ->where(['alias' => $alias])
        ->with('post');

    $pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 1, 'forcePageParam' => false, 'pageSizeParam' => false]);

    $all_articles = $query->offset($pages->offset)->limit($pages->limit)->one();


    if (empty($all_articles)) {
        throw new HttpException(404);
    }

    return $this->render('view', [
        'all_articles' => $all_articles,
        'pages' => $pages
    ]);


View вывода пагинации:

<?php echo yii\bootstrap4\LinkPager::widget([
    'pagination' => $pages,
    'nextPageLabel' => 'Next page',
    'prevPageLabel' => 'Previous page',
]) ?>


Объект all_articles выглядит вот так примерно: 5d4d80d1ea790786523358.png

Сейчас пагинация считается по категориям, не по постам. Каким образом получить пагинацию по постам и вывести её в виде?
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Вам надо использовать dataProvider.
Запрос может выглядеть так
/* получаем категории */
        $query = Catalog::find()
           /* настраиваем псевдоним таблицы */
            ->from(['catalog' => Catalog::tableName()])
           /* категории с статусом "активна" */
            ->where(['catalog.status' => Catalog::STATUS_ACTIVE])
           /* подключаем связь */
            ->with(['products'])
          /* получаем данные по продукции для выбранной категории */
          /* возможно нужно будет использовать joinWith() */
            ->joinWith([
                'products prod' => function(ActiveQuery $query){
                    $query->andOnCondition(['prod.status' => Products::STATUS_ACTIVE]);
                }
            ]);

        $dataProvider = new ActiveDataProvider([
            'query' => $query
        ]);

Связь "products" может выглядеть так
public function getProducts()
    {
        return $this->hasMany(Products::class,['id' => 'product_id'])->viaTable('{{%products_categories}}', ['category_id' => 'id']);
    }

$dataProvider используете в виджете ListView() и получаете нужную постраничную навигацию.

Рекомендую просмотреть данное видео, в нём подробно рассказано о работе со связными моделями.

p.s. Это только пример, Вам надо будет подработать его под свои нужды.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise
Solutions Architect, AWS Certified, Hybrid Cloud
А можно не жевать себе мозг и использовать ActiveDataProvider в комбинации с удобным для себя способом вывода: GridView, ListView, ...
Ответ написан
@Wekly123
Хорошо знаю Yii2
Мой вариант:
1) Создаёшь дата провайдер и запихиваешь в него свой запрос
2) Выводишь список постов(или чего у тебя там) с помощью ListView
3) Выводишь ниже LinkPager и кидаешь $dataProvider->getPagination()

А вообще желательно бы создать сервис и репозиторий и не класть логику в контроллер, но это на твоё усмотрение

Если понравился вариант, можешь спросить что не понятно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы