page.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. <?php
  2. /**
  3. * 分页类
  4. *
  5. *
  6. * @package
  7. */
  8. defined('InShopNC') or exit('Access Invalid!');
  9. class Page{
  10. /**
  11. * url参数中页码参数名
  12. */
  13. private $page_name = 'curpage';
  14. /**
  15. * 信息总数
  16. */
  17. private $total_num = 1;
  18. /**
  19. * 页码链接
  20. */
  21. private $page_url = '';
  22. /**
  23. * 每页信息数量
  24. */
  25. private $each_num = 10;
  26. /**
  27. * 当前页码
  28. */
  29. private $now_page = 1;
  30. /**
  31. * 设置页码总数
  32. */
  33. private $total_page = 1;
  34. /**
  35. * 输出样式
  36. * 4、5为商城伪静态专用样式
  37. */
  38. private $style = 2;
  39. /**
  40. * ajax 分页 预留,目前先不使用
  41. * 0为不使用,1为使用,默认为0
  42. */
  43. private $ajax = 0;
  44. /**
  45. * 首页
  46. */
  47. private $pre_home = '';
  48. /**
  49. * 末页
  50. */
  51. private $pre_last = '';
  52. /**
  53. * 上一页
  54. */
  55. private $pre_page = '';
  56. /**
  57. * 下一页
  58. */
  59. private $next_page = '';
  60. /**
  61. * 页码 样式左边界符
  62. */
  63. private $left_html = '<li>';
  64. /**
  65. * 页码 样式右边界符
  66. */
  67. private $right_html = '</li>';
  68. /**
  69. * 选中样式左边界符
  70. */
  71. private $left_current_html = '<li>';
  72. /**
  73. * 选中样式右边界符
  74. */
  75. private $right_current_html = '</li>';
  76. /**
  77. * 省略号样式左边界符
  78. */
  79. private $left_ellipsis_html = '<li>';
  80. /**
  81. * 省略号样式右边界符
  82. */
  83. private $right_ellipsis_html = '</li>';
  84. /**
  85. * 在页码链接a内部的样式 <a>(样式名)页码(样式名)</a>
  86. */
  87. private $left_inside_a_html = '';
  88. /**
  89. * 在页码链接a内部的样式 <a>(样式名)页码(样式名)</a>
  90. */
  91. private $right_inside_a_html = '';
  92. /**
  93. * 构造函数
  94. *
  95. * 数据库使用到的方法:
  96. * $this->setTotalNum($total_num);
  97. * $this->getLimitStart();
  98. * $this->getLimitEnd();
  99. *
  100. * @param
  101. * @return
  102. */
  103. public function __construct(){
  104. Language::read('core_lang_index');
  105. $lang = Language::getLangContent();
  106. $this->pre_home = $lang['first_page'];
  107. $this->pre_last = $lang['last_page'];
  108. $this->pre_page = $lang['pre_page'];
  109. $this->next_page = $lang['next_page'];
  110. /**
  111. * 设置当前页码
  112. */
  113. $this->setNowPage($_GET[$this->page_name]);
  114. /**
  115. * 设置当前页面的页码url
  116. * 商城伪静态分页不需要使用这个方法
  117. */
  118. if (!in_array($this->style, array(4,5))) {
  119. $this->setPageUrl();
  120. }
  121. }
  122. /**
  123. * 取得属性
  124. *
  125. * @param string $key 属性键值
  126. * @return string 字符串类型的返回结果
  127. */
  128. public function get($key){
  129. return $this->$key;
  130. }
  131. /**
  132. * 设置属性
  133. *
  134. * @param string $key 属性键值
  135. * @param string $value 属性值
  136. * @return bool 布尔类型的返回结果
  137. */
  138. public function set($key,$value){
  139. return $this->$key = $value;
  140. }
  141. /**
  142. * 设置url页码参数名
  143. *
  144. * @param string $page_name url中传递页码的参数名
  145. * @return bool 布尔类型的返沪结果
  146. */
  147. public function setPageName($page_name){
  148. $this->page_name = $page_name;
  149. return true;
  150. }
  151. /**
  152. * 设置当前页码
  153. *
  154. * @param int $page 当前页数
  155. * @return bool 布尔类型的返回结果
  156. */
  157. public function setNowPage($page){
  158. $this->now_page = intval($page)>0?intval($page):1;
  159. return true;
  160. }
  161. /**
  162. * 设置每页数量
  163. *
  164. * @param int $num 每页显示的信息数
  165. * @return bool 布尔类型的返回结果
  166. */
  167. public function setEachNum($num){
  168. $this->each_num = intval($num)>0?intval($num):10;
  169. return true;
  170. }
  171. /**
  172. * 设置输出样式
  173. *
  174. * @param int $style 样式名
  175. * @return bool 布尔类型的返回结果
  176. */
  177. public function setStyle($style){
  178. $this->style = ($style == 'admin' ? 2:$style);
  179. return true;
  180. }
  181. /**
  182. * 设置信息总数
  183. *
  184. * @param int $total_num 信息总数
  185. * @return bool 布尔类型的返回结果
  186. */
  187. public function setTotalNum($total_num){
  188. $this->total_num = $total_num;
  189. return true;
  190. }
  191. /**
  192. * 取当前页码
  193. *
  194. * @param
  195. * @return int 整型类型的返回结果
  196. */
  197. public function getNowPage(){
  198. return $this->now_page;
  199. }
  200. /**
  201. * 取页码总数
  202. *
  203. * @param
  204. * @return int 整型类型的返回结果
  205. */
  206. public function getTotalPage(){
  207. if ($this->total_page == 1){
  208. $this->setTotalPage();
  209. }
  210. return $this->total_page;
  211. }
  212. /**
  213. * 取信息总数
  214. *
  215. * @param
  216. * @return int 整型类型的返回结果
  217. */
  218. public function getTotalNum(){
  219. return $this->total_num;
  220. }
  221. /**
  222. * 取每页信息数量
  223. *
  224. * @param
  225. * @return int 整型类型的返回结果
  226. */
  227. public function getEachNum(){
  228. return $this->each_num;
  229. }
  230. /**
  231. * 取数据库select开始值
  232. *
  233. * @param
  234. * @return int 整型类型的返回结果
  235. */
  236. public function getLimitStart(){
  237. if ($this->getNowPage() <= 1){
  238. $tmp = 0;
  239. }else {
  240. $this->setTotalPage();
  241. $this->now_page = $this->now_page > $this->total_page ? $this->total_page : $this->now_page;
  242. $tmp = ($this->getNowPage()-1)*$this->getEachNum();
  243. }
  244. return $tmp;
  245. }
  246. /**
  247. * 取数据库select结束值
  248. *
  249. * @param
  250. * @return int 整型类型的返回结果
  251. */
  252. public function getLimitEnd(){
  253. $tmp = $this->getNowPage()*$this->getEachNum();
  254. if ($tmp > $this->getTotalNum()){
  255. $tmp = $this->getTotalNum();
  256. }
  257. return $tmp;
  258. }
  259. /**
  260. * 设置页码总数
  261. *
  262. * @param int $id 记录ID
  263. * @return array $rs_row 返回数组形式的查询结果
  264. */
  265. public function setTotalPage(){
  266. $this->total_page = ceil($this->getTotalNum()/$this->getEachNum());
  267. }
  268. /**
  269. * 输出html
  270. *
  271. * @param
  272. * @return string 字符串类型的返回结果
  273. */
  274. public function show($style = null){
  275. /**
  276. * 设置总数
  277. */
  278. $this->setTotalPage();
  279. if (!is_null($style)){
  280. $this->style = $style;
  281. }
  282. $html_page = '';
  283. $this->left_current_html = '<li><span class="currentpage">';
  284. $this->right_current_html = '</span></li>';
  285. $this->left_inside_a_html = '<span>';
  286. $this->right_inside_a_html = '</span>';
  287. switch ($this->style) {
  288. case '1':
  289. $html_page .= '<ul>';
  290. if ($this->getNowPage() <= 1){
  291. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</li>';
  292. }else {
  293. $html_page .= '<li><a class="demo" href="'. $this->page_url . ($this->getNowPage()-1) .'">'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</a></li>';
  294. }
  295. if ($this->getNowPage() == $this->getTotalPage() || $this->getTotalPage() == 0){
  296. $html_page .= '<li>'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</li>';
  297. }else {
  298. $html_page .= '<li><a class="demo" href="'. $this->page_url . ($this->getNowPage()+1) .'">'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</a></li>';
  299. }
  300. $html_page .= '</ul>';
  301. break;
  302. case '2':
  303. $html_page .= '<ul>';
  304. if ($this->getNowPage() <= 1){
  305. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_home.$this->right_inside_a_html.'</li>';
  306. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</li>';
  307. }else {
  308. $html_page .= '<li><a class="demo" href="'. $this->page_url .'1">'.$this->left_inside_a_html.$this->pre_home.$this->right_inside_a_html.'</a></li>';
  309. $html_page .= '<li><a class="demo" href="'. $this->page_url . ($this->getNowPage()-1) .'">'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</a></li>';
  310. }
  311. $html_page .= $this->getNowBar();
  312. if ($this->getNowPage() == $this->getTotalPage() || $this->getTotalPage() == 0){
  313. $html_page .= '<li>'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</li>';
  314. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_last.$this->right_inside_a_html.'</li>';
  315. }else {
  316. $html_page .= '<li><a class="demo" href="'. $this->page_url . ($this->getNowPage()+1) .'">'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</a></li>';
  317. $html_page .= '<li><a class="demo" href="'. $this->page_url . $this->getTotalPage() .'">'.$this->left_inside_a_html.$this->pre_last.$this->right_inside_a_html.'</a></li>';
  318. }
  319. $html_page .= '</ul>';
  320. break;
  321. case '3':
  322. $html_page .= '<ul>';
  323. if ($this->getNowPage() <= 1){
  324. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</li>';
  325. }else {
  326. $html_page .= '<li><a class="demo" href="'. $this->page_url . ($this->getNowPage()-1) .'">'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</a></li>';
  327. }
  328. $html_page .= $this->getNowBar();
  329. if ($this->getNowPage() == $this->getTotalPage() || $this->getTotalPage() == 0){
  330. $html_page .= '<li>'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</li>';
  331. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_last.$this->right_inside_a_html.'</li>';
  332. }else {
  333. $html_page .= '<li><a class="demo" href="'. $this->page_url . ($this->getNowPage()+1) .'">'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</a></li>';
  334. }
  335. $html_page .= '</ul>';
  336. break;
  337. case '4':
  338. $html_page .= '<ul>';
  339. if ($this->getNowPage() <= 1){
  340. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</li>';
  341. }else {
  342. $html_page .= '<li><a class="demo" href="'. $this->setShopPseudoStaticPageUrl($this->getNowPage()-1) .'">'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</a></li>';
  343. }
  344. if ($this->getNowPage() == $this->getTotalPage() || $this->getTotalPage() == 0){
  345. $html_page .= '<li>'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</li>';
  346. }else {
  347. $html_page .= '<li><a class="demo" href="'. $this->setShopPseudoStaticPageUrl($this->getNowPage()+1) .'">'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</a></li>';
  348. }
  349. $html_page .= '</ul>';
  350. break;
  351. case '5':
  352. $html_page .= '<ul>';
  353. if ($this->getNowPage() <= 1){
  354. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_home.$this->right_inside_a_html.'</li>';
  355. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</li>';
  356. }else {
  357. $html_page .= '<li><a class="demo" href="'. $this->setShopPseudoStaticPageUrl('1') .'">'.$this->left_inside_a_html.$this->pre_home.$this->right_inside_a_html.'</a></li>';
  358. $html_page .= '<li><a class="demo" href="'. $this->setShopPseudoStaticPageUrl($this->getNowPage()-1) .'">'.$this->left_inside_a_html.$this->pre_page.$this->right_inside_a_html.'</a></li>';
  359. }
  360. $html_page .= $this->getNowBar();
  361. if ($this->getNowPage() == $this->getTotalPage() || $this->getTotalPage() == 0){
  362. $html_page .= '<li>'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</li>';
  363. $html_page .= '<li>'.$this->left_inside_a_html.$this->pre_last.$this->right_inside_a_html.'</li>';
  364. }else {
  365. $html_page .= '<li><a class="demo" href="'. $this->setShopPseudoStaticPageUrl($this->getNowPage()+1) .'">'.$this->left_inside_a_html.$this->next_page.$this->right_inside_a_html.'</a></li>';
  366. $html_page .= '<li><a class="demo" href="'. $this->setShopPseudoStaticPageUrl($this->getTotalPage()) .'">'.$this->left_inside_a_html.$this->pre_last.$this->right_inside_a_html.'</a></li>';
  367. }
  368. $html_page .= '</ul>';
  369. break;
  370. default:
  371. break;
  372. }
  373. /**
  374. * 转码
  375. */
  376. /**
  377. if (strtoupper(CHARSET) == 'GBK' && !empty($html_page)){
  378. $html_page = iconv('UTF-8','GBK',$html_page);
  379. }
  380. */
  381. return $html_page;
  382. }
  383. /**
  384. * 页码条内容
  385. * 样式为: 前面2个页码 ... 中间7个页码 ...
  386. *
  387. * @param
  388. * @return string 字符串类型的返回结果
  389. */
  390. private function getNowBar(){
  391. /**
  392. * 显示效果
  393. * 中间显示7个,左右两个,不足则不显示省略号
  394. */
  395. /**
  396. * 判断当前页是否大于7
  397. */
  398. if ($this->getNowPage() >= 7){
  399. /**
  400. * 前面增加省略号,并且计算开始页码
  401. */
  402. $begin = $this->getNowPage()-2;
  403. }else {
  404. /**
  405. * 小于7,前面没有省略号
  406. */
  407. $begin = 1;
  408. }
  409. /**
  410. * 计算结束页码
  411. */
  412. if ($this->getNowPage()+5 < $this->getTotalPage()){
  413. /**
  414. * 增加省略号
  415. */
  416. $end = $this->getNowPage()+5;
  417. }else {
  418. $end = $this->getTotalPage();
  419. }
  420. /**
  421. * 整理整个页码样式
  422. */
  423. $result = '';
  424. if ($begin > 1){
  425. $result .= $this->setPageHtml(1,1).$this->setPageHtml(2,2);
  426. $result .= $this->left_ellipsis_html.'<span>...</span>'.$this->right_ellipsis_html;
  427. }
  428. /**
  429. * 中间部分内容
  430. */
  431. for ($i=$begin;$i<=$end;$i++){
  432. $result .= $this->setPageHtml($i,$i);
  433. }
  434. if ($end < $this->getTotalPage()){
  435. $result .= $this->left_ellipsis_html.'<span>...</span>'.$this->right_ellipsis_html;
  436. }
  437. return $result;
  438. }
  439. /**
  440. * 设置单个页码周围html代码
  441. *
  442. * @param string $page_name 页码显示内容
  443. * @param string $page 页码数
  444. * @return string 字符串类型的返回结果
  445. */
  446. private function setPageHtml($page_name,$page){
  447. /**
  448. * 判断是否是当前页
  449. */
  450. if ($this->getNowPage() == $page){
  451. $result = $this->left_current_html.$page.$this->right_current_html;
  452. }else {
  453. if (in_array($this->style, array(4,5))) { // 商城伪静态使用
  454. $result = $this->left_html."<a class='demo' href='". $this->setShopPseudoStaticPageUrl($page) ."'>".$this->left_inside_a_html.$page_name.$this->right_inside_a_html."</a>".$this->right_html;
  455. } else { // 普通分页使用
  456. $result = $this->left_html."<a class='demo' href='". $this->page_url . $page ."'>".$this->left_inside_a_html.$page_name.$this->right_inside_a_html."</a>".$this->right_html;
  457. }
  458. }
  459. return $result;
  460. }
  461. /**
  462. * 取url地址
  463. *
  464. * @param
  465. * @return string 字符串类型的返回结果
  466. */
  467. private function setPageUrl(){
  468. $uri = request_uri() ;
  469. $_SERVER['REQUEST_URI'] = $uri ;
  470. /**
  471. * 不存在QUERY_STRING时
  472. */
  473. if(empty($_SERVER['QUERY_STRING'])){
  474. $this->page_url = $_SERVER['REQUEST_URI']."?".$this->page_name."=";
  475. }else{
  476. if(stristr($_SERVER['QUERY_STRING'],$this->page_name.'=')){
  477. /**
  478. * 地址存在页面参数
  479. */
  480. $this->page_url = str_replace($this->page_name.'='.$this->now_page,'',$_SERVER['REQUEST_URI']);
  481. $last = $this->page_url[strlen($this->page_url)-1];
  482. if($last=='?' || $last=='&'){
  483. $this->page_url .= $this->page_name."=";
  484. }else{
  485. $this->page_url .= '&'.$this->page_name."=";
  486. }
  487. }else{
  488. $this->page_url = $_SERVER['REQUEST_URI'].'&'.$this->page_name.'=';
  489. }
  490. }
  491. return true;
  492. }
  493. /**
  494. * 取url地址
  495. *
  496. * @param int $page
  497. * @return string 字符串类型的返回结果
  498. */
  499. private function setShopPseudoStaticPageUrl($page){
  500. $param = $_GET;
  501. $act = $param['act'] == '' ? 'index' : $param['act'];
  502. unset($param['act']);
  503. $op = $param['op'] == '' ? 'index' : $param['op'];
  504. unset($param['op']);
  505. $param[$this->page_name] = $page;
  506. return urlShop($act, $op, $param);
  507. }
  508. }