改进分页类

This commit is contained in:
yunwuxin
2016-07-14 10:44:04 +08:00
parent e57a60f974
commit 30e25f938b
6 changed files with 179 additions and 134 deletions

View File

@@ -45,7 +45,7 @@ abstract class Paginator
'fragment' => ''
];
public function __construct($items, $listRows, $currentPage = null, $simple = false, $total = null, $options = [])
protected function __construct($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = [])
{
$this->options = array_merge($this->options, $options);
@@ -71,12 +71,21 @@ abstract class Paginator
$this->items = PaginatorCollection::make($items, $this);
}
public function items()
/**
* @param $items
* @param $listRows
* @param null $currentPage
* @param bool $simple
* @param null $total
* @param array $options
* @return PaginatorCollection
*/
public static function make($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = [])
{
return $this->items;
$paginator = new static($items, $listRows, $currentPage, $total, $simple, $options);
return $paginator->items;
}
protected function setCurrentPage($currentPage)
{
if (!$this->simple && $currentPage > $this->lastPage) {

View File

@@ -972,6 +972,8 @@ class Query
{
$config = array_merge(Config::get('paginate'), $config);
$listRows = $listRows ?: $config['list_rows'];
/** @var Paginator $class */
$class = false !== strpos($config['type'], '\\') ? $config['type'] : '\\think\\paginator\\driver\\' . ucwords($config['type']);
$page = isset($config['page']) ? (int)$config['page'] : call_user_func([
$class,
@@ -982,7 +984,6 @@ class Query
$config['path'] = isset($config['path']) ? $config['path'] : call_user_func([$class, 'getCurrentPath']);
/** @var Paginator $paginator */
if (!$simple) {
$options = $this->getOptions();
$total = $this->count();
@@ -992,8 +993,7 @@ class Query
$total = null;
}
$paginator = new $class($results, $listRows, $page, $simple, $total, $config);
return $paginator->items();
return $class::make($results, $listRows, $page, $total, $simple, $config);
}
/**

View File

@@ -23,6 +23,8 @@ use think\Paginator;
* @method string render()
* @method Paginator fragment($fragment)
* @method Paginator appends($key, $value)
* @method integer lastPage()
* @method boolean hasPages()
*/
class Collection extends \think\Collection
{
@@ -41,16 +43,6 @@ class Collection extends \think\Collection
return new static($items, $paginator);
}
public function setPaginator(Paginator $paginator)
{
$this->paginator = $paginator;
}
public function getPaginator()
{
return $this->paginator;
}
public function toArray()
{
if ($this->paginator) {

4
tests/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
/runtime/
/application/common.php
/application/demo/
/application/runtime/

View File

@@ -48,16 +48,12 @@ class appTest extends \PHPUnit_Framework_TestCase
{
public function testRun()
{
App::run(Request::create("http://www.example.com"))->send();
$response = App::run(Request::create("http://www.example.com"));
$expectOutputString = '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>';
$this->expectOutputString($expectOutputString);
$rc = new ReflectionClass('\think\Loader');
$ns = $rc->getProperty('prefixDirsPsr4');
$ns->setAccessible(true);
$namespace = $ns->getValue();
$this->assertEquals([realpath(TEST_PATH)], $namespace['tests\\']);
$this->assertEquals($expectOutputString, $response->getContent());
$this->assertEquals(200, $response->getCode());
$this->assertEquals(true, function_exists('lang'));
$this->assertEquals(true, function_exists('config'));

View File

@@ -0,0 +1,44 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2015 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
namespace tests\thinkphp\library\think;
use think\paginator\driver\Bootstrap;
class paginateTest extends \PHPUnit_Framework_TestCase
{
public function testPaginatorInfo()
{
$p = Bootstrap::make($array = ['item3', 'item4'], 2, 2, 4);
$this->assertEquals(4, $p->total());
$this->assertEquals(2, $p->listRows());
$this->assertEquals(2, $p->currentPage());
$p2 = Bootstrap::make($array2 = ['item3', 'item4'], 2, 2, 2);
$this->assertEquals(1, $p2->currentPage());
}
public function testPaginatorRender()
{
$p = Bootstrap::make($array = ['item3', 'item4'], 2, 2, 100);
$render = '<ul class="pagination"><li><a href="/?page=1">&laquo;</a></li> <li><a href="/?page=1">1</a></li><li class="active"><span>2</span></li><li><a href="/?page=3">3</a></li><li><a href="/?page=4">4</a></li><li><a href="/?page=5">5</a></li><li><a href="/?page=6">6</a></li><li><a href="/?page=7">7</a></li><li><a href="/?page=8">8</a></li><li class="disabled"><span>...</span></li><li><a href="/?page=49">49</a></li><li><a href="/?page=50">50</a></li> <li><a href="/?page=3">&raquo;</a></li></ul>';
$this->assertEquals($render, $p->render());
}
}