301 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 | |
| 
 | |
| /**
 | |
|  * Contains the Pager_Sliding class
 | |
|  *
 | |
|  * PHP versions 4 and 5
 | |
|  *
 | |
|  * LICENSE: Redistribution and use in source and binary forms, with or without
 | |
|  * modification, are permitted provided that the following conditions are met:
 | |
|  * 1. Redistributions of source code must retain the above copyright
 | |
|  *    notice, this list of conditions and the following disclaimer.
 | |
|  * 2. Redistributions in binary form must reproduce the above copyright
 | |
|  *    notice, this list of conditions and the following disclaimer in the
 | |
|  *    documentation and/or other materials provided with the distribution.
 | |
|  * 3. The name of the author may not be used to endorse or promote products
 | |
|  *    derived from this software without specific prior written permission.
 | |
|  *
 | |
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
 | |
|  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | |
|  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | |
|  * IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
 | |
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | |
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | |
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | |
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | |
|  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
|  *
 | |
|  * @category  HTML
 | |
|  * @package   Pager
 | |
|  * @author    Lorenzo Alberton <l.alberton@quipo.it>
 | |
|  * @copyright 2003-2008 Lorenzo Alberton
 | |
|  * @license   http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
 | |
|  * @version   CVS: $Id: Sliding.php,v 1.18 2008/01/06 13:36:22 quipo Exp $
 | |
|  * @link      http://pear.php.net/package/Pager
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * require PEAR::Pager_Common base class
 | |
|  */
 | |
| require_once 'Pager/Common.php';
 | |
| 
 | |
| /**
 | |
|  * Pager_Sliding - Generic data paging class  ("sliding window" style)
 | |
|  * Usage examples can be found in the PEAR manual
 | |
|  *
 | |
|  * @category  HTML
 | |
|  * @package   Pager
 | |
|  * @author    Lorenzo Alberton <l.alberton@quipo.it>
 | |
|  * @copyright 2003-2008 Lorenzo Alberton
 | |
|  * @license   http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
 | |
|  * @link      http://pear.php.net/package/Pager
 | |
|  */
 | |
| class Pager_Sliding extends Pager_Common
 | |
