天天看点

PHPCMS V9 分页函数解析

用phpcms做网站有些客户很是挑剔(此处省略几千万字问候他全家的话语)。非要自定义的分页,比如:

PHPCMS V9 分页函数解析

分页.jpg

如果你会用

{$pages}

进行分页的话,那接下来就很容易了。下面引用一下官方论坛给出的答复,然后我在后面完善一下(主要函数里面具体什么意思):

大家做网站的时候,可能很多时候分页样式都得根据模板的要求来控制的,这时很多人都会去修改全局文件phpcms\libs\functions\global.func.php里的pages()函数,这样问题就来了:这个分页函数连后台也会影响到的,就是说,这个分页函数是全站共用的。

下面提供解决方法:(这个得修改文件,修改前记得备份)

打开

phpcms\libs\functions\global.func.php这个文件,找到分页函数,复制一下,粘贴到默认分页函数的下面,重新命名,比如我的就命名为wz_pages,保存。

打开phpcms/libs/classes/template_cache.class.php,找到207行的

$str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';

在这行的下面加上

$str .= '$wz_pages = wz_pages($'.$op.'_total, $page, $pagesize, $urlrule);';

保存。

最后,如果你要使用你自定义的分页函数,那么在模板中直接用{$wz_pages}就可以了、、

以后要修改样式,直接修改

phpcms\libs\functions\global.func.php这个文件中的wz_pages函数就可以了,不会影响到后台

我的表达能力就只有这些了,看不懂的,回贴吧、、

后续优化:

使用过程中,发现使用SQL分页的不能正常使用,得再添加如下代码

phpcms/libs/classes/template_cache.class.php,找到178行的

$str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s['count'], $page, $pagesize, $urlrule);';

在他下面增加:

$str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$wz_pages=wz_pages($s['count'], $page, $pagesize, $urlrule);';

这样,SQL的分页也正常了、、嘿嘿,欢迎拍砖、不拍的,你得顶啊~~

再次后续优化:

有朋友提到,会员中心的收藏列表分页不能使用上面的办法。

因为收藏列表的分页函数直接在其他文件定好了,所以通过修改模板缓存文件是不可行的

下面提供修改办法:

具体是

phpcms\libs\classes\model.class.php 61行

$this->pages = pages($this->number, $page, $pagesize, $urlrule, $array, $setpages);

把上面这行修改成:

$this->pages = wz_pages($this->number, $page, $pagesize, $urlrule, $array, $setpages);

(模板中的{$pages}不用改为{$wz_pages})

上面是第一种办法。

不过这样子的话,可能后台也会影响到了,这个地方好像是控制好多地方的

也可以这样修改,还是上面那个文件,61行不要修改。直接在61行下面添加:

$this->wz_pages= wz_pages($this->number, $page, $pagesize, $urlrule, $array, $setpages);

再去到:phpcms\modules\member\index.php 718行

把 $pages = $this->favorite_db->pages;

修改为:

$wz_pages = $this->favorite_db->wz_pages;

模板中的{$pages}要修改为{$wz_pages}

这是以收藏列表为例子,其他的也大同小异了、、

page函数:

function my_pages($num, $curr_page, $perpage = 20, $urlrule = '', $array = array(),$setpages = 10) {
//if条件里面基本上不用管,跟样式没有关系,无非就是计算多少页
    if(defined('URLRULE') && $urlrule == '') {
        $urlrule = URLRULE;
        $array = $GLOBALS['URL_ARRAY'];
    } elseif($urlrule == '') {
        $urlrule = url_par('page={$page}');
    }
    $multipage = '';
    if($num > $perpage) {
        $page = $setpages+1;
        $offset = ceil($setpages/2-1);
        $pages = ceil($num / $perpage);
        if (defined('IN_ADMIN') && !defined('PAGES')) define('PAGES', $pages);
        $from = $curr_page - $offset;
        $to = $curr_page + $offset;
        $more = 0;
        if($page >= $pages) {
            $from = 2;
            $to = $pages-1;
        } else {
            if($from <= 1) {
                $to = $page-1;
                $from = 2;
            }  elseif($to >= $pages) {
                $from = $pages-($page-2);
                $to = $pages-1;
            }
            $more = 1;
        }
        //这个是总共多少条
        //$multipage .= '<a class="a1">'.$num.L('page_item').'</a>';
        if($curr_page>0) {
            //这个是上一页(a标签里面带有L函数的就是上一页下一页)我已经把上一页下一页这两个去掉了,可以和自带的pages函数对比一下
            //$multipage .= ' <a href="'.pageurl($urlrule, $curr_page-1, $array).'" class="a1">'.L('previous').'</a>';
            if($curr_page==1) {
                //span里面加class是根据JS样式,选中是什么效果写的。如果想要选中是自定义效果就可以仿照这样写。我这个是选中的时候是红色的效果。
                $multipage .= ' <span class="curr">1</span>';
            } elseif($curr_page>6 && $more) {
                $multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>..';
            } else {
                $multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>';
            }
        }
        for($i = $from; $i <= $to; $i++) {
            if($i != $curr_page) {
                $multipage .= ' <a href="'.pageurl($urlrule, $i, $array).'">'.$i.'</a>';
            } else {
                $multipage .= ' <span class="curr">'.$i.'</span>';
            }
        }
        if($curr_page<$pages) {
            if($curr_page<$pages-5 && $more) {
                $multipage .= ' ..<a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a>';
            } else {
                $multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> ';
            }
        } elseif($curr_page==$pages) {
            $multipage .= ' <span class="curr">'.$pages.'</span>';
            //$multipage .= ' <span>'.$pages.'</span> <a href="'.pageurl($urlrule, $curr_page, $array).'" class="a1">'.L('next').'</a>';//后面的a里面是下一页
        } else {
            $multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a>';
        }
    }
    return $multipage;
}
           

自定义分页样式其实只要把这个方法看明白了也就感觉很容易了。

继续阅读