乐观 发表于 2015-2-16 00:28:54

PHP编程:一个分页导航类

基础这个东西是个比较笼统的概念,如果你之前学习过c语言, c语言被认为是分页   <?php
// +----------------------------------------------------------------------+
// | PHP Version 4                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group                              |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license,      |
// | that is bundled with this package in the file LICENSE, and is      |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Richard Heyes <richard@phpguru.org>                         |
// +----------------------------------------------------------------------+

/**
* Pager class
*
* Handles paging a set of data. For usage see the example.php provided.
*
*/

class Pager {

    /**
    * Current page
    * @var integer
    */
    var $_currentPage;

    /**
    * Items per page
    * @var integer
    */
    var $_perPage;

    /**
    * Total number of pages
    * @var integer
    */
    var $_totalPages;

    /**
    * Item data. Numerically indexed array...
    * @var array
    */
    var $_itemData;

    /**
    * Total number of items in the data
    * @var integer
    */
    var $_totalItems;

    /**
    * Page data generated by this class
    * @var array
    */
    var $_pageData;

    /**
    * Constructor
    *
    * Sets up the object and calculates the total number of items.
    *
    * @param $params An associative array of parameters This can contain:
    *                  currentPage   Current Page number (optional)
    *                  perPage       Items per page (optional)
    *                  itemData      Data to page
    */
    function pager($params = array())
    {
      global $HTTP_GET_VARS;

      $this->_currentPage = max((int)@$HTTP_GET_VARS['pageID'], 1);
      $this->_perPage   = 8;
      $this->_itemData    = array();

      foreach ($params as $name => $value) {
            $this->{'_' . $name} = $value;
      }

      $this->_totalItems = count($this->_itemData);
    }

    /**
    * Returns an array of current pages data
    *
    * @param $pageID Desired page ID (optional)
    * @return array Page data
    */
    function getPageData($pageID = null)
    {
      if (isset($pageID)) {
            if (!empty($this->_pageData[$pageID])) {
                return $this->_pageData[$pageID];
            } else {
                return FALSE;
            }
      }

      if (!isset($this->_pageData)) {
            $this->_generatePageData();
      }

      return $this->getPageData($this->_currentPage);
    }

    /**
    * Returns pageID for given offset
    *
    * @param $index Offset to get pageID for
    * @return int PageID for given offset
    */
    function getPageIdByOffset($index)
    {
      if (!isset($this->_pageData)) {
            $this->_generatePageData();
      }

      if (($index % $this->_perPage) > 0) {
            $pageID = ceil((float)$index / (float)$this->_perPage);
      } else {
            $pageID = $index / $this->_perPage;
      }

      return $pageID;
    }

    /**
    * Returns offsets for given pageID. Eg, if you
    * pass it pageID one and your perPage limit is 10
    * it will return you 1 and 10. PageID of 2 would
    * give you 11 and 20.
    *
    * @params pageID PageID to get offsets for
    * @return arrayFirst and last offsets
    */
    function getOffsetByPageId($pageid = null)
    {
      $pageid = isset($pageid) ? $pageid : $this->_currentPage;
      if (!isset($this->_pageData)) {
            $this->_generatePageData();
      }

      if (isset($this->_pageData[$pageid])) {
            return array(($this->_perPage * ($pageid - 1)) + 1, min($this->_totalItems, $this->_perPage * $pageid));
      } else {
            return array(0,0);
      }
    }

    /**
    * Returns back/next and page links
    *
    * @param$back_html HTML to put inside the back link
    * @param$next_html HTML to put inside the next link
    * @return array Back/pages/next links
    */
    function getLinks($back_html = '<< Back', $next_html = 'Next >>')
    {
      $url   = $this->_getLinksUrl();
      $back= $this->_getBackLink($url, $back_html);
      $pages = $this->_getPageLinks($url);
      $next= $this->_getNextLink($url, $next_html);

      return array($back, $pages, $next, 'back' => $back, 'pages' => $pages, 'next' => $next);
    }

    /**
    * Returns number of pages
    *
    * @return int Number of pages
    */
    function numPages()
    {
      return $this->_totalPages;
    }

    /**
    * Returns whether current page is first page
    *
    * @return bool First page or not
    */
    function isFirstPage()
    {
      return ($this->_currentPage == 1);
    }

    /**
    * Returns whether current page is last page
    *
    * @return bool Last page or not
    */
    function isLastPage()
    {
      return ($this->_currentPage == $this->_totalPages);
    }

    /**
    * Returns whether last page is complete
    *
    * @return bool Last age complete or not
    */
    function isLastPageComplete()
    {
      return !($this->_totalItems % $this->_perPage);
    }

