home *** CD-ROM | disk | FTP | other *** search
- <?php
- // +----------------------------------------------------------------------+
- // | PEAR :: Pager_Sliding |
- // +----------------------------------------------------------------------+
- // | Copyright (c) 1997-2002 The PHP Group |
- // +----------------------------------------------------------------------+
- // | This source file is subject to version 2.0 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. |
- // +----------------------------------------------------------------------+
- // | Author: Lorenzo Alberton <l.alberton at quipo.it> |
- // +----------------------------------------------------------------------+
- //
- // $Id: Sliding.php,v 1.19 2003/12/16 20:48:49 quipo Exp $
- /**
- * File Sliding.php
- *
- * @package Pager_Sliding
- */
- /**
- * Two constants used to guess the path- and file-name of the page
- * when the user doesn't set any pther value
- */
- define('CURRENT_FILENAME', basename($_SERVER['PHP_SELF']));
- define('CURRENT_PATHNAME', str_replace('\\', '/', dirname($_SERVER['PHP_SELF'])));
- /**
- * Error codes
- */
- if (!defined('ERROR_PAGER_SLIDING_INVALID')) {
- define('ERROR_PAGER_SLIDING_INVALID', -1);
- }
- /**
- * Pager_Sliding - Generic data paging class ("sliding window" style)
- *
- * Usage examples can be found in the doc provided
- *
- * @author Lorenzo Alberton <l.alberton at quipo.it>
- * @version $Id: Sliding.php,v 1.19 2003/12/16 20:48:49 quipo Exp $
- * @package Pager_Sliding
- */
- class Pager_Sliding
- {
-
- // {{{ private class vars
-
- /**
- * @var integer number of items
- * @access private
- */
- var $_totalItems;
-
- /**
- * @var integer number of items per page
- * @access private
- */
- var $_perPage = 10;
-
- /**
- * @var integer number of page links before and after the current one
- * @access private
- */
- var $_delta = 2;
-
- /**
- * @var integer current page number
- * @access private
- */
- var $_currentPage = 1;
-
- /**
- * @var string CSS class for links
- * @access private
- */
- var $_linkClass = '';
-
- /**
- * @var string wrapper for CSS class name
- * @access private
- */
- var $_classString = '';
-
- /**
- * @var string path name
- * @access private
- */
- var $_path = CURRENT_PATHNAME;
-
- /**
- * @var string file name
- * @access private
- */
- var $_fileName = CURRENT_FILENAME;
-
- /**
- * @var boolean you have to use FALSE with mod_rewrite
- * @access private
- */
- var $_append = true;
-
- /**
- * @var string name of the querystring var for pageID
- * @access private
- */
- var $_urlVar = 'pageID';
-
- /**
- * @var string name of the url without the pageID number
- * @access private
- */
- var $_url = '';
-
- /**
- * @var string alt text for "previous page"
- * @access private
- */
- var $_altPrev = 'previous page';
-
- /**
- * @var string alt text for "next page"
- * @access private
- */
- var $_altNext = 'next page';
-
- /**
- * @var string alt text for "page"
- * @access private
- */
- var $_altPage = 'page';
-
- /**
- * @var string image/text to use as "prev" link
- * @access private
- */
- var $_prevImg = '«';
-
- /**
- * @var string image/text to use as "next" link
- * @access private
- */
- var $_nextImg = '»';
-
- /**
- * @var boolean TRUE => expanded mode
- * @access private
- */
- var $_expanded = true;
-
- /**
- * @var string link separator
- * @access private
- */
- var $_separator = '|';
-
- /**
- * @var integer number of spaces before separator
- * @access private
- */
- var $_spacesBeforeSeparator = 3;
-
- /**
- * @var integer number of spaces after separator
- * @access private
- */
- var $_spacesAfterSeparator = 3;
-
- /**
- * @var string CSS class name for current page link
- * @access private
- */
- var $_curPageLinkClassName = '';
-
- /**
- * @var string Text before current page link
- * @access private
- */
- var $_curPageSpanPre = '<b><u>';
-
- /**
- * @var string Text after current page link
- * @access private
- */
- var $_curPageSpanPost = '</u></b>';
-
- /**
- * @var string Text before first page link
- * @access private
- */
- var $_firstPagePre = '[';
-
- /**
- * @var string Text to be used for first page link
- * @access private
- */
- var $_firstPageText = '';
-
- /**
- * @var string Text after first page link
- * @access private
- */
- var $_firstPagePost = ']';
-
- /**
- * @var string Text before last page link
- * @access private
- */
- var $_lastPagePre = '[';
-
- /**
- * @var string Text to be used for last page link
- * @access private
- */
- var $_lastPageText = '';
-
- /**
- * @var string Text after last page link
- * @access private
- */
- var $_lastPagePost = ']';
-
- /**
- * @var string Will contain the HTML code for the spaces
- * @access private
- */
- var $_spacesBefore = '';
-
- /**
- * @var string Will contain the HTML code for the spaces
- * @access private
- */
- var $_spacesAfter = '';
-
- /**
- * @var array data to be paged
- * @access private
- */
- var $_itemData = null;
-
- /**
- * @var boolean If TRUE and there's only one page, links aren't shown
- * @access private
- */
- var $_clearIfVoid = true;
-
- /**
- * @var boolean Use session for storing the number of items per page
- * @access private
- */
- var $_useSessions = false;
-
- /**
- * @var boolean Close the session when finished reading/writing data
- * @access private
- */
- var $_closeSession = false;
-
- /**
- * @var string name of the session var for number of items per page
- * @access private
- */
- var $_sessionVar = 'setPerPage';
-
- /**
- * Pear error mode (when raiseError is called)
- * (see PEAR doc)
- *
- * @var int $_pearErrorMode
- */
- var $_pearErrorMode = null;
-
- // }}}
-
- /**
- * @var string Complete set of links
- * @access public
- */
- var $links = '';
-
- /**
- * @var array Array with a key => value pair representing
- * page# => bool value (true if key==currentPageNumber).
- * can be used for extreme customization.
- * @access public
- */
- var $range = array();
-
- // {{{ Pager_Sliding()
-
- /**
- * Constructor
- *
- * -------------------------------------------------------------------------
- * VALID options are (default values are set some lines before):
- * - totalItems (int): # of items to page.
- * - perPage (int): # of items per page.
- * - delta (int): # of page #s to show before and after the current
- * one
- * - expanded (bool): if true, window size is always 2*delta+1
- * - linkClass (string): name of CSS class used for link styling.
- * - append (bool): if true pageID is appended as GET value to the
- * URL - if false it is embedded in the URL
- * according to "fileName" specs
- * - path (string): complete path to the page (without the page name)
- * - fileName (string): name of the page, with a %d if append=true
- * - urlVar (string): name of pageNumber URL var, for example "pageID"
- * - altPrev (string): alt text to display for prev page, on prev link.
- * - altNext (string): alt text to display for next page, on next link.
- * - altPage (string): alt text to display before the page number.
- * - prevImg (string): sth (it can be text such as "<< PREV" or an
- * <img/> as well...) to display instead of "<<".
- * - nextImg (string): same as prevImg, used for NEXT link, instead of
- * the default value, which is ">>".
- * - separator (string): what to use to separate numbers (can be an
- * <img/>, a comma, an hyphen, or whatever.
- * - spacesBeforeSeparator
- * (int): number of spaces before the separator.
- * - firstPagePre (string):
- * string used before first page number (can be an
- * <img/>, a "{", an empty string, or whatever.
- * - firstPageText (string):
- * string used in place of first page number
- * - firstPagePost (string):
- * string used after first page number (can be an
- * <img/>, a "}", an empty string, or whatever.
- * - lastPagePre (string):
- * similar to firstPagePre.
- * - lastPageText (string):
- * similar to firstPageText.
- * - lastPagePost (string):
- * similar to firstPagePost.
- * - spacesAfterSeparator
- * (int): number of spaces after the separator.
- * - curPageLinkClassName
- * (string): name of CSS class used for current page link.
- * - clearIfVoid(bool): if there's only one page, don't display pager.
- * - itemData (array): array of items to page.
- * - useSessions (bool): if true, number of items to display per page is
- * stored in the $_SESSION[$_sessionVar] var.
- * - closeSession (bool): if true, the session is closed just after R/W.
- * - sessionVar (string): name of the session var for perPage value.
- * A value != from default can be useful when
- * using more than one Pager istance in the page.
- * - pearErrorMode (constant):
- * PEAR_ERROR mode for raiseError().
- * Default is PEAR_ERROR_RETURN.
- * -------------------------------------------------------------------------
- * REQUIRED options are:
- * - fileName IF append==false (default is true)
- * - itemData OR totalItems (if itemData is set, totalItems is overwritten)
- * -------------------------------------------------------------------------
- *
- * @param mixed $options An associative array of option names and
- * their values.
- * @access public
- */
- function Pager_Sliding($options = array())
- {
- $this->_setOptions($options);
- $this->_generatePageData();
- $this->_setFirstLastText();
-
- 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();
- }
- }
-
- // }}}
- // {{{ getPageData()
-
- /**
- * Returns an array of current pages data
- *
- * @param $pageID Desired page ID (optional)
- * @return array Page data
- * @access public
- */
- 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);
- }
-
- // }}}
- // {{{ getPageIdByOffset()
-
- /**
- * "Overload" PEAR::Pager method. VOID. Not needed here...
- * @param integer $index Offset to get pageID for
- * @deprecated
- * @access public
- */
- function getPageIdByOffset($index = null) { }
-
- // }}}
- // {{{ getOffsetByPageId()
-
- /**
- * 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.
- *
- * @param integer PageID to get offsets for
- * @return array First and last offsets
- * @access public
- */
- function getOffsetByPageId($pageid = null)
- {
- $pageid = isset($pageid) ? $pageid : $this->_currentPage;
- if (!isset($this->_pageData)) {
- $this->_generatePageData();
- }
-
- if (isset($this->_pageData[$pageid]) || is_null($this->_itemData)) {
- return array(
- max(($this->_perPage * ($pageid - 1)) + 1, 1),
- min($this->_totalItems, $this->_perPage * $pageid)
- );
- } else {
- return array(0, 0);
- }
- }
-
- // }}}
- // {{{ 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 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 = 0;
- $max_surplus = 0;
- }
- return array( max($pageid - $this->_delta - $max_surplus, 1),
- min($pageid + $this->_delta + $min_surplus, $this->_totalPages));
- } else {
- return array(0, 0);
- }
- }
-
- // }}}
- // {{{ getCurrentPageID()
-
- /**
- * Returns ID of current page
- *
- * @return integer ID of current page
- * @access public
- */
- function getCurrentPageID()
- {
- return $this->_currentPage;
- }
-
- // }}}
- // {{{ getNextPageID()
-
- /**
- * Returns next page ID. If current page is last page
- * this function returns FALSE
- *
- * @return mixed Next pages' ID
- * @access public
- */
- function getNextPageID()
- {
- return ($this->_currentPage == $this->_totalPages ?
- false : $this->_currentPage + 1);
- }
-
- // }}}
- // {{{ getPreviousPageID()
-
- /**
- * Returns previous page ID. If current page is first page
- * this function returns FALSE
- *
- * @return mixed Previous pages' ID
- * @access public
- */
- function getPreviousPageID()
- {
- return $this->isFirstPage() ? false : $this->getCurrentPageID() - 1;
- }
-
- // }}}
- // {{{ numItems()
-
- /**
- * Returns number of items
- *
- * @return int Number of items
- * @access public
- */
- function numItems()
- {
- return $this->_totalItems;
- }
-
- // }}}
- // {{{ numPages()
-
- /**
- * Returns number of pages
- *
- * @return int Number of pages
- * @access public
- */
- function numPages()
- {
- return (int)$this->_totalPages;
- }
-
- // }}}
- // {{{ isFirstPage()
-
- /**
- * Returns whether current page is first page
- *
- * @return bool First page or not
- * @access public
- */
- function isFirstPage()
- {
- return ($this->_currentPage < 2);
- }
-
- // }}}
- // {{{ isLastPage()
-
- /**
- * Returns whether current page is last page
- *
- * @return bool Last page or not
- * @access public
- */
- function isLastPage()
- {
- return ($this->_currentPage == $this->_totalPages);
- }
-
- // }}}
- // {{{ isLastPageComplete()
-
- /**
- * Returns whether last page is complete
- *
- * @return bool Last page complete or not
- * @access public
- */
- function isLastPageComplete()
- {
- return !($this->_totalItems % $this->_perPage);
- }
-
- // }}}
- // {{{ 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.
- * @return array back/pages/next/first/last/all links
- * @access public
- */
- function getLinks($pageID = null)
- {
- 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;
-
- if ($pageID != null) {
- $this->_currentPage = $_sav;
- }
-
- return array(
- $back,
- $pages,
- trim($next),
- $first,
- $last,
- $all,
- 'back' => $back,
- 'pages' => $pages,
- 'next' => $next,
- 'first' => $first,
- 'last' => $last,
- 'all' => $all
- );
- }
-
- // }}}
- // {{{ getPerPageSelectBox()
-
- /**
- * Returns a string with a XHTML SELECT menu,
- * useful for letting the user choose how many items per page should be
- * displayed. If parameter useSessions is TRUE, this value is stored in
- * a session var. The string isn't echoed right now so you can use it
- * with template engines.
- *
- * @param integer $start
- * @param integer $end
- * @param integer $step
- * @return string xhtml select box
- * @access public
- */
- function getPerPageSelectBox($start=5, $end=30, $step=5)
- {
- $start = (int)$start;
- $end = (int)$end;
- $step = (int)$step;
- if (!empty($_SESSION[$this->_sessionVar])) {
- $selected = (int)$_SESSION[$this->_sessionVar];
- } else {
- $selected = $start;
- }
-
- $tmp = '<select name="'.$this->_sessionVar.'">';
- for ($i=$start; $i<=$end; $i+=$step) {
- $tmp .= '<option value="'.$i.'"';
- if ($i == $selected) {
- $tmp .= ' selected="selected"';
- }
- $tmp .= '>'.$i.'</option>';
- }
- $tmp .= '</select>';
- return $tmp;
- }
-
- // }}}
- // {{{ _getPageLinks()
-
- /**
- * Returns pages link
- *
- * @return string Links
- * @access private
- */
- function _getPageLinks()
- {
- $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++) {
- if (($i != $this->_currentPage + $this->_delta)){ // && ($i != $this->_totalPages - 1)) {
- $_print_separator_flag = true;
- } else {
- $_print_separator_flag = false;
- }
-
- $this->range[$i] = false;
- $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
- ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
- $this->_classString,
- $this->_altPage.' '.$i,
- $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
- if (($i != $this->_currentPage + $this->_delta) && ($i != $this->_totalPages )) {
- $_print_separator_flag = true;
- } else {
- $_print_separator_flag = false;
- }
-
- if ($i == $this->_currentPage) {
- $this->range[$i] = true;
- $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost
- . $this->_spacesBefore
- . ($_print_separator_flag ? $this->_separator.$this->_spacesAfter : '');
- } else {
- $this->range[$i] = false;
- $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
- ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
- $this->_classString,
- $this->_altPage.' '.$i,
- $i)
- . $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++) {
- if (($_expansion_after != 1)) {
- $_print_separator_flag = true;
- } else {
- $_print_separator_flag = false;
- }
-
- $this->range[$i] = false;
- $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
- ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
- $this->_classString,
- $this->_altPage.' '.$i,
- $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;
- $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
- ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
- $this->_classString,
- $this->_altPage.' '.$i,
- $i);
- } else {
- $this->range[$i] = true;
- $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost;
- }
- $links .= $this->_spacesBefore
- . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : '');
- }
- }
-
- if ($this->_clearIfVoid) {
- //If there's only one page, don't display links
- if ($this->_totalPages < 2) $links = '';
- }
-
- return $links;
- }
-
- // }}}
- // {{{ _getBackLink()
-
- /**
- * Returns back link
- *
- * @param string $url URL to use in the link
- * @param string $link HTML to use as the link
- * @return string The link
- * @access private
- */
- function _getBackLink() //function _getBackLink($url, $link = '<< Back')
- {
- if ($this->_currentPage > 1) {
- $back = sprintf('<a href="%s" %s title="%s">%s</a>',
- ( $this->_append ? $this->_url.$this->getPreviousPageID() :
- $this->_url.sprintf($this->_fileName, $this->getPreviousPageID()) ),
- $this->_classString,
- $this->_altPrev,
- $this->_prevImg)
- . $this->_spacesBefore . $this->_spacesAfter;
- } else {
- $back = '';
- }
- return $back;
- }
-
- // }}}
- // {{{ _getNextLink()
-
- /**
- * Returns next link
- *
- * @return string The link
- * @access private
- */
- function _getNextLink() //function _getNextLink($url, $link = 'Next >>')
- {
- if ($this->_currentPage < $this->_totalPages) {
- $next = $this->_spacesAfter
- . sprintf('<a href="%s" %s title="%s">%s</a>',
- ( $this->_append ? $this->_url.$this->getNextPageID() :
- $this->_url.sprintf($this->_fileName, $this->getNextPageID()) ),
- $this->_classString,
- $this->_altNext,
- $this->_nextImg)
- . $this->_spacesBefore . $this->_spacesAfter;
- } else {
- $next = '';
- }
- return $next;
- }
-
- // }}}
- // {{{ _printFirstPage()
-
- /**
- * Print [1]
- *
- * @return string String with link to 1st page,
- * or empty string if this is the 1st page.
- * @access private
- */
- function _printFirstPage()
- {
- if ($this->isFirstPage()) {
- return '';
- } else {
- return sprintf('<a href="%s" %s title="%s">%s%s%s</a>',
- ( $this->_append ? $this->_url.'1' : $this->_url.sprintf($this->_fileName, 1) ),
- $this->_classString,
- $this->_altPage.' 1',
- $this->_firstPagePre,
- $this->_firstPageText,
- $this->_firstPagePost)
- . $this->_spacesBefore . $this->_spacesAfter;
-
- }
- }
-
- // }}}
- // {{{ _printLastPage()
-
- /**
- * Print [numPages()]
- *
- * @return string String with link to last page,
- * or empty string if this is the 1st page.
- * @access private
- */
- function _printLastPage()
- {
- if ($this->isLastPage()) {
- return '';
- } else {
- return sprintf('<a href="%s" %s title="%s">%s%s%s</a>',
- ( $this->_append ? $this->_url.$this->_totalPages : $this->_url.sprintf($this->_fileName, $this->_totalPages) ),
- $this->_classString,
- $this->_altPage.' '.$this->_totalPages,
- $this->_lastPagePre,
- $this->_lastPageText,
- $this->_lastPagePost);
- }
- }
-
- // }}}
- // {{{ _generatePageData()
-
- /**
- * Calculates all page data
- *
- * @access private
- */
- function _generatePageData()
- {
- // Been supplied an array of data?
- if (!is_null($this->_itemData)) {
- $this->_totalItems = count($this->_itemData);
- }
- $this->_totalPages = ceil((float)$this->_totalItems / (float)$this->_perPage);
- $i = 1;
- if (!empty($this->_itemData)) {
- foreach ($this->_itemData as $key => $value) {
- $this->_pageData[$i][$key] = $value;
- if (count($this->_pageData[$i]) >= $this->_perPage) {
- $i++;
- }
- }
- } else {
- $this->_pageData = array();
- }
-
- //prevent URL manual modification
- $this->_currentPage = min($this->_currentPage, $this->_totalPages);
- }
-
-
- // }}}
- // {{{ _setFirstLastText()
-
- /**
- * sets the private _firstPageText, _lastPageText variables
- * based on whether they were set in the options
- *
- * @access private
- */
- function _setFirstLastText()
- {
- if ($this->_firstPageText == '') {
- $this->_firstPageText = '1';
- }
-
- if ($this->_lastPageText == '') {
- $this->_lastPageText = $this->_totalPages;
- }
- }
-
- // }}}
- // {{{ _getLinksUrl()
-
- /**
- * Returns the correct link for the back/pages/next links
- *
- * @return string Url
- * @access private
- */
- function _getLinksUrl()
- {
- // Sort out query string to prevent messy urls
- $querystring = array();
- $qs = array();
- if (!empty($_SERVER['QUERY_STRING'])) {
- $qs = explode('&', str_replace('&', '&', $_SERVER['QUERY_STRING']));
- for ($i=0, $cnt=count($qs); $i<$cnt; $i++) {
- list($name, $value) = explode('=', $qs[$i]);
- if ($name != $this->_urlVar) {
- $qs[$name] = $value;
- }
- unset($qs[$i]);
- }
- }
-
- foreach ($qs as $name => $value) {
- $querystring[] = $name . '=' . $value;
- }
-
- return '?' . implode('&', $querystring) . (!empty($querystring) ? '&' : '') . $this->_urlVar .'=';
- }
-
-
- // }}}
- // {{{ raiseError()
-
- /**
- * conditionally includes PEAR base class and raise an error
- *
- * @param string $msg Error message
- * @param int $code Error code
- * @access private
- */
- function raiseError($msg, $code)
- {
- include_once 'PEAR.php';
- if (empty($this->_pearErrorMode)) {
- $this->_pearErrorMode = PEAR_ERROR_RETURN;
- }
- PEAR::raiseError($msg, $code, $this->_pearErrorMode);
- }
-
- // }}}
- // {{{ _setOptions()
-
- /**
- * Set and sanitize options
- *
- * @param mixed $options An associative array of option names and
- * their values.
- * @access private
- */
- function _setOptions($options)
- {
- $allowed_options = array(
- 'totalItems',
- 'perPage',
- 'delta',
- 'linkClass',
- 'path',
- 'fileName',
- 'append',
- 'urlVar',
- 'altPrev',
- 'altNext',
- 'altPage',
- 'prevImg',
- 'nextImg',
- 'expanded',
- 'separator',
- 'spacesBeforeSeparator',
- 'spacesAfterSeparator',
- 'curPageLinkClassName',
- 'firstPagePre',
- 'firstPageText',
- 'firstPagePost',
- 'lastPagePre',
- 'lastPageText',
- 'lastPagePost',
- 'itemData',
- 'clearIfVoid',
- 'useSessions',
- 'closeSession',
- 'sessionVar',
- 'pearErrorMode'
- );
-
- foreach ($options as $key => $value) {
- if (in_array($key, $allowed_options) && ($value !== null)) {
- $this->{'_' . $key} = $value;
- }
- }
-
- $this->_fileName = ltrim($this->_fileName, '/'); //strip leading slash
- $this->_path = rtrim($this->_path, '/'); //strip trailing slash
-
- if ($this->_append) {
- $this->_fileName = CURRENT_FILENAME; //avoid easy-verified user error;
- $this->_url = $this->_path.'/'.$this->_fileName.$this->_getLinksUrl();
- } else {
- $this->_url = $this->_path.'/';
- if (!strstr($this->_fileName,'%d')) {
- $msg = '<b>Pager_Sliding Error:</b>'
- .' "fileName" format not valid. Use "%d" as placeholder.';
- return $this->raiseError($msg, ERROR_PAGER_SLIDING_INVALID);
- }
- }
-
- if (strlen($this->_linkClass)) {
- $this->_classString = 'class="'.$this->_linkClass.'"';
- } else {
- $this->_classString = '';
- }
-
- if (strlen($this->_curPageLinkClassName)) {
- $this->_curPageSpanPre = '<span class="'.$this->_curPageLinkClassName.'">';
- $this->_curPageSpanPost = '</span>';
- }
-
- if ($this->_perPage < 1) { //avoid easy-verified user error
- $this->_perPage = 1;
- }
-
- if ($this->_useSessions && !isset($_SESSION)) {
- session_start();
- }
- if (!empty($_REQUEST[$this->_sessionVar])) {
- $this->_perPage = max(1, (int)$_REQUEST[$this->_sessionVar]);
-
- if ($this->_useSessions) {
- $_SESSION[$this->_sessionVar] = $this->_perPage;
- }
- }
-
- if (!empty($_SESSION[$this->_sessionVar])) {
- $this->_perPage = $_SESSION[$this->_sessionVar];
- }
-
- if ($this->_closeSession) {
- session_write_close();
- }
-
- for ($i=0; $i<$this->_spacesBeforeSeparator; $i++) {
- $this->_spacesBefore .= ' ';
- }
-
- for ($i=0; $i<$this->_spacesAfterSeparator; $i++) {
- $this->_spacesAfter .= ' ';
- }
-
- if (isset($_GET[$this->_urlVar])) {
- $this->_currentPage = max((int)@$_GET[$this->_urlVar], 1);
- } else {
- $this->_currentPage = 1;
- }
- }
-
- // }}}
- }
- ?>