yii框架-yii2分页的使用与扩展(十五)
今天主要是总结一下如何使用yii2中分页功能,从下面三个方面来讲。
(1)分页的使用
(2)分页类LinkPager和Pagination都可以自定义哪些属性
(3)分页类LinkPager如何扩展成我们所需要的
一、分页的使用
(1)Pagination类可以分辨单独使用。也即是和model分离。
例如在controller 的action中:
use yiidataPagination;
$query = Article::find()->where(["status" => 1]);
$countQuery = clone $query;
//分页实例对象,必须要设置totalCount
$pages = new Pagination(["totalCount" => $countQuery->count()]);
//数据模型
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
//分别返回对象
return $this->render("index", [
"models" => $models,
"pages" => $pages,
]);
那么在view中:
use yiiwidgetsLinkPager;
//循环展示数据
foreach ($models as $model) {
// ......
}
//显示分页页码
echo LinkPager::widget([
"pagination" => $pages,
$provider = new ActiveDataProvider([
"query" => $query,
"pagination" => [
"pageSize" => 5,
],
]);
那么在view就可以直接用yiigridGridView,配置pager属性
<?= GridView::widget([
"id" => "grid",
"dataProvider" => $dataProvider,
"layout" => "{items}{pager}",
"showFooter" => false,
"caption" => "注册用户",
"captionOptions" => [
"data" => ["id" => 1, "name" => "yii"],
"style" => ["text-align" => "center"]
],
"pager" =>[
"class" => GoPager::className(),
"firstPageLabel" => "首页",
"prevPageLabel" => "《",
"nextPageLabel" => "》",
"lastPageLabel" => "尾页",
"goPageLabel" => true,
"totalPageLable" => "共x页",
"goButtonLable" => "GO",
"maxButtonCount" => 5
首先我们说说LinkPager组件
pagination参数必填,这个是我们Pagination类的实例,返回的$pages.
默认的分页样式

"nextPageLabel" => "下一页",
"prevPageLabel" => "上一页",
]); ?>
如果你不想要显示上下页,可以将prevPageLabel和nextPageLabel设置为false
<?= LinkPager::widget([
"pagination" => $pages,
"nextPageLabel" => false,
"prevPageLabel" => false,
]);
<?= LinkPager::widget([
"pagination" => $pages,
"firstPageLabel" => "首页",
"lastPageLabel" => "尾页",
]);
<?= LinkPager::widget([
"pagination" => $pages,
"hideOnSinglePage" => false,
]);
?>
默认显示的页码为10页,可以设置maxButtonCount为你想要展示的页数
"maxButtonCount" => 5,
]);
?>
有些人不喜欢默认的样式,想要分页带上自己的样式,可以设置options,不要忘了自行实现pre,next,disabled等样式
"options" => ["class" => "m-pagination"],
]);
?>
接下来我们谈谈Pagination组件
默认的分页路由是下面这样子的,我们看看能做点什么
/controller/action?page=2&per-page=20
首先,我们是必须要指定总条数totalCount的,没这个参数,分页也是没办法实现的
$pages = new Pagination([
"totalCount" => $totalCount,
$pages = new Pagination([
"totalCount" => $totalCount,
"pageSize" => 5,
]);
从上面的分页路由我们可以看到,默认带的有每页的数量per-page 如果你不想显示该参数,设置pageSizeParam=false就好
$pages = new Pagination([
"totalCount" => $totalCount,
"pageSizeParam" => false,
$pages = new Pagination([
"totalCount" => $totalCount,
"pageParam" => "p",
$pages = new Pagination([
"totalCount" => $totalCount,
"route" => false,
]);
可能你会发现分页类Pagination有一个bug,假如我们只有1页的数据,但是手动更改地址栏的page=20的时候,也会显示page=1的数据?当然,这在大部分接口API中就很让人厌烦。但是,这并非bug,而是一种友好的验证。设置validatePage=false即可避免掉该问题
$pages = new Pagination([
"totalCount" => $totalCount,
"validatePage" => false,
]);
接下来我们研究一下如何扩展自己分分页样式,变成如下样式

主要是重写run()和renderPageButtons()两个方法
代码如下:
单独使用具体用法:
GoPager::widget([
"firstPageLabel" => "首页",
"prevPageLabel" => "《",
"nextPageLabel" => "》",
"lastPageLabel" => "尾页",
"goPageLabel" => true,
"totalPageLable" => "共x页",
"goButtonLable" => "GO",
"maxButtonCount" => 5
.....
]);
如果是结合yiigridGridView使用,配置pager的属性:
<?= GridView::widget([
....
"pager" =>[
"class" => GoPager::className(),
"firstPageLabel" => "首页",
"prevPageLabel" => "《",
"nextPageLabel" => "》",
"lastPageLabel" => "尾页",
"goPageLabel" => true,
"totalPageLable" => "共x页",
"goButtonLable" => "GO",
"maxButtonCount" => 5
],
(1)分页的使用
(2)分页类LinkPager和Pagination都可以自定义哪些属性
(3)分页类LinkPager如何扩展成我们所需要的
一、分页的使用
(1)Pagination类可以分辨单独使用。也即是和model分离。
例如在controller 的action中:
use yiidataPagination;
$query = Article::find()->where(["status" => 1]);
$countQuery = clone $query;
//分页实例对象,必须要设置totalCount
$pages = new Pagination(["totalCount" => $countQuery->count()]);
//数据模型
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
//分别返回对象
return $this->render("index", [
"models" => $models,
"pages" => $pages,
]);
那么在view中:
use yiiwidgetsLinkPager;
//循环展示数据
foreach ($models as $model) {
// ......
}
//显示分页页码
echo LinkPager::widget([
"pagination" => $pages,
])
$provider = new ActiveDataProvider([
"query" => $query,
"pagination" => [
"pageSize" => 5,
],
]);
那么在view就可以直接用yiigridGridView,配置pager属性
<?= GridView::widget([
"id" => "grid",
"dataProvider" => $dataProvider,
"layout" => "{items}{pager}",
"showFooter" => false,
"caption" => "注册用户",
"captionOptions" => [
"data" => ["id" => 1, "name" => "yii"],
"style" => ["text-align" => "center"]
],
"pager" =>[
"class" => GoPager::className(),
"firstPageLabel" => "首页",
"prevPageLabel" => "《",
"nextPageLabel" => "》",
"lastPageLabel" => "尾页",
"goPageLabel" => true,
"totalPageLable" => "共x页",
"goButtonLable" => "GO",
"maxButtonCount" => 5
]
首先我们说说LinkPager组件
pagination参数必填,这个是我们Pagination类的实例,返回的$pages.
默认的分页样式
默认页数按钮显示10个。
<?= LinkPager::widget([
"pagination" => $pages,"nextPageLabel" => "下一页",
"prevPageLabel" => "上一页",
]); ?>
如果你不想要显示上下页,可以将prevPageLabel和nextPageLabel设置为false
<?= LinkPager::widget([
"pagination" => $pages,
"nextPageLabel" => false,
"prevPageLabel" => false,
]);
?>
<?= LinkPager::widget([
"pagination" => $pages,
"firstPageLabel" => "首页",
"lastPageLabel" => "尾页",
]);
?>
<?= LinkPager::widget([
"pagination" => $pages,
"hideOnSinglePage" => false,
]);
?>
默认显示的页码为10页,可以设置maxButtonCount为你想要展示的页数
<?= LinkPager::widget([
"pagination" => $pages,"maxButtonCount" => 5,
]);
?>
有些人不喜欢默认的样式,想要分页带上自己的样式,可以设置options,不要忘了自行实现pre,next,disabled等样式
<?= LinkPager::widget([
"pagination" => $pages,"options" => ["class" => "m-pagination"],
]);
?>
接下来我们谈谈Pagination组件
默认的分页路由是下面这样子的,我们看看能做点什么
/controller/action?page=2&per-page=20
首先,我们是必须要指定总条数totalCount的,没这个参数,分页也是没办法实现的
$pages = new Pagination([
"totalCount" => $totalCount,
]);
$pages = new Pagination([
"totalCount" => $totalCount,
"pageSize" => 5,
]);
从上面的分页路由我们可以看到,默认带的有每页的数量per-page 如果你不想显示该参数,设置pageSizeParam=false就好
$pages = new Pagination([
"totalCount" => $totalCount,
"pageSizeParam" => false,
]);
$pages = new Pagination([
"totalCount" => $totalCount,
"pageParam" => "p",
]);
$pages = new Pagination([
"totalCount" => $totalCount,
"route" => false,
]);
可能你会发现分页类Pagination有一个bug,假如我们只有1页的数据,但是手动更改地址栏的page=20的时候,也会显示page=1的数据?当然,这在大部分接口API中就很让人厌烦。但是,这并非bug,而是一种友好的验证。设置validatePage=false即可避免掉该问题
$pages = new Pagination([
"totalCount" => $totalCount,
"validatePage" => false,
]);
接下来我们研究一下如何扩展自己分分页样式,变成如下样式
主要是重写run()和renderPageButtons()两个方法
代码如下:
namespace appcomponent; use yiiwidgetsLinkPager; use yiihelpersHtml; class GoPager extends LinkPager { /** *@var boole|string. weather show totalPage *You can do not set the property by using defult,so the totalPage button not show in the html. *if you set it as string,eg: totalPageLable => "共x页".note that the "x" will be replaced by $pageCount.so the "x" must be seted. */ public $totalPageLable = false; /** *@var boole if is seted true,the goPageLabel can be show in the html. * */ public $goPageLabel = false; /** *@var array.options about the goPageLabel(input) *goPageLabelOptions => [ * "class" => * "data-num" => * "style" => * ] * */ public $goPageLabelOptions = []; /** *@var boole | string. weather show in go page button * */ public $goButtonLable = false; /** *@var array.options about the goButton * */ public $goButtonLableOptions = []; /** * **/ public function init() { parent::init(); } public function run() { if ($this->registerLinkTags) { $this->registerLinkTags(); } echo $this->renderPageButtons(); } protected function renderPageButtons() { $pageCount = $this->pagination->getPageCount(); if ($pageCount < 2 && $this->hideOnSinglePage) { return ""; } $buttons = []; $currentPage = $this->pagination->getPage(); // first page $firstPageLabel = $this->firstPageLabel === true ? "1" : $this->firstPageLabel; if ($firstPageLabel !== false) { $buttons[] = $this->renderPageButton($firstPageLabel, 0, $this->firstPageCssClass, $currentPage <= 0, false); } // prev page if ($this->prevPageLabel !== false) { if (($page = $currentPage - 1) < 0) { $page = 0; } $buttons[] = $this->renderPageButton($this->prevPageLabel, $page, $this->prevPageCssClass, $currentPage <= 0, false); } // internal pages list($beginPage, $endPage) = $this->getPageRange(); for ($i = $beginPage; $i <= $endPage; ++$i) { $buttons[] = $this->renderPageButton($i + 1, $i, null, false, $i == $currentPage); } // next page if ($this->nextPageLabel !== false) { if (($page = $currentPage + 1) >= $pageCount - 1) { $page = $pageCount - 1; } $buttons[] = $this->renderPageButton($this->nextPageLabel, $page, $this->nextPageCssClass, $currentPage >= $pageCount - 1, false); } // last page $lastPageLabel = $this->lastPageLabel === true ? $pageCount : $this->lastPageLabel; if ($lastPageLabel !== false) { $buttons[] = $this->renderPageButton($lastPageLabel, $pageCount - 1, $this->lastPageCssClass, $currentPage >= $pageCount - 1, false); } // total page if ($this->totalPageLable) { $buttons[] = Html::tag("li",Html::a(str_replace("x",$pageCount,$this->totalPageLable),"javascript:return false;",[]),[]); } //gopage if ($this->goPageLabel) { $input = Html::input("number",$this->pagination->pageParam,$currentPage+1,array_merge([ "min" => 1, "max" => $pageCount, "style" => "height:34px;width:80px;display:inline-block;margin:0 3px 0 3px", "class" => "form-control", ],$this->goPageLabelOptions)); $buttons[] = Html::tag("li",$input,[]); } // gobuttonlink if ($this->goPageLabel) { $buttons[] = Html::submitInput($this->goButtonLable ? $this->goButtonLable : "跳转",array_merge([ "style" => "height:34px;display:inline-block;", "class" => "btn btn-primary" ],$this->goButtonLableOptions)); } $ul = Html::tag("ul", implode(" ", $buttons), $this->options); return Html::tag("form",$ul,[]); } }
单独使用具体用法:
GoPager::widget([
"firstPageLabel" => "首页",
"prevPageLabel" => "《",
"nextPageLabel" => "》",
"lastPageLabel" => "尾页",
"goPageLabel" => true,
"totalPageLable" => "共x页",
"goButtonLable" => "GO",
"maxButtonCount" => 5
.....
]);
如果是结合yiigridGridView使用,配置pager的属性:
<?= GridView::widget([
....
"pager" =>[
"class" => GoPager::className(),
"firstPageLabel" => "首页",
"prevPageLabel" => "《",
"nextPageLabel" => "》",
"lastPageLabel" => "尾页",
"goPageLabel" => true,
"totalPageLable" => "共x页",
"goButtonLable" => "GO",
"maxButtonCount" => 5
],
]);
友情推荐
本人已开源基于swoole扩展实现的轻量级框架
https://github.com/bingcool/swoolefy
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: PHP扩展开发
- 下一篇: Yii 直接执行SQL语句的几种使用方法