home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / Pager / Jumping.php < prev    next >
Encoding:
PHP Script  |  2008-07-02  |  9.2 KB  |  260 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
  3.  
  4. /**
  5.  * Contains the Pager_Jumping class
  6.  *
  7.  * PHP versions 4 and 5
  8.  *
  9.  * LICENSE: Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
  20.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  21.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
  23.  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  26.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * @category  HTML
  31.  * @package   Pager
  32.  * @author    Lorenzo Alberton <l.alberton@quipo.it>
  33.  * @author    Richard Heyes <richard@phpguru.org>
  34.  * @copyright 2003-2008 Lorenzo Alberton, Richard Heyes
  35.  * @license   http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
  36.  * @version   CVS: $Id: Jumping.php,v 1.20 2008/03/05 13:57:45 quipo Exp $
  37.  * @link      http://pear.php.net/package/Pager
  38.  */
  39.  
  40. /**
  41.  * require PEAR::Pager_Common base class
  42.  */
  43. require_once 'Pager/Common.php';
  44.  
  45. /**
  46.  * Pager_Jumping - Generic data paging class  ("jumping window" style)
  47.  * Handles paging a set of data. For usage see the example.php provided.
  48.  *
  49.  * @category  HTML
  50.  * @package   Pager
  51.  * @author    Lorenzo Alberton <l.alberton@quipo.it>
  52.  * @author    Richard Heyes <richard@phpguru.org>
  53.  * @copyright 2003-2008 Lorenzo Alberton, Richard Heyes
  54.  * @license   http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
  55.  * @link      http://pear.php.net/package/Pager
  56.  */
  57. class Pager_Jumping extends Pager_Common
  58. {
  59.     // {{{ Pager_Jumping()
  60.  
  61.     /**
  62.      * Constructor
  63.      *
  64.      * @param array $options Associative array of option names and their values
  65.      *
  66.      * @access public
  67.      */
  68.     function Pager_Jumping($options = array())
  69.     {
  70.         $err = $this->setOptions($options);
  71.         if ($err !== PAGER_OK) {
  72.             return $this->raiseError($this->errorMessage($err), $err);
  73.         }
  74.         $this->build();
  75.     }
  76.  
  77.     // }}}
  78.     // {{{ getPageIdByOffset()
  79.  
  80.     /**
  81.      * Returns pageID for given offset
  82.      *
  83.      * @param integer $index Offset to get pageID for
  84.      *
  85.      * @return int PageID for given offset
  86.      */
  87.     function getPageIdByOffset($index)
  88.     {
  89.         if (!isset($this->_pageData)) {
  90.             $this->_generatePageData();
  91.         }
  92.  
  93.         if (($index % $this->_perPage) > 0) {
  94.             $pageID = ceil((float)$index / (float)$this->_perPage);
  95.         } else {
  96.             $pageID = $index / $this->_perPage;
  97.         }
  98.         return $pageID;
  99.     }
  100.  
  101.     // }}}
  102.     // {{{ getPageRangeByPageId()
  103.  
  104.     /**
  105.      * Given a PageId, it returns the limits of the range of pages displayed.
  106.      * While getOffsetByPageId() returns the offset of the data within the
  107.      * current page, this method returns the offsets of the page numbers interval.
  108.      * E.g., if you have pageId=3 and delta=10, it will return (1, 10).
  109.      * PageID of 8 would give you (1, 10) as well, because 1 <= 8 <= 10.
  110.      * PageID of 11 would give you (11, 20).
  111.      * If the method is called without parameter, pageID is set to currentPage#.
  112.      *
  113.      * @param integer $pageid PageID to get offsets for
  114.      *
  115.      * @return array  First and last offsets
  116.      * @access public
  117.      */
  118.     function getPageRangeByPageId($pageid = null)
  119.     {
  120.         $pageid = isset($pageid) ? (int)$pageid : $this->_currentPage;
  121.         if (isset($this->_pageData[$pageid]) || is_null($this->_itemData)) {
  122.             // I'm sure I'm missing something here, but this formula works
  123.             // so I'm using it until I find something simpler.
  124.             $start = ((($pageid + (($this->_delta - ($pageid % $this->_delta))) % $this->_delta) / $this->_delta) - 1) * $this->_delta +1;
  125.             return array(
  126.                 max($start, 1),
  127.                 min($start+$this->_delta-1, $this->_totalPages)
  128.             );
  129.         } else {
  130.             return array(0, 0);
  131.         }
  132.     }
  133.  
  134.     // }}}
  135.     // {{{ getLinks()
  136.  
  137.     /**
  138.      * Returns back/next/first/last and page links,
  139.      * both as ordered and associative array.
  140.      *
  141.      * NB: in original PEAR::Pager this method accepted two parameters,
  142.      * $back_html and $next_html. Now the only parameter accepted is
  143.      * an integer ($pageID), since the html text for prev/next links can
  144.      * be set in the constructor. If a second parameter is provided, then
  145.      * the method act as it previously did. This hack's only purpose is to
  146.      * mantain backward compatibility.
  147.      *
  148.      * @param integer $pageID    Optional pageID. If specified, links for that 
  149.      *                           page are provided instead of current one.
  150.      *                           [ADDED IN NEW PAGER VERSION]
  151.      * @param string  $next_html HTML to put inside the next link
  152.      *                           [deprecated: use the factory instead]
  153.      *
  154.      * @return array Back/pages/next links
  155.      */
  156.     function getLinks($pageID=null, $next_html='')
  157.     {
  158.         //BC hack
  159.         if (!empty($next_html)) {
  160.             $back_html = $pageID;
  161.             $pageID    = null;
  162.         } else {
  163.             $back_html = '';
  164.         }
  165.  
  166.         if (!is_null($pageID)) {
  167.             $this->links = '';
  168.             if ($this->_totalPages > $this->_delta) {
  169.                 $this->links .= $this->_printFirstPage();
  170.             }
  171.  
  172.             $_sav = $this->_currentPage;
  173.             $this->_currentPage = $pageID;
  174.  
  175.             $this->links .= $this->_getBackLink('', $back_html);
  176.             $this->links .= $this->_getPageLinks();
  177.             $this->links .= $this->_getNextLink('', $next_html);
  178.             if ($this->_totalPages > $this->_delta) {
  179.                 $this->links .= $this->_printLastPage();
  180.             }
  181.         }
  182.  
  183.         $back        = str_replace(' ', '', $this->_getBackLink());
  184.         $next        = str_replace(' ', '', $this->_getNextLink());
  185.         $pages       = $this->_getPageLinks();
  186.         $first       = $this->_printFirstPage();
  187.         $last        = $this->_printLastPage();
  188.         $all         = $this->links;
  189.         $linkTags    = $this->linkTags;
  190.         $linkTagsRaw = $this->linkTagsRaw;
  191.  
  192.         if (!is_null($pageID)) {
  193.             $this->_currentPage = $_sav;
  194.         }
  195.  
  196.         return array(
  197.             $back,
  198.             $pages,
  199.             trim($next),
  200.             $first,
  201.             $last,
  202.             $all,
  203.             $linkTags,
  204.             'back'        => $back,
  205.             'pages'       => $pages,
  206.             'next'        => $next,
  207.             'first'       => $first,
  208.             'last'        => $last,
  209.             'all'         => $all,
  210.             'linktags'    => $linkTags,
  211.             'linkTagsRaw' => $linkTagsRaw,
  212.         );
  213.     }
  214.  
  215.     // }}}
  216.     // {{{ _getPageLinks()
  217.  
  218.     /**
  219.      * Returns pages link
  220.      *
  221.      * @param string $url URL to use in the link
  222.      *                    [deprecated: use the constructor instead]
  223.      *
  224.      * @return string Links
  225.      * @access private
  226.      */
  227.     function _getPageLinks($url = '')
  228.     {
  229.         //legacy setting... the preferred way to set an option now
  230.         //is adding it to the constuctor
  231.         if (!empty($url)) {
  232.             $this->_path = $url;
  233.         }
  234.  
  235.         //If there's only one page, don't display links
  236.         if ($this->_clearIfVoid && ($this->_totalPages < 2)) {
  237.             return '';
  238.         }
  239.  
  240.         $links = '';
  241.         $limits = $this->getPageRangeByPageId($this->_currentPage);
  242.  
  243.         for ($i=$limits[0]; $i<=min($limits[1], $this->_totalPages); $i++) {
  244.             if ($i != $this->_currentPage) {
  245.                 $this->range[$i] = false;
  246.                 $this->_linkData[$this->_urlVar] = $i;
  247.                 $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $i);
  248.             } else {
  249.                 $this->range[$i] = true;
  250.                 $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost;
  251.             }
  252.             $links .= $this->_spacesBefore
  253.                    . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : '');
  254.         }
  255.         return $links;
  256.     }
  257.  
  258.     // }}}
  259. }
  260. ?>