    /**
    * Calculates all page data
    */
    function _generatePageData()
    {
      $this->_totalItems = count($this->_itemData);
      $this->_totalPages = ceil((float)$this->_totalItems / (float)$this->_perPage);
      $i = 1;
      if (!empty($this->_itemData)) {
            foreach ($this->_itemData as $value) {
                $this->_pageData[$i][] = $value;
                if (count($this->_pageData[$i]) >= $this->_perPage) {
                  $i++;
                }
            }
      } else {
            $this->_pageData = array();
      }
    }

    /**
    * Returns the correct link for the back/pages/next links
    *
    * @return string Url
    */
    function _getLinksUrl()
    {
      global $HTTP_SERVER_VARS;

      // Sort out query string to prevent messy urls
      $querystring = array();
      if (!empty($HTTP_SERVER_VARS['QUERY_STRING'])) {
            $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);            
            for ($i = 0, $cnt = count($qs); $i < $cnt; $i++) {
                list($name, $value) = explode('=', $qs[$i]);
                if ($name != 'pageID') {
                  $qs[$name] = $value;
                }
                unset($qs[$i]);
            }
      }
    if(is_array($qs)){
            foreach ($qs as $name => $value) {
                $querystring[] = $name . '=' . $value;
            }   
    }
      return $HTTP_SERVER_VARS['SCRIPT_NAME'] . '?' . implode('&', $querystring) . (!empty($querystring) ? '&' : '') . 'pageID=';
    }

    /**
    * Returns back link
    *
    * @param $urlURL to use in the link
    * @param $link HTML to use as the link
    * @return string The link
    */
    function _getBackLink($url, $link = '<< Back')
    {
      // Back link
      if ($this->_currentPage > 1) {
            $back = '<a href="' . $url . ($this->_currentPage - 1) . '">' . $link . '</a>';
      } else {
            $back = '';
      }
      
      return $back;
    }

    /**
    * Returns pages link
    *
    * @param $urlURL to use in the link
    * @return string Links
    */
    function _getPageLinks($url)
    {
      // Create the range
      $params['itemData'] = range(1, max(1, $this->_totalPages));
      $pager =& new Pager($params);
      $links =$pager->getPageData($pager->getPageIdByOffset($this->_currentPage));

      for ($i=0; $i<count($links); $i++) {
            if ($links[$i] != $this->_currentPage) {
                $links[$i] = '<a href="' . $this->_getLinksUrl() . $links[$i] . '">' . $links[$i] . '</a>';
            }
      }

      return implode(' ', $links);
    }

    /**
    * Returns next link
    *
    * @param $urlURL to use in the link
    * @param $link HTML to use as the link
    * @return string The link
    */
    function _getNextLink($url, $link = 'Next >>')
    {
      if ($this->_currentPage < $this->_totalPages) {
            $next = '<a href="' . $url . ($this->_currentPage + 1) . '">' . $link . '</a>';
      } else {
            $next = '';
      }

      return $next;
    }
}

?>总的来说,在这一个月左右的时间中,学到的不少,但是也遇到不少的问题,比如批量图片的上传,一直到现在也不懂,如何实现动态的增加上传图片的数量。

小女巫 发表于 2015-2-16 04:45:49

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

蒙在股里 发表于 2015-2-21 23:28:48

Ps:以上纯属原创,如有雷同,纯属巧合

不帅 发表于 2015-3-6 22:06:45

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

小妖女 发表于 2015-3-17 11:07:05

当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,

爱飞 发表于 2015-3-19 23:39:29

微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。

柔情似水 发表于 2015-3-24 09:45:03

你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。

admin 发表于 2015-3-30 02:47:01

装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。

山那边是海 发表于 2015-3-30 20:49:51

我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。

飘飘悠悠 发表于 2015-4-3 21:50:31

作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。

灵魂腐蚀 发表于 2015-4-9 14:53:44

php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)

兰色精灵 发表于 2015-4-14 08:25:41

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

透明 发表于 2015-4-15 21:09:48

写的比较杂,因为我也是个新手,不当至于大家多多指正。

小魔女 发表于 2015-4-18 05:44:07

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

活着的死人 发表于 2015-4-24 14:08:52

Ps:以上纯属原创,如有雷同,纯属巧合

分手快乐 发表于 2015-6-13 22:17:15

对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。

只想知道 发表于 2015-6-23 21:29:08

我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。

谁可相欹 发表于 2015-7-4 02:55:06

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

再现理想 发表于 2015-7-8 22:17:18

实践是检验自己会不会的真理。

第二个灵魂 发表于 2015-7-13 23:31:21

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
页: [1]
查看完整版本: PHP编程:一个分页导航类