【加例子】模板中使用分页的函数 + 24个分页样式
发布于:2022-01-17 09:50:54
#1 jake
这是spPager产生的分页数据在模板中显示的函数,使用方式已经简化,而且配合24个分页样式可以轻易做出漂亮的分页功能。
----------------
更新:已经加入了整套示范的例子代码。24分页效果例子代码.zip使用例子代码的时候:1. 导入压缩包中的guestbook.sql到数据库中。2. 配置index.php中speedphp框架的路径(压缩包内没有带框架)。3. 访问显示OK。
---------------
可以先打开压缩包看看“预览看看.html”文件,挺好的分页样式。看看图:用法:1. 在index.php内require(SP_PATH.'/SpeedPHP.php');require(压缩包内的functions.php文件);spRun();
2. 控制器内
// 某表的记录数务必在3条以上,否则没有分页效果$this->results = spClass('某表')->spPager($this->spArgs('p',1),2)->findAll();$this->pager = spClass('某表')->spPager()->getPager();
dump($this->results);
3. 模板内内引入CSS
4. 模板内显示分页,这里是yahoo2是其中一个样式名称,其他的样式名称直接看css文件<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数" ...}>下载:带模板函数实现的24个分页样式.rar
2010-06-17 18:03:04
#2 extinct
:L今天下午刚搞了个,没想到老大这里好东西真多
2010-06-17 18:08:47
#3 fenshenxia
一直关注 SpeedPHP 发展
2010-06-17 18:21:05
#4 emike
一直关注 SpeedPHP 发展
2010-06-18 09:36:22
#5 php
昨天刚把THINKPHP的分页搞过来,没想到Jake就发了专属分页函数···
2010-06-18 10:07:20
#6 zxczzz456
这个分页怎么用啊,我搞了好久都没搞好,哪位高人指教指教啊
2010-06-19 11:19:34
#7 jake
这个分页怎么用啊,我搞了好久都没搞好,哪位高人指教指教啊
zxczzz456 发表于 2010-6-19 11:19
你是怎么用的?有没有照上面说的步骤来做呢?页面如何显示呢?
2010-06-19 12:21:04
#8 zxczzz456
回复 7 jake 我原本分页是用
<{$thepage}>来显示的,可他把所有都显示了,不知道用<{pager pager=$pager myclass这个怎么写啊,麻烦下加QQ379539060
2010-06-19 12:50:10
#9 zxczzz456
我这样子写了显示不出来
<{pager pager=$pager myclass="grayr" c=admin_hotel a=index types=$types}>
2010-06-19 13:09:33
#10 xc1133250
没用啊....这个分页出不来
2010-06-19 14:37:52
#11 jake
没用啊....这个分页出不来
xc1133250 发表于 2010-6-19 14:37
上面的“用法”已经更新了,试试吧。
2010-06-19 21:56:32
#13 hkbaby
这个分页怎么用的啊 functions.php文件是放在框架和配置文件同级目录吗?
2010-07-06 15:12:37
#14 kingtalc
我页码显示不出来 页数是哪的问题?
2010-07-06 15:56:12
#15 kingtalc
{ pager pager=$pager myclass="yahoo2" c="product" a="listAll" }
这部分未输出任何东西...
2010-07-06 16:05:38
#17 hkbaby
function __template_pager(
$params) 这个$params值要从哪里来?
2010-07-07 09:11:56
#18 jake
function __template_pager($params) 这个$params值要从哪里来?
hkbaby 发表于 2010-7-7 09:11
<{pager
c=main a=index pager=$pager}>红色部分都是$params的值
2010-07-07 09:58:46
#19 hkbaby
哦 谢谢jake{:3_52:} 这个我明白了 还有myclass="yahoo2"这个也是$params的值
2010-07-07 10:28:19
#20 project
import(APP_PATH.'/functions.php');
spRun();这个是什么意思啊 怎么这地方报错呢?
这 Fatal error: Call to undefined function spRun() in
2010-07-07 14:45:02
#21 azwl
回复 1 jake 对分页函数修改了一下,原因有:
1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。
2。把循环中的判断语句移到循环外面,提高执行效率。
3。调整$offset的默认值为4(原来为200)
spAddViewFunction('pager', '__template_pager');
function __template_pager($params){
if(!isset($params['pager']) || empty($params['pager']))return '';
$args = array();
foreach($params as $k => $v)if(!in_array($k, array('c', 'a', 'pager', 'myclass', 'mypage', 'offset')))$args[$k] = $v;
$pagerhandle = isset($params['pager']['mypage']) ? $params['pager']['mypage'] : 'p';
$html = "";
$curpage = $params['pager']['current_page'];
$totalpage = $params['pager']['total_page'];
// 第一页
if($curpage != $params['pager']['first_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['first_page']));
$html .= "
首页";
}
// 前页
if($curpage != $params['pager']['prev_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['prev_page']));
$html .= "
前页";
}
// 中间数字页
$offset = $params['offset'] ? $params['offset'] : 4;
// 当前页的左右偏移值,默认为左右各4个页面。可以在<{pager}>内用offset=x来调整
$startpage = 1;
$endpage = $offset * 2 + 1;
if ($curpage > $offset){
$startpage = $curpage - $offset;
$endpage = $curpage + $offset;
}
if ($endpage > $totalpage){
$startpage = $totalpage - $offset * 2;
$endpage = $totalpage;
}
if ($startpage < 1) $startpage = 1;
for($p = $startpage;$p <= $endpage;$p++){
if($p == $curpage){
$html .= "
{$p}";
}else{
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
$html .= "
{$p}";
}
}
// 下一页
if($curpage != $params['pager']['next_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['next_page']));
$html .= "
下页";
}
// 最后一页
if($curpage != $params['pager']['last_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['last_page']));
$html .= "
末页";
}
$html .= '
';
return $html;
}
?>
2010-07-08 10:42:43
#22 jake
1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。
一般都是这样显示的,看看dz论坛的页码就知道了
2。把循环中的判断语句移到循环外面,提高执行效率。
没能看出来
3。调整$offset的默认值为4(原来为200)
原来的200是默认的情况不做偏移效果,毕竟偏移效果也不一定每个地方都要用到。
2010-07-08 11:33:07
#23 azwl
1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。
一般都是这样显示的,看 ...
jake 发表于 2010-7-8 11:33
1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。
一般都是这样显示的,看看dz论坛的页码就知道了
------》当然这个都是个人喜好。我只是我要是觉得两头只显示$offset页,而当前页在中间是显示$offset*2页,不太一致而已。
2。把循环中的判断语句移到循环外面,提高执行效率。
没能看出来
------》如果共有1000页,就要循环1000次而且在循环中要判断1000次,移到外面后循环次数最多执行$offset*2+1次且循环中不用判断。
3。调整$offset的默认值为4(原来为200)
原来的200是默认的情况不做偏移效果,毕竟偏移效果也不一定每个地方都要用到。
------》这个么。既然是做分页,一般就要用到偏移,总不会把所有页都显示在页面上吧。是否是我的理解有偏移:-)
2010-07-08 14:05:41
#24 jake
性能这块你说对了!的确先判断再循环是能够减少循环次数,虽然这种循环耗费不了资源,不过精准来说,还是能减少则需要减少。
这里建议azwl把你的代码替换了我发的那个例子,然后再发上来给大家共享共享吧(然后我改主贴),:handshake
2010-07-08 15:35:23
#25 hkbaby
为了美观我也该了下functions.php
spAddViewFunction('pager', '__template_pager'); //spAddViewFunction()将__template_pager注册到模板内使用,模板内通过pager可以调用该函数/方法
function __template_pager($params)
{
if( !isset($params['pager']) || empty($params['pager']) )return '';
$args = array();
foreach( $params as $k => $v )if( !in_array($k, array('c','a','pager','myclass','mypage','offset')) )$args[$k] = $v;
$pagerhandle = isset($params['pager']['mypage']) ? $params['pager']['mypage'] : 'page';
$html = "";
if( $params['pager']['current_page'] != $params['pager']['first_page'] )
{
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['first_page']));
$html .= "
首页";
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['prev_page']));
$html .= "
上一页";
}else{
$html .= "
首页";
$html .= "
上一页";
}
$pagesize = $params[pager][page_size]; //页容量
$page = $params[pager][current_page]; // 当前页
$total = $params[pager][total_count]; //总条数
$totalpage = $params[pager][total_page]; //总分页
$init = $params['pager']['first_page'];//起始页码数
$max = $totalpage;//结束页码数
$pagelen = $params[pager][page_size]; //显示页码长度
$pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量
//分页数大于页码个数时可以偏移
if($totalpage > $pagelen)
{
//如果当前页小于等于左偏移
if($params[pager][current_page] <= $pageoffset)
{
$init = $params['pager']['first_page'];
$max = $pagelen;
}
else
{//如果当前页大于左偏移
//如果当前页码右偏移超出最大分页数
if($params[pager][current_page] + $pageoffset >= $totalpage + 1)
$init = $totalpage-$pagelen+1;
else
{
//左右偏移都存在时的计算
$init = $params[pager][current_page] - $pageoffset;
$max = $params[pager][current_page] + $pageoffset;
}
}
}
//循环页码
for($i = $init;$i <= $max;$i++)
{
if($i == $page)
$html.= '
'.$i.'';
else
{
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $i));
$html.= "
$i";
}
}
if( $params['pager']['current_page'] != $params['pager']['last_page'] ){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['next_page']));
$html .= "
下一页";
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['last_page']));
$html .= "
尾页";
}else{
$html .= "
下一页";
$html .= "
尾页";
}
$html .="
第{$params[pager][current_page]}页";
$html .="
共{$params[pager][total_page]}页";
$html .= '
';
return $html;
}
有哪里不足之处,请大家给我说下
2010-07-08 15:56:58
#26 jake
$pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量
offset的值应该可以设置才对吧?不然页码也多偏移就越大,但是不能灵活地符合页面本身显示的长度啊
2010-07-08 17:46:01
#27 hkbaby
噢 , 那我这里在设置一下
呵呵
2010-07-09 08:37:43
#28 billgame
呵呵。这里的老大经常来回复啊,不错。
2010-07-27 23:40:58
#29 vsxp
支持,不错的。
2010-07-29 09:34:58
#30 solo
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数" ...}>
如果参数不是固定的怎么办?比如分类搜索,有时是一个参数,有时是多个参数组合。怎么能把$_GET的参数带到分页里呢?
2010-08-11 10:49:10
#31 jake
如果参数不是固定的怎么办?比如分类搜索,有时是一个参数,有时是多个参数组合。怎么能把$_GET的参数带 ...
solo 发表于 2010-8-11 10:49
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数" arg2="第二个参数" arg3="第三个参数"...}>
2010-08-11 12:09:34
#32 solo
jake 发表于 2010-8-11 12:09
我说的意思是参数不是固定的,也许是一个参数,也许是多个参数。
2010-08-12 10:55:58
#33 jake
我说的意思是参数不是固定的,也许是一个参数,也许是多个参数。
solo 发表于 2010-8-12 10:55
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数"}>
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" haha="haha" abc='abc'}>
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作"}>
也就是无论多少个参数,无论参数是什么,都放到这里就可以,和spUrl在模板内的用法一样。
2010-08-12 11:19:49
#34 solo
也就是无论多少个参数,无论参数是什么,都放到这里就可以,和spUrl在模板内的用法一样。 ...
jake 发表于 2010-8-12 11:19
可能你没明白我的意思。
以这个论坛为例。
http://speedphp.com/bbs/forumdisplay.php?fid=5这个是论坛的列表地址。
http://speedphp.com/bbs/forumdisplay.php?fid=5&filter=digest这个是论坛的精华区。
http://speedphp.com/bbs/forumdisplay.php?fid=5&orderby=heats&filter=86400这个是论坛一天内的帖子列表。
这三个地址都是同一个列表,只是后面的参数不同。参数不是固定的一个或是多个,而是可能只是其中的一个或是两个。
我用speedphp的分页如果做到这样的?
按你的说法<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" haha="haha" abc='abc'}>
我在里面把默认的参数都加上了,这样不能得到想要所有数据的列表。
2010-08-16 11:50:33
#35 jake
是的,如果是这类型的分页例子,的确是需要把全部的参数都放上去。
“这样不能得到想要所有数据的列表”,这种情况只能说明是你接收处理的时候,逻辑不够清晰。
比如说带搜索的GET关键字,那一定要比分类名等等有优先接收,这些参数在实际应用中都要处理好就行。
2010-08-16 12:01:41
#36 billgame
好东西,收藏了。
2010-09-30 18:12:59
#37 leboo
这分页真不错啊
2010-10-01 21:07:50
#38 helloniu
findSql方式分页可以使用这个吗?
2010-12-30 17:42:05
#39 elick
支持下 刚好需要这个
2011-01-18 14:28:50
#40 xiaoqiqi
完美,可以自定义很多种样式
2011-02-22 10:23:16
#41 南河三
感谢老大,省去了我们很多美术麻烦
2011-03-03 16:13:37
#42 diushi
好 找半天了 。。。赶紧使用一下
2011-09-23 14:43:37