|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- <?php
- /**
- * Pagination abstract class
- *
- * <code>
- * $pager = new RPage();
- * $pager->total(100);
- * $pager->setSize(21);
- * $pager->setKeyword("page");
- * $pager->setPath("pager.php");
- * $pager->setQuery("a=b&pager=%{PAGE_NO}&d=1");
- * echo $pager;
- * echo "offset:" . $pager->offset();
- * </code>
- *
- * @author iwind <iwind.iwind@gmail.com>
- * @link http://ifphp.cn
- * @version $Id$
- * @package rock
- * @subpackage plugin.pager
- */
-
- /**
- * Pagination abstract class
- *
- * 实现了RPage接口的一些方法
- *
- * @version $Id$
- * @package if
- * @subpackage plugin.pager
- */
- abstract class RPage {
- private $keyword;
- private $total;
- private $path;
- private $size;
- private $properties;
- private $query;
- private $length;
- private $pageSetSize = 11;
- private $rows = array();
-
- /**
- * 是否加载了本地化对象
- *
- * @var boolean
- * @since 1.0
- */
- private $localeLoaded = false;
-
- /**
- * 语言配置
- *
- * @var array
- * @since 1.0
- */
- private $messages = array();
-
- /**
- * 分页中代码当前页码的常量
- *
- */
- const PAGER_VARIABLE_STRING = "%{PAGE_NO}";
-
- /**
- * 构造器
- *
- * @since 2.0
- */
- function __construct() {
- $this->path = $_SERVER["PHP_SELF"];
- }
-
- /**
- * 取得当前页码,第一页为1
- *
- * @return integer
- */
- function current() {
- $keyword = $this->keyword();
- $pageNo = intval(x($keyword));
- if ($pageNo <= 0) {
- $pageNo = 1;
- }
- return min($pageNo, $this->length());
- }
-
- /**
- * 取得下一页页码
- *
- * @return integer
- */
- function next() {
- $length = $this->length();
- $current = $this->current();
- return $current < $length ? ($current + 1) : $length;
- }
-
- /**
- * 取得上一页页码
- *
- * @return integer
- */
- function prev() {
- $length = $this->length();
- $current = $this->current();
- return $current > 1 ? ($current - 1) : 1;
- }
-
- /**
- * 取得记录开始的偏移量
- *
- * @return integer
- */
- function offset() {
- $offset = $this->size() * ($this->current() - 1);
- if ($offset < 0) {
- $offset = 0;
- }
- if($offset >= $this->total()){
- $offset = max($this->size () * ($this->length () - 1), 0);
- }
- return $offset;
- }
-
- /**
- * 设置内容总数
- *
- * @param integer $total 内容总数
- * @return RPage
- */
- function setTotal($total) {
- $this->total = intval($total);
- if ($this->total < 0) {
- throw new Exception("content total '{$total}' can't be small than 0");
- }
- return $this;
- }
-
- /**
- * 数据总数
- *
- * @return integer
- * @since 1.0
- */
- function total() {
- return $this->total;
- }
-
- /**
- * 设置分页链接中的关键字
- *
- * @param string $keyword 关键字
- * @return RPage
- */
- function setKeyword($keyword) {
- $this->keyword = $keyword;
- return $this;
- }
-
- /**
- * 取得分页用的关键字
- *
- * 从1.0开始,如果没有关键字,则默认为page
- *
- * @return string
- */
- function keyword() {
- if (!$this->keyword) {
- $this->keyword = "page";
- }
- return $this->keyword;
- }
-
- /**
- * 设置每页记录数
- *
- * @param integer $size 大于0的数字
- * @return RPage
- */
- function setSize($size) {
- $this->size = intval($size);
- if ($this->size < 1) {
- throw new Exception("page size '{$size}' can't be small than 1");
- }
- return $this;
- }
-
- /**
- * 取得每页记录数
- *
- * @return integer
- */
- function size() {
- if ($this->size < 1) {
- $this->size = 10;
- }
- return $this->size;
- }
-
- /**
- * 设置链接的路径
- *
- * @param string $path 路径
- * @return RPage
- */
- function setPath($path) {
- $this->path = $path;
- return $this;
- }
-
- /**
- * 取得程序路径
- *
- * @return string
- * @since 1.0
- */
- function path() {
- return $this->path;
- }
-
- /**
- * 设置属性
- *
- * @param array $properties 属性列表
- * @return RPage
- */
- function setProperties(array $properties) {
- $this->properties = $properties;
- return $this;
- }
-
- /**
- * 取得设置的属性
- *
- * @return array
- * @since 1.0
- */
- function properties() {
- return $this->properties;
- }
-
- /**
- * 设置查询
- *
- * @param mixed $query string|array
- * @return RPage
- */
- function setQuery($query) {
- if (is_array($query)) {
- $_query = array();
- foreach ($query as $key => $value) {
- if ($key == $this->keyword()) {
- continue;
- }
- if (is_array($value)) {
- foreach ($value as $key1=>$value1) {
- $_query[] = "{$key}[]=" . urlencode($value1);
- }
- }
- else {
- $_query[] = "{$key}=" . urlencode($value);
- }
- }
- $query = implode("&", $_query);
- }
- $this->query = $query;
- return $this;
- }
-
- /**
- * 添加查询条件
- *
- * <code>
- * $page->addQuery(array(
- * "e" => 5,
- * "f" => 6
- * ));
- * $page->addQuery("g=7");
- * </code>
- *
- * @param mixed $query string|array
- * @return RPage
- * @since 1.0.3
- */
- function addQuery($query) {
- if (is_array($query)) {
- $_query = array();
- foreach ($query as $key => $value) {
- if ($key == $this->keyword()) {
- continue;
- }
- if (is_array($value)) {
- foreach ($value as $key1=>$value1) {
- $_query[] = "{$key}[]=" . urlencode($value1);
- }
- }
- else {
- $_query[] = "{$key}=" . urlencode($value);
- }
- }
- $query = implode("&", $_query);
- }
- $this->query .= ($this->query ? "&" : "") . $query;
- return $this;
- }
-
- /**
- * 开启自动构造查询条件功能
- *
- * @param boolean $bool 是否开启该功能
- * @param string|array $except 要去除的参数名
- * @param string|array $only 限制的参数名
- * @return RPage
- * @since 1.0.3
- */
- function setAutoQuery($bool = true, $except = "", $only = "") {
- if (!is_array($except)) {
- $except = preg_split("/\\s+,\\s+/", $except);
- }
- if (!is_array($only) && strlen($only) > 0) {
- $only = preg_split("/\\s+,\\s+/", $only);
- }
- if ($bool) {
- $x = xn();
- foreach ($x as $name => $value) {
- if ($except && in_array($name, $except)) {
- unset($x[$name]);
- }
- if ($only && !in_array($name, $only)) {
- unset($x[$name]);
- }
- }
- $this->setQuery($x);
- }
- return $this;
- }
-
- /**
- * 取得查询
- *
- * @return array
- * @since 1.0
- */
- function query() {
- return $this->query;
- }
-
- /**
- * 取得一个分页好号对应的URL
- *
- * @param integer $pageNo 分页号
- * @return string
- * @since 1.0
- */
- function url($pageNo) {
- $query = $this->query();
- if (strstr($query, self::PAGER_VARIABLE_STRING)) {
- $query = str_replace(self::PAGER_VARIABLE_STRING, $pageNo, $query);
- }
- else {
- if ($query == "") {
- $query = $this->keyword() . "=" . $pageNo;
- }
- else {
- $query .= "&" . $this->keyword() . "=" . $pageNo;
- }
- }
- return $this->path() . "?" . $query;
- }
-
- /**
- * 取得总分页数
- *
- * @return integer
- * @since 1.0
- */
- function length() {
- if ($this->size() == 0) {
- return 0;
- }
- return ceil($this->total()/$this->size());
- }
-
- /**
- * 添加记录
- *
- * @param mixed $row 记录
- * @return RPage
- */
- function addRow($row) {
- $this->rows[] = $row;
- return $this;
- }
-
- /**
- * 添加记录集
- *
- * @param array $rows 记录集
- * @return RPage
- */
- function addRows(array $rows) {
- foreach ($rows as $row) {
- $this->rows[] = $row;
- }
- return $this;
- }
-
- /**
- * 取得记录集
- *
- * @return array
- */
- function rows() {
- return $this->rows;
- }
-
- /**
- * 设置记录集
- *
- * @param array|iterable $rows 记录集
- * @return RPage
- */
- function setRows($rows) {
- $this->rows = $rows;
- return $this;
- }
-
- /**
- * 取得键值对应的消息文本
- *
- * @param string $key 键值
- * @return string
- * @since 1.0
- */
- protected function message($key) {
- if (!$this->localeLoaded) {
- $locale = __LANG__;
- if (!$locale) {
- $locale = "default";
- }
-
- $message = x("~" . $key);
- if ($message) {
- return $message;
- }
-
- //简写
- $dirname = dirname(__FILE__) . "/lang";
- $langFile = $dirname . "/" . $locale . ".php";
- if (is_file($langFile)) {
- require($langFile);
- $this->messages = $message;
- }
- $this->localeLoaded = true;
- }
- if (is_array($this->messages) && array_key_exists($key, $this->messages)) {
- return $this->messages[$key];
- }
- return null;
- }
-
- /**
- * 转换成字符串
- *
- * @return string
- */
- public abstract function __toString();
-
- /**
- * 设置分页集尺寸
- *
- * @param integer $num 大于1
- * @return RPage
- * @since 1.0
- */
- function setPageSetNum($num){
- $this->pageSetSize = $num;
- return $this;
- }
-
- /**
- * 取得分页集尺寸
- *
- * @return integer
- * @since 1.0
- */
- function pageSetNum(){
- return $this->pageSetSize;
- }
-
- static function pageWithStyle($style, array $params = null) {
- exit(__METHOD__ . " need to be implemented.");
- }
- }
-
-
- ?>
|