8,分页类

前言


首先,这是一件很无聊的事。很多人都给这样的举动给出了一个名称** 重复造轮子 **。

个人认为,对于初学者,甚至是一些有工作经验的人来说,想要自我提升,重复造轮子是件有必要的事情。
虽然说,网上有各种各样的开源代码以供参考和使用,但,这也仅限于使用,就跟你会开车却不会造车一样的道理。(可能比喻不是很恰当)

有些人使用别人造的轮子,
有些人重复造轮子
有些人给自己造轮子
这些人的最终境界,我想应该是** “造轮子给别人用” **

那么,看看我的轮子



// +----------------------------------------------------------------------
// | Date: 2016年11月12日
// +----------------------------------------------------------------------


#-------------------------------------------------------------------------
#   使用案例:
#   vendor('Page');
#   $page = new \Page(500,10);
#   echo $page->set_theme('共有记录{%MAX_ROWS%}条');
#   print_r($page->show());
#
#-------------------------------------------------------------------------

class Page{

    protected $_max_page ; // 总页数
    protected $_max_rows ; // 总记录数
    protected $_limit = 10 ; // 每页条数
    protected $_param = 'p' ; // 分页参数名
    protected $_page_length = 11; // 显示页码数量,因为要从两边分开对称,此值必须为奇数
    protected $_params = array(); // 携带参数
    protected $_url = '' ; // 支持自定义URL(如,配置过路由),为空时,默认当前路径
    protected $_show = false; // 当总页数等于1时,是否显示html代码 false为不显示,true为显示
    protected $_now_page = 1; // 当前页

    // 显示配置
    protected $_prev = "上一页";
    protected $_next = "下一页";
    protected $_first = "首页";
    protected $_last = "末页";
    protected $_num = '{%NUM%}';

    // 其他配置
    protected $_theme = '共{%MAX_PAGE%}页,记录{%MAX_ROWS%}条';

    /**
     * 构造函数:设置默认参数
     * @author  Object
     * @date    2016-11-12
     * @param   int         $total      传入总条数
     * @param   int         $limit      传入页显示数
     */
    public function __construct($total,$limit){
        $this->_max_page = ceil($total/$limit); // 向上取整
        $this->_max_rows = $total;
        $this->_limit = $limit;
        $this->_now_page = empty($_GET[$this->_param]) ? 1 : intval($_GET[$this->_param]);
    }

    /**
     * 动态设置参数
     * @author  Object
     * @date    2016-11-12
     * @param   string     $name    方法名
     * @param   array      $param   参数
     * @return      mixed
     */
    public function __call($name,$params = array()){
        // 判断操作符
        $action = substr($name,0,3);
        if ($action != 'set') {
            return -1; // 非法操作符
        }

        // 判断参数
        $param = substr($name, 3);
        if (!isset($this->$param)) {
            return -2; // 非法参数
        }

        $this->$param = $params[0]; // 任何数据类型都可以 , 默认取第一项,如果存在多个参数,则另外处理
    }

    /**
     * 替换页码:处理已生成的URL
     * @author  Obejct
     * @date    2016-11-14
     * @param   int             $page       页码
     * @return  string              链接
     */
    public function replace($page){
        return str_replace(urlencode('{%PAGE%}'), $page, $this->_url);
    }

    /**
     * 替换页码:处理显示的分页列表
     * @author  Obejct
     * @date    2016-11-14
     * @param   int             $i      页码
     * @return  string              html
     */
    public function replaceNumber($i){
        return str_replace('{%NUM%}', $i, $this->_num);
    }

    /**
     * 其他配置
     * @author  Object
     * @date    2016-11-14
     * @return  string
     */
    public function otherInfo(){
        return str_replace('{%MAX_PAGE%}',$this->_max_page, str_replace('{%MAX_ROWS%}', $this->_max_rows, $this->_theme));
    }

    /**
     * 生成分页HTML代码
     * @author  Object
     * @date    2016-11-14
     * @return  string      HTML代码
     */
    public function show(){
        // 是否仅一页处理
        if (!$this->_show && $this->_max_page == 1) {
            return '';
        }

        $this->_params[$this->_param] = '{%PAGE%}'; // 指定页码标致

        // 偏移量计算
        $offset = ceil($this->_page_length / 2);
        if ($offset == $this->_page_length / 2) {
            return -3 ; // 显示页码数量为偶数
        }

        // URL生成
        if (empty($this->_url)) {
            $this->_url = U(ACTION_NAME,$this->_params);
        }else{
            // 以下生成自定义URL的过程,可以封装成另外一个函数,则使用时能和U方法一样方便。
            $split = C('URL_PATHINFO_DEPR'); // 取连接符
            $url = '';
            foreach ($this->_params as $k => $v) {
                $url .= $split.$k.$split.$v;
            }
            $this->_url .= substr($url, 1).C('URL_HTML_SUFFIX'); // 格式为:传入url规则+参数+后缀
        }

        // 上一页:当没有上一页时,代码为空
        $prev = $this->_now_page - 1;
        $prev_html = $prev > 0 ? '
  • ' : ''; // 下一页:当没有下一页时,代码为空 $next = $this->_now_page + 1; $next_html = $next <= $this->_max_page ? '
  • ' : ''; // 首页:当已经处于首页时,代码为空 $first_html = $this->_now_page > 1 ? '
  • ' . $this->_first . '
  • ' : ''; // 末页:当已经处于末页时,代码为空 $last_html = $this->_now_page < $this->_max_page ? '
  • ' . $this->_last . '
  • ' : ''; // 页码起始页与结束页计算 if ($this->_max_page <= $this->_page_length) { // 当 总页数少于显示页码数量 $start = 1; $end = $this->_max_page; }elseif ($offset > $this->_now_page) { // 当 当前页处于最左侧N个页面时 // 1,2,3,4,5 3为中间值,即,当当前页处于1,2时 $start = 1; $end = $this->_page_length; }elseif ($offset > $this->_max_page - $this->_now_page) { // 当 当前页处于最右侧N个页面时 // 4,5,6,7,8 6为中间值,即,当当前页处于7,8时 $start = $this->_max_page - $this->_page_length + 1; $end = $this->_max_page; }else{ // 不在最左,也不在最右,同时总页数大于页码数量 $start = $this->_now_page - $offset + 1; $end = $this->_now_page + $offset - 1; } // 生成HTML $other_html = ''; for ($i=$start; $i <= $end ; $i++) { $other_html .= $i == $this->_now_page ? '
  • ' . $this->replaceNumber($i) . '
  • ' : '
  • ' . $this->replaceNumber($i) . '
  • '; } // 最终处理 $html = '
      '.$first_html.$prev_html.$other_html.$next_html.$last_html.'
    '.$this->otherInfo().''; return $html; } } ?>

    结语


    实践出真知,真的去实现过,才会更加完善自己的思路。

    路漫漫其修远兮,吾将上下而求索。

    你可能感兴趣的:(8,分页类)