yii2实现分页,带搜索的分页功能示例
一、模型配置
事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。
1.文章表关联
<?php //...othercode //关联 publicfunctiongetCate(){ return$this->hasOne(ArticleCate::className(),['id'=>'cid']); } ?>
2.搜索模型
common/models/search/创建ArticleSearch.php
<?php namespacecommon\models\search; useYii; useyii\base\Model; useyii\data\ActiveDataProvider; usecommon\models\Article; classArticleSearchextendsArticle { //public$cname;//文章类别名 /** *@inheritdoc */ publicfunctionrules() { return[ [['cid','created_at','updated_at'],'integer'], [['id','desc','title','cover','content'],'safe'], ]; } /** *@inheritdoc */ publicfunctionscenarios() { //bypassscenarios()implementationintheparentclass returnModel::scenarios(); } //搜索 publicfunctionsearch($params) { $query=Article::find(); //$query->joinWith(['cate']);//关联文章类别表 //$query->joinWith(['author'=>function($query){$query->from(['author'=>'users']);}]); $dataProvider=newActiveDataProvider([ 'query'=>$query, 'pagination'=>[ 'pageSize'=>2, ], ]); //从参数的数据中加载过滤条件,并验证 $this->load($params); if(!$this->validate()){ //uncommentthefollowinglineifyoudonotwanttoanyrecordswhenvalidationfails //$query->where('0=1'); return$dataProvider; } //增加过滤条件来调整查询对象 $query->andFilterWhere([ //'cname'=>$this->cate.cname, 'title'=>$this->title, ]); $query->andFilterWhere(['like','title',$this->title]); //$query->andFilterWhere(['like','cate.cname',$this->cname]); return$dataProvider; } }
二、分页使用
方式一
首先在控制器的动作中,创建分页对象并且为其填充数据:
<?php //othercode useyii\data\Pagination; publicfunctionactionArticlelist() { //分页读取类别数据 $model=Article::find()->with('cate'); $pagination=newPagination([ 'defaultPageSize'=>3, 'totalCount'=>$model->count(), ]); $model=$model->orderBy('idASC') ->offset($pagination->offset) ->limit($pagination->limit) ->all(); return$this->render('index',[ 'model'=>$model, 'pagination'=>$pagination, ]); } ?>
其次在视图中我们输出的模板为当前页并通过分页对象链接到该页:
<?php useyii\widgets\LinkPager; useyii\helpers\Html; useyii\helpers\Url; //othercode foreach($modelsas$model){ //在这里显示$model } //显示分页 echoLinkPager::widget([ 'pagination'=>$pagination, 'firstPageLabel'=>"First", 'prevPageLabel'=>'Prev', 'nextPageLabel'=>'Next', 'lastPageLabel'=>'Last', ]); ?>
方式二
控制器:
<?php $query=Article::find()->with('cate'); $provider=newActiveDataProvider([ 'query'=>$query, 'pagination'=>[ 'pageSize'=>3, ], 'sort'=>[ 'defaultOrder'=>[ //'created_at'=>SORT_DESC, //'title'=>SORT_ASC, ] ], ]); return$this->render('index',[ 'model'=>$query, 'dataProvider'=>$provider ]); ?>
视图:
<?php useyii\grid\GridView; echoGridView::widget([ 'dataProvider'=>$dataProvider, //每列都有搜索框控制器传过来$searchModel=newArticleSearch(); //'filterModel'=>$searchModel, 'layout'=>'{items}<divclass="text-righttooltip-demo">{pager}</div>', 'pager'=>[ //'options'=>['class'=>'hidden']//关闭自带分页 'firstPageLabel'=>"First", 'prevPageLabel'=>'Prev', 'nextPageLabel'=>'Next', 'lastPageLabel'=>'Last', ], 'columns'=>[ //['class'=>'yii\grid\SerialColumn'],//序列号从1开始 //数据提供者中所含数据所定义的简单的列 //使用的是模型的列的数据 'id', 'username', ['label'=>'文章类别',/*'attribute'=>'cid',产生一个a标签,点击可排序*/'value'=>'cate.cname'], ['label'=>'发布日期','format'=>['date','php:Y-m-d'],'value'=>'created_at'], //更复杂的列数据 ['label'=>'封面图','format'=>'raw','value'=>function($m){ returnHtml::img($m->cover,['class'=>'img-circle','width'=>30]); }], [ 'class'=>'yii\grid\DataColumn',//由于是默认类型,可以省略 'value'=>function($data){ return$data->name; //如果是数组数据则为$data['name'],例如,使用 SqlDataProvider的情形。 }, ], [ 'class'=>'yii\grid\ActionColumn', 'header'=>'操作', 'template'=>'{delete}{update}',//只需要展示删除和更新 /*'headerOptions'=>['width'=>'80'],*/ 'buttons'=>[ 'delete'=>function($url,$model,$key){ returnHtml::a('<iclass="glyphiconglyphicon-trash"></i>删除', ['artdel','id'=>$key], ['class'=>'btnbtn-defaultbtn-xs', 'data'=>['confirm'=>'你确定要删除文章吗?',] ]); }, 'update'=>function($url,$model,$key){ returnHtml::a('<iclass="fafa-file"></i>更新', ['artedit','id'=>$key], ['class'=>'btnbtn-defaultbtn-xs']); }, ], ], ], ]); ?>
三、搜索带分页功能
- 创建搜索模型(前面己做)
- 控制传入数据
- 视图显示控制器代码:
<?php publicfunctionactionIndex() { $searchModel=newArticleSearch(); $dataProvider=$searchModel->search(Yii::$app->request->queryParams); return$this->render('index',[ 'searchModel'=>$searchModel, 'dataProvider'=>$dataProvider, ]); } ?>
视图:
<?php$form=ActiveForm::begin([ 'action'=>['index'], 'method'=>'get', 'id'=>'cateadd-form', 'options'=>['class'=>'form-horizontal'], ]);?> <?=$form->field($searchModel,'title',[ 'options'=>['class'=>''], 'inputOptions'=>['placeholder'=>'文章搜索','class'=>'input-smform-control'], ])->label(false)?> <?=Html::submitButton('Go!',['class'=>'btnbtn-smbtn-primary'])?> <?phpActiveForm::end();?> <?=GridView::widget([ 'dataProvider'=>$dataProvider, 'layout'=>'{items}<divclass="text-righttooltip-demo">{pager}</div>', 'pager'=>[ //'options'=>['class'=>'hidden']//关闭自带分页 'firstPageLabel'=>"First", 'prevPageLabel'=>'Prev', 'nextPageLabel'=>'Next', 'lastPageLabel'=>'Last', ], //这部分和上面的分页是一样的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。