qq分分彩app|qq分分彩开奖记录官网

TP 3.2 的分頁優化

瀏覽:235 發布日期:2019/04/04 分類:功能實現
TP 5 分頁很方便,但 TP 3.2 分頁就很麻煩,為維護老項目,就動手作了優化。
TP 5 分頁很方便,但 TP 3.2 分頁就很麻煩。雖然現在新項目都是用 TP 5,但很多老項目還是用 TP 3.2,為維護方便,還是動手去優化了 TP 3.2 的分頁實現。

TP 3.2 分頁,有幾個方面要處理:
1)取得當前頁號、每頁數據條數;
2)取得指定頁面數據;
3)渲染分頁導航 html 代碼。

2019-04-15 bug 修復:修復可能出現頁數錯誤的 bug

直接先看代碼:

一、添加分頁類:<?php
/**
 * User: Aven
 * Date: 2019-04-03
 * Time: 14:14
 */

namespace Lib;


use Think\Page;

class Paginator implements \ArrayAccess,\Countable,\IteratorAggregate
{
    protected $_items = [];
    protected $rowsList;
    protected $options;
    protected $totalRows;
    protected $prev;
    protected $next;

    function __construct($items, $totalRows, $rowsList = 15, $options = [])
    {
        $this->_items = $items;
        $this->rowsList = $rowsList;
        $this->options = $options;
        $this->totalRows = $totalRows;
    }

    public function render()
    {
        $page = new Page($this->totalRows, $this->rowsList);
        if ($this->prev){
            $page->setConfig('prev', $this->prev);
        }
        if ($this->next){
            $page->setConfig('next', $this->next);
        }
        return $page->show();
    }

    public function items()
    {
        return $this->_items;
    }

    public function each(callable $callback)
    {
        foreach ($this->_items as $key => $item) {
            $result = $callback($item, $key);
            if (false === $result) {
                break;
            } elseif (!is_object($item)) {
                $this->_items[$key] = $result;
            }
        }

        return $this;
    }

    public function setPrev($prev){
        $this->prev = $prev;
        return $this;
    }

    public function setNext($next) {
        $this->next = $next;
        return $this;
    }

    public function slice($offset, $length = null, $preserveKeys = false)
    {
        return array_slice($this->_items, $offset, $length, $preserveKeys);
    }

    public function count()
    {
        return count($this->_items);
    }

    public function offsetExists($offset)
    {
        return isset($this->_items[$offset]);
    }

    public function offsetGet($offset)
    {
        return $this->offsetExists($offset) ? $this->_items[$offset] : null;
    }

    public function offsetSet($offset, $value)
    {
        $this->_items[$offset] = $value;
    }

    public function offsetUnset($offset)
    {
        unset($this->_items[$offset]);
    }

    public function getIterator()
    {
        return new \ArrayIterator($this->_items);
    }
}
二、修改 Model 類,為 model 添加功能。// $rowsList 為每頁數據條數
// $data_only 為 true 時,只返回數據,不作渲染、不統計數據總條數,提高性能,主要為接口提供數據用。
// 2019-04-15 bug 修復
public function paginate($rowsList = 15, $data_only = false)
    {
        $currentPage = I(C('VAR_PAGE') ? C('VAR_PAGE') : 'p', 1);

        // 添加一行,備份 options,因為每進行一次查詢,都會清了 options。
        $options = $this->options;

        $items = $this->page($currentPage, $rowsList)->select();
        if ($data_only){
            return $items;
        }

        // 添加一行,恢復 options。
        $this->options = $options;

        $totalRows = $this->count();
        return new \Lib\Paginator($items, $totalRows, $rowsList);
    }
三、修改模板渲染文件,讓 volist 標簽識別分頁類數據。修改以下的代碼即可。    $parseStr  .=  'if(is_array('.$name.') || ' . $name . ' instanceof \Lib\Paginator): $'.$key.' = 0;';
    if(isset($tag['length']) && '' != $tag['length'] ) {
        $parseStr  .= ' $__LIST__ = ' . $name . ' instanceof \Lib\Paginator ? ' . $name . '->array_slice(' . $name.','.$tag['offset'].','.$tag['length'] . ',true) : array_slice('.$name.','.$tag['offset'].','.$tag['length'].',true);';
    }elseif(isset($tag['offset'])  && '' !=$tag['offset']){
        $parseStr  .= ' $__LIST__ = ' . $name . ' instanceof \Lib\Paginator ? ' . $name . '->array_slice(' . $name.','.$tag['offset'].','.$tag['length'] . ',true) : array_slice('.$name.','.$tag['offset'].',null,true);';
    }else{
         $parseStr .= ' $__LIST__ = ' . $name . ';';
    }
四、現在使用就簡單了:$data = M('User')->where(array('rank' => 2))->order('id asc')->paginate(20);

//只要數據就這樣
$data = M('User')->paginate(20, true);
其它說明:
1)頁號參數,按 TP 3.2 的分頁類,默認為 p,可以在配置文件中配置 VAR_PAGE 即可。
2)分頁也像 TP 5 的分頁一樣,帶 each 方法。
3)本次優化,是實現主要的、常用的功能,要實現其它功能,看官自行完善。
評論( 相關
后面還有條評論,點擊查看>>
qq分分彩app