« 上一篇 下一篇 »

GII生成代码进行分页​

刚刚体会了GII生成代码的神奇和强大就又面临了一个严峻的问题就是分页问题

以下是GII生成的一个控制器方法的代码

public function actionIndex()
    {
        $searchModel = new CountrySearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        
        return $this->render('index', [
            'searchModel'  => $searchModel,
            'dataProvider' => $dataProvider,
            
        ]);
    }

生成的视图部分

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

    <p>
        <?= Html::a('新建国家', ['create'], ['class' => 'btn btn-success']) ?>
        <!-- 建立一个a连接,第一个参数为连接名称,第二个为连接方法(数组),第三个参数(数组)类名 -->
    </p>
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            'code',
            'name',
            'population',
        ],
    ]); ?>

可以看到,在默认情况下是没有设置分页的,这样就会应用yii\data\Pagination 类下的$defaultPageSize进行分页,默认20

直接去修改这个值肯定是不合适的(其他地方可能需要用到不同条数的分页,还是需要设置)

而之前学到的分页代码和文档中的分页代码都是这样的

use yii\data\Pagination;
// build a DB query to get all articles with status = 1
$query = Article::find()->where(['status' => 1]);
// get the total number of articles (but do not fetch the article data yet)
$count = $query->count();
// create a pagination object with the total count
$pagination = new Pagination(['totalCount' => $count]);
// limit the query using the pagination and retrieve the articles
$articles = $query->offset($pagination->offset)
    ->limit($pagination->limit)
    ->all();

将分页和数据一同分配到视图,明显和GII生成的代码不一样啊,这样就没办法进行pagination的分配

经过摸索将$dataProvider打印出来的时候发现一个_pagination 属性

 ["_pagination":"yii\data\BaseDataProvider":private]=>
  NULL

打开yii\data\BaseDataProvider 发现确实有"_pagination"属性,但是是private类型的不能修改,但继续向下发现了setPagination()方法

需要参数$value

public function setPagination($value)
    {
        if (is_array($value)) {
            $config = ['class' => Pagination::className()];
            if ($this->id !== null) {
                $config['pageParam'] = $this->id . '-page';
                $config['pageSizeParam'] = $this->id . '-per-page';
            }
            $this->_pagination = Yii::createObject(array_merge($config, $value));
        } elseif ($value instanceof Pagination || $value === false) {
            $this->_pagination = $value;
        } else {
            throw new InvalidParamException('Only Pagination instance, configuration array or false is allowed.');
        }
    }

$value 类型需要为数组、对象实例、或者是false

查了文档也没有给出数组的结构或者属性,而false显然是不能达成自定义赋值的

只能通过传入一个Pagination实例来实现

So 就有了下边的代码

$pagination = new Pagination();
$pagination->defaultPageSize=5;
$dataProvider->setPagination($pagination);

三行代码插入上面的actionIndex方法,大功告成


$KYBJ(G({37R$FQ[WCLHUAU.png