* $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(); * * * @author iwind * @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; } /** * 添加查询条件 * * * $page->addQuery(array( * "e" => 5, * "f" => 6 * )); * $page->addQuery("g=7"); * * * @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."); } } ?>