| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | <?phpnamespace KIF\Page;/** * 分页类 * 需设定以下样式: * page-prev:上一页 * page-next:下一页 * page-more:更多,即... * page-current:当前页 * @author gaoxiaogang@gmail.com */use KIF\Verify;use Exception;class Page {	/**	 * 	 * 总页数	 * @var int	 */	protected $pages;		/**	 * 	 * 当前页	 * @var int	 */	protected $page;		protected $first_num = 2;		protected $end_num = 2;		protected $nearby_num = 2;		/**	 * 	 * url模版	 * 必须用 {page} 代表页码占位符。比如 http://misc.kimiss.com/comments/19933/{page}	 * @var string	 */	protected $url_tpl;		/**	 * 	 * Enter description here ...	 * @param int $nums 总结果数量	 * @param string $url_tpl url模版,必须用 {page} 代表页码占位符。比如 http://misc.kimiss.com/comments/19933/{page}	 * @param int $page 当前页码	 * @param int $size 每页显示多少个	 * @return Page	 */	public function __construct($nums, $url_tpl, $cur_page = 1, $size = 20) {		if (!Verify::unsignedInt($cur_page)) {			throw new Exception("invalid cur_page param: {$cur_page}");		}		$this->pages = ceil($nums/$size);		if ($cur_page > $this->pages) {			$cur_page = $this->pages;		}		$this->page = $cur_page;		$this->url_tpl = $url_tpl;	}		/**	 * 	 * 获取指定页面的url	 * @param int $page	 * @return string	 */	private function pageUrl($page) {		$url = str_replace('{page}', $page, $this->url_tpl);		$url = str_replace('%7Bpage%7D', $page, $url);// 支持url被转义后的		return $url;	}		public function html() {		$html = '';				# 显示上一页		if ($this->page > 1) {			$prev_page = $this->page - 1;			$html .= <<<PAGE				<a class="page-prev" data-page="{$prev_page}" href="{$this->pageUrl($prev_page)}">				上一页				<i></i>				</a>PAGE;		}				# 显示第1、2页		for ($i=1; $i<=$this->first_num; $i++) {			if ($i >= $this->page-$this->nearby_num) {				continue;			}			$html .= <<<PAGE				<a data-page="{$i}" href="{$this->pageUrl($i)}">				{$i}				</a>PAGE;		}				if ($this->page > ($this->first_num+$this->nearby_num+1)) {			$html .= '<span class="page-more">...</span>';		}				for ($i=$this->page-$this->nearby_num; $i <= $this->page+$this->nearby_num; $i++ ) {			if ($i < 1) {				continue;			}			if ($i > $this->pages) {				continue;			}			if ($i == $this->page) {				$html .= "<span class=\"page-current\">{$i}</span>";			} else {				$html .= <<<PAGE				<a data-page="{$i}" href="{$this->pageUrl($i)}">				{$i}				</a>PAGE;			}		}				if ($this->page < $this->pages-$this->end_num-$this->nearby_num) {			$html .= '<span class="page-more">...</span>';		}				# 显示倒数第1、2页		for ($i=$this->pages-$this->end_num+1; $i<=$this->pages; $i++) {			if ($i <= $this->page+$this->nearby_num) {				continue;			}			$html .= <<<PAGE				<a data-page="{$i}" href="{$this->pageUrl($i)}">				{$i}				</a>PAGE;		}				# 显示下一页		if ($this->page < $this->pages) {			$next_page = $this->page + 1;			$html .= <<<PAGE				<a class="page-next" data-page="{$next_page}" href="{$this->pageUrl($next_page)}">				下一页				<i></i>				</a>PAGE;		}				return $html;	}}
 |