page.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. <?php
  2. /**
  3. * 分页类
  4. *
  5. *
  6. * @package
  7. */
  8. defined('InShopNC') or exit('Access Invalid!');
  9. class Page
  10. {
  11. /**
  12. * url参数中页码参数名
  13. */
  14. private $page_name = 'curpage';
  15. /**
  16. * 信息总数
  17. */
  18. private $total_num = 1;
  19. /**
  20. * 页码链接
  21. */
  22. private $page_url = '';
  23. /**
  24. * 每页信息数量
  25. */
  26. private $each_num = 10;
  27. /**
  28. * 当前页码
  29. */
  30. private $now_page = 1;
  31. /**
  32. * 设置页码总数
  33. */
  34. private $total_page = 1;
  35. /**
  36. * 输出样式
  37. * 4、5为商城伪静态专用样式
  38. */
  39. private $style = 2;
  40. /**
  41. * ajax 分页 预留,目前先不使用
  42. * 0为不使用,1为使用,默认为0
  43. */
  44. private $ajax = 0;
  45. /**
  46. * 首页
  47. */
  48. private $pre_home = '';
  49. /**
  50. * 末页
  51. */
  52. private $pre_last = '';
  53. /**
  54. * 上一页
  55. */
  56. private $pre_page = '';
  57. /**
  58. * 下一页
  59. */
  60. private $next_page = '';
  61. /**
  62. * 页码 样式左边界符
  63. */
  64. private $left_html = '<li>';
  65. /**
  66. * 页码 样式右边界符
  67. */
  68. private $right_html = '</li>';
  69. /**
  70. * 选中样式左边界符
  71. */
  72. private $left_current_html = '<li>';
  73. /**
  74. * 选中样式右边界符
  75. */
  76. private $right_current_html = '</li>';
  77. /**
  78. * 省略号样式左边界符
  79. */
  80. private $left_ellipsis_html = '<li>';
  81. /**
  82. * 省略号样式右边界符
  83. */
  84. private $right_ellipsis_html = '</li>';
  85. /**
  86. * 在页码链接a内部的样式 <a>(样式名)页码(样式名)</a>
  87. */
  88. private $left_inside_a_html = '';
  89. /**
  90. * 在页码链接a内部的样式 <a>(样式名)页码(样式名)</a>
  91. */
  92. private $right_inside_a_html = '';
  93. /**
  94. * 构造函数
  95. *
  96. * 数据库使用到的方法:
  97. * $this->setTotalNum($total_num);
  98. * $this->getLimitStart();
  99. * $this->getLimitEnd();
  100. *
  101. * @param
  102. * @return
  103. */
  104. public function __construct(){
  105. Language::read('core_lang_index');
  106. $lang = Language::getLangContent();
  107. $this->pre_home = $lang['first_page'];
  108. $this->pre_last = $lang['last_page'];
  109. $this->pre_page = $lang['pre_page'];
  110. $this->next_page = $lang['next_page'];
  111. /**
  112. * 设置当前页码
  113. */
  114. $this->setNowPage($_GET[$this->page_name]);
  115. /**
  116. * 设置当前页面的页码url
  117. * 商城伪静态分页不需要使用这个方法
  118. */
  119. if (!in_array($this->style, array(4,5))) {
  120. $this->setPageUrl();
  121. }
  122. }
  123. /**
  124. * 取得属性
  125. *
  126. * @param string $key 属性键值
  127. * @return string 字符串类型的返回结果
  128. */
  129. public function get($key){
  130. return $this->$key;
  131. }
  132. /**
  133. * 设置属性
  134. *
  135. * @param string $key 属性键值
  136. * @param string $value 属性值
  137. * @return bool 布尔类型的返回结果
  138. */
  139. public function set($key,$value){
  140. return $this->$key = $value;
  141. }
  142. /**
  143. * 设置url页码参数名
  144. *
  145. * @param string $page_name url中传递页码的参数名
  146. * @return bool 布尔类型的返沪结果
  147. */
  148. public function setPageName($page_name){
  149. $this->page_name = $page_name;
  150. return true;
  151. }
  152. /**
  153. * 设置当前页码
  154. *
  155. * @param int $page 当前页数
  156. * @return bool 布尔类型的返回结果
  157. */
  158. public function setNowPage($page){
  159. $this->now_page = intval($page)>0?intval($page):1;
  160. return true;
  161. }
  162. /**
  163. * 设置每页数量
  164. *
  165. * @param int $num 每页显示的信息数
  166. * @return bool 布尔类型的返回结果
  167. */
  168. public function setEachNum($num){
  169. $this->each_num = intval($num)>0?intval($num):10;
  170. return true;
  171. }
  172. /**
  173. * 设置输出样式
  174. *
  175. * @param int $style 样式名
  176. * @return bool 布尔类型的返回结果
  177. */
  178. public function setStyle($style){
  179. $this->style = ($style == 'admin' ? 2:$style);
  180. return true;
  181. }
  182. /**
  183. * 设置信息总数
  184. *
  185. * @param int $total_num 信息总数
  186. * @return bool 布尔类型的返回结果
  187. */
  188. public function setTotalNum($total_num){
  189. $this->total_num = $total_num;
  190. return true;
  191. }
  192. /**
  193. * 取当前页码
  194. *
  195. * @param
  196. * @return int 整型类型的返回结果
  197. */
  198. public function getNowPage(){
  199. return $this->now_page;
  200. }
  201. /**
  202. * 取页码总数
  203. *
  204. * @param
  205. * @return int 整型类型的返回结果
  206. */
  207. public function getTotalPage(){
  208. $this->setTotalPage();
  209. return $this->total_page;
  210. }
  211. /**
  212. * 取信息总数
  213. *
  214. * @param
  215. * @return int 整型类型的返回结果
  216. */
  217. public function getTotalNum(){
  218. return $this->total_num;
  219. }
  220. /**
  221. * 取每页信息数量
  222. *
  223. * @param
  224. * @return int 整型类型的返回结果
  225. */
  226. public function getEachNum(){
  227. return $this->each_num;
  228. }
  229. /**
  230. * 取数据库select开始值
  231. *
  232. * @param
  233. * @return int 整型类型的返回结果
  234. */
  235. public function getLimitStart(){
  236. if ($this->getNowPage() <= 1){
  237. $tmp = 0;
  238. }else {
  239. $this->setTotalPage();
  240. $this->now_page = $this->now_page > $this->total_page ? $this->total_page : $this->now_page;
  241. $tmp = ($this->getNowPage()-1)*$this->getEachNum();
  242. }
  243. return $tmp;
  244. }
  245. /**
  246. * 取数据库select结束值
  247. *
  248. * @param
  249. * @return int 整型类型的返回结果
  250. */
  251. public function getLimitEnd(){
  252. $tmp = $this->getNowPage()*$this->getEachNum();
  253. if ($tmp > $this->getTotalNum()){
  254. $tmp = $this->getTotalNum();
  255. }
  256. return $tmp;
  257. }
  258. /**
  259. * 设置页码总数
  260. *
  261. * @param int $id 记录ID
  262. * @return array $rs_row 返回数组形式的查询结果
  263. */
  264. public function setTotalPage(){
  265. $this->total_page = ceil($this->getTotalNum()/$this->getEachNum());
  266. }
  267. /**
  268. * 输出html
  269. *
  270. * @param
  271. * @return string 字符串类型的返回结果
  272. */
  273. public function show($style = null)
  274. {
  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. */
  451. if ($this->getNowPage() == $page) {
  452. $result = $this->left_current_html . $page . $this->right_current_html;
  453. } elseif (in_array($this->style, [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. return $result;
  459. }
  460. /**
  461. * 取url地址
  462. *
  463. * @param
  464. * @return string 字符串类型的返回结果
  465. */
  466. private function setPageUrl()
  467. {
  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. } elseif (stristr($_SERVER['QUERY_STRING'], $this->page_name . '=')) {
  476. /**
  477. * 地址存在页面参数
  478. */
  479. $this->page_url = str_replace($this->page_name . '=' . $this->now_page, '', $_SERVER['REQUEST_URI']);
  480. $last = $this->page_url[strlen($this->page_url) - 1];
  481. if ($last == '?' || $last == '&') {
  482. $this->page_url .= $this->page_name . "=";
  483. } else {
  484. $this->page_url .= '&' . $this->page_name . "=";
  485. }
  486. } else {
  487. $this->page_url = $_SERVER['REQUEST_URI'] . '&' . $this->page_name . '=';
  488. }
  489. return true;
  490. }
  491. /**
  492. * 取url地址
  493. *
  494. * @param int $page
  495. * @return string 字符串类型的返回结果
  496. */
  497. private function setShopPseudoStaticPageUrl($page){
  498. $param = $_GET;
  499. $act = $param['act'] == '' ? 'index' : $param['act'];
  500. unset($param['act']);
  501. $op = $param['op'] == '' ? 'index' : $param['op'];
  502. unset($param['op']);
  503. $param[$this->page_name] = $page;
  504. return urlShop($act, $op, $param);
  505. }
  506. }