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',
],
//这部分和上面的分页是一样的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。