美文网首页PHPCMS
PHPCMS V9 分页函数解析

PHPCMS V9 分页函数解析

作者: 这真的是一个帅气的名字 | 来源:发表于2017-07-28 22:52 被阅读58次

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

    分页.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;
    }
    

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

    相关文章

      网友评论

        本文标题:PHPCMS V9 分页函数解析

        本文链接:https://www.haomeiwen.com/subject/jjtqlxtx.html