@phpForeve

Yii2. Как реализовать пагинацию?

У меня есть список Новостей. Для их отображения я использую виджет. Прикрутил к странице пагинацию, а она не работает. Если отображать записи на страницу циклом, все хорошо. А вот через виджет не получается...

Код экшена в контроллере
public function actionIndex()
    {
        /*Загрузка новостей*/
        $query = News::find();

        $pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 10, 'pageSizeParam' => false]);
        $newsList = $query->offset($pages->offset)->limit($pages->limit)->orderBy('created_at DESC')->all();

        return $this->render('index', compact('newsList', 'pages'));
    }


Код представления

<?php

use yii\helpers\Html;

$this->title = Yii::t('news', 'title');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="news-index container">

    <h1><?= Html::encode($this->title) ?></h1>
    <?php // echo $this->render('_search', ['model' => $searchModel]); ?>

    <p>
        <?= Html::a(Yii::t('news', 'btn_create'), ['create'], ['class' => 'btn btn-success']) ?>
    </p>

    <?= \app\components\MainViewWidget::widget(['template' => 'news-block-list', 'data' => $newsList]) ?>

<div class="row"><?php LinkPager::widget(['pagination' => $pages]) ?></div>
</div>


Код виджета, который отвечает за отображение новостей

namespace app\components;
use yii\base\Widget;
use yii\widgets\LinkPager;

class MainViewWidget extends Widget
{

    public $template;
    public $data;
    public $pages;
    public $viewHtml;

    //Инициальзация виджета. Если не передан шаблон, используем block-list
    public function init(){
        parent::init();
        if ($this->template === null) {
            $this->template = 'blocks-list';
        }
        $this->template .= '.php';
    }

    //Запуск виджета
    public function run(){
        $this->viewHtml = $this->getMainViewHtml($this->data);
        return $this->viewHtml;
    }

    //Отправляем данные в шаблон
    protected function getMainViewHtml($data){
        $str = '';
        foreach ($data as $item){
            $str .= $this->catToTemplate($item);
        }
        return $str;
    }

    //Подключаем нужный шаблон
    protected function catToTemplate($items){
        ob_start();
        include __DIR__ . '/template/mainView/' . $this->template;
        return ob_get_clean();
    }

}


Шаблон виджета

<div class="row">
    <div id="news-block-<?= $items->id ?>" class="col-lg-12 news-block-one">
        <h3><a href=""><?= $items->title ?></a></h3>
        <div class="news-content max-news-content" id = "news-content-<?= $items->id ?>">
            <p><?= $items->content ?></p>
        </div>

        <div class="news-action">
            <span><i class="fa fa-clock-o" aria-hidden="true"></i> <?= Yii::$app->formatter->asDatetime($items->publish_at, "php:d.m.Y / H:i"); ?> </span>
        </div>
    </div>
</div>
  • Вопрос задан
  • 1083 просмотра
Решения вопроса 1
@karminski
Senior React.JS Developer
Меняем строку
<div class="row"><?php LinkPager::widget(['pagination' => $pages]) ?></div>

на
<div class="row"><?= LinkPager::widget(['pagination' => $pages]) ?></div>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@miserenkov
Middle PHP Developer
Используйте ActiveDataProvider для получения новостей www.yiiframework.com/doc-2.0/yii-data-activedatapr...
А для отображения новостей на странице используйте www.yiiframework.com/doc-2.0/yii-widgets-listview.html
Получится тоже самое, но намного проще.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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