| {
 | |
|     // {{{ Pager_Sliding()
 | |
| 
 | |
|     /**
 | |
|      * Constructor
 | |
|      *
 | |
|      * @param array $options Associative array of option names and their values
 | |
|      *
 | |
|      * @access public
 | |
|      */
 | |
|     function __construct($options = array())
 | |
|     {
 | |
|         //set default Pager_Sliding options
 | |
|         $this->_delta                 = 2;
 | |
|         $this->_prevImg               = '«';
 | |
|         $this->_nextImg               = '»';
 | |
|         $this->_separator             = '|';
 | |
|         $this->_spacesBeforeSeparator = 3;
 | |
|         $this->_spacesAfterSeparator  = 3;
 | |
|         $this->_curPageSpanPre        = '<b>';
 | |
|         $this->_curPageSpanPost       = '</b>';
 | |
| 
 | |
|         //set custom options
 | |
|         $err = $this->setOptions($options);
 | |
|         if ($err !== PAGER_OK) {
 | |
|             return $this->raiseError($this->errorMessage($err), $err);
 | |
|         }
 | |
|         $this->build();
 | |
|     }
 | |
| 
 | |
|     // }}}
 | |
|     // {{{ getPageIdByOffset()
 | |
| 
 | |
|     /**
 | |
|      * "Overload" PEAR::Pager method. VOID. Not needed here...
 | |
|      *
 | |
|      * @param integer $index Offset to get pageID for
 | |
|      *
 | |
|      * @return void
 | |
|      * @deprecated
 | |
|      * @access public
 | |
|      */
 | |
|     function getPageIdByOffset($index)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     // }}}
 | |
|     // {{{ getPageRangeByPageId()
 | |
| 
 | |
|     /**
 | |
|      * Given a PageId, it returns the limits of the range of pages displayed.
 | |
|      * While getOffsetByPageId() returns the offset of the data within the
 | |
|      * current page, this method returns the offsets of the page numbers interval.
 | |
|      * E.g., if you have pageId=5 and delta=2, it will return (3, 7).
 | |
|      * PageID of 9 would give you (4, 8).
 | |
|      * If the method is called without parameter, pageID is set to currentPage#.
 | |
|      *
 | |
|      * @param integer $pageid PageID to get offsets for
 | |
|      *
 | |
|      * @return array  First and last offsets
 | |
|      * @access public
 | |
|      */
 | |
|     function getPageRangeByPageId($pageid = null)
 | |
|     {
 | |
|         $pageid = isset($pageid) ? (int)$pageid : $this->_currentPage;
 | |
|         if (!isset($this->_pageData)) {
 | |
|             $this->_generatePageData();
 | |
|         }
 | |
|         if (isset($this->_pageData[$pageid]) || is_null($this->_itemData)) {
 | |
|             if ($this->_expanded) {
 | |
|                 $min_surplus = ($pageid <= $this->_delta) ? ($this->_delta - $pageid + 1) : 0;
 | |
|                 $max_surplus = ($pageid >= ($this->_totalPages - $this->_delta)) ?
 | |
|                                 ($pageid - ($this->_totalPages - $this->_delta)) : 0;
 | |
|             } else {
 | |
|                 $min_surplus = $max_surplus = 0;
 | |
|             }
 | |
|             return array(
 | |
|                 max($pageid - $this->_delta - $max_surplus, 1),
 | |
|                 min($pageid + $this->_delta + $min_surplus, $this->_totalPages)
 | |
|             );
 | |
|         }
 | |
|         return array(0, 0);
 | |
|     }
 | |
| 
 | |
|     // }}}
 | |
|     // {{{ getLinks()
 | |
| 
 | |
|     /**
 | |
|      * Returns back/next/first/last and page links,
 | |
|      * both as ordered and associative array.
 | |
|      *
 | |
|      * @param integer $pageID Optional pageID. If specified, links for that page
 | |
|      *                        are provided instead of current one.
 | |
|      * @param string  $dummy  used to comply with parent signature (leave empty)
 | |
|      *
 | |
|      * @return array back/pages/next/first/last/all links
 | |
|      * @access public
 | |
|      */
 | |
|     function getLinks($pageID = null, $dummy='')
 | |
|     {
 | |
|         if (!is_null($pageID)) {
 | |
|             $_sav = $this->_currentPage;
 | |
|             $this->_currentPage = $pageID;
 | |
| 
 | |
|             $this->links = '';
 | |
|             if ($this->_totalPages > (2 * $this->_delta + 1)) {
 | |
|                 $this->links .= $this->_printFirstPage();
 | |
|             }
 | |
|             $this->links .= $this->_getBackLink();
 | |
|             $this->links .= $this->_getPageLinks();
 | |
|             $this->links .= $this->_getNextLink();
 | |
|             if ($this->_totalPages > (2 * $this->_delta + 1)) {
 | |
|                 $this->links .= $this->_printLastPage();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $back        = str_replace(' ', '', $this->_getBackLink());
 | |
|         $next        = str_replace(' ', '', $this->_getNextLink());
 | |
|         $pages       = $this->_getPageLinks();
 | |
|         $first       = $this->_printFirstPage();
 | |
|         $last        = $this->_printLastPage();
 | |
|         $all         = $this->links;
 | |
|         $linkTags    = $this->linkTags;
 | |
|         $linkTagsRaw = $this->linkTagsRaw;
 | |
| 
 | |
|         if (!is_null($pageID)) {
 | |
|             $this->_currentPage = $_sav;
 | |
|         }
 | |
| 
 | |
|         return array(
 | |
|             $back,
 | |
|             $pages,
 | |
|             trim($next),
 | |
|             $first,
 | |
|             $last,
 | |
|             $all,
 | |
|             $linkTags,
 | |
|             'back'        => $back,
 | |
|             'pages'       => $pages,
 | |
|             'next'        => $next,
 | |
|             'first'       => $first,
 | |
|             'last'        => $last,
 | |
|             'all'         => $all,
 | |
|             'linktags'    => $linkTags,
 | |
|             'linkTagsRaw' => $linkTagsRaw,
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     // }}}
 | |
|     // {{{ _getPageLinks()
 | |
| 
 | |
|     /**
 | |
|      * Returns pages link
 | |
|      *
 | |
|      * @param string $url URL string [deprecated]
 | |
|      *
 | |
|      * @return string Links
 | |
|      * @access private
 | |
|      */
 | |
|     function _getPageLinks($url = '')
 | |
|     {
 | |
|         //legacy setting... the preferred way to set an option now
 | |
|         //is adding it to the constuctor
 | |
|         if (!empty($url)) {
 | |
|             $this->_path = $url;
 | |
|         }
 | |
|         
 | |
|         //If there's only one page, don't display links
 | |
|         if ($this->_clearIfVoid && ($this->_totalPages < 2)) {
 | |
|             return '';
 | |
|         }
 | |
| 
 | |
|         $links = '';
 | |
|         if ($this->_totalPages > (2 * $this->_delta + 1)) {
 | |
|             if ($this->_expanded) {
 | |
|                 if (($this->_totalPages - $this->_delta) <= $this->_currentPage) {
 | |
|                     $expansion_before = $this->_currentPage - ($this->_totalPages - $this->_delta);
 | |
|                 } else {
 | |
|                     $expansion_before = 0;
 | |
|                 }
 | |
|                 for ($i = $this->_currentPage - $this->_delta - $expansion_before; $expansion_before; $expansion_before--, $i++) {
 | |
|                     $print_separator_flag = ($i != $this->_currentPage + $this->_delta); // && ($i != $this->_totalPages - 1)
 | |
|                     
 | |
|                     $this->range[$i] = false;
 | |
|                     $this->_linkData[$this->_urlVar] = $i;
 | |
|                     $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $i)
 | |
|                            . $this->_spacesBefore
 | |
|                            . ($print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $expansion_after = 0;
 | |
|             for ($i = $this->_currentPage - $this->_delta; ($i <= $this->_currentPage + $this->_delta) && ($i <= $this->_totalPages); $i++) {
 | |
|                 if ($i < 1) {
 | |
|                     ++$expansion_after;
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 // check when to print separator
 | |
|                 $print_separator_flag = (($i != $this->_currentPage + $this->_delta) && ($i != $this->_totalPages));
 | |
| 
 | |
|                 if ($i == $this->_currentPage) {
 | |
|                     $this->range[$i] = true;
 | |
|                     $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost;
 | |
|                 } else {
 | |
|                     $this->range[$i] = false;
 | |
|                     $this->_linkData[$this->_urlVar] = $i;
 | |
|                     $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $i);
 | |
|                 }
 | |
|                 $links .= $this->_spacesBefore
 | |
|                         . ($print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
 | |
|             }
 | |
| 
 | |
|             if ($this->_expanded && $expansion_after) {
 | |
|                 $links .= $this->_separator . $this->_spacesAfter;
 | |
|                 for ($i = $this->_currentPage + $this->_delta +1; $expansion_after; $expansion_after--, $i++) {
 | |
|                     $print_separator_flag = ($expansion_after != 1);
 | |
|                     $this->range[$i] = false;
 | |
|                     $this->_linkData[$this->_urlVar] = $i;
 | |
|                     $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $i)
 | |
|                       . $this->_spacesBefore
 | |
|                       . ($print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|         } else {
 | |
|             //if $this->_totalPages <= (2*Delta+1) show them all
 | |
|             for ($i=1; $i<=$this->_totalPages; $i++) {
 | |
|                 if ($i != $this->_currentPage) {
 | |
|                     $this->range[$i] = false;
 | |
|                     $this->_linkData[$this->_urlVar] = $i;
 | |
|                     $links .= $this->_renderLink(str_replace('%d', $i, $this->_altPage), $i);
 | |
|                 } else {
 | |
|                     $this->range[$i] = true;
 | |
|                     $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost;
 | |
|                 }
 | |
|                 $links .= $this->_spacesBefore
 | |
|                        . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : '');
 | |
|             }
 | |
|         }
 | |
|         return $links;
 | |
|     }
 | |
| 
 | |
|     // }}}
 | |
| }
 | |
| ?>
 |