/branches/livraison_narmer/api/pear/Pager/Pager.php |
---|
New file |
0,0 → 1,193 |
<?php |
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
/** |
* Contains the Pager 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 dot alberton at quipo dot it> |
* @author Richard Heyes <richard@phpguru.org> |
* @copyright 2003-2006 Lorenzo Alberton, Richard Heyes |
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) |
* @version CVS: $Id$ |
* @link http://pear.php.net/package/Pager |
*/ |
/** |
* Pager - Wrapper class for [Sliding|Jumping]-window Pager |
* Usage examples can be found in the PEAR manual |
* |
* @category HTML |
* @package Pager |
* @author Lorenzo Alberton <l dot alberton at quipo dot it> |
* @author Richard Heyes <richard@phpguru.org>, |
* @copyright 2003-2005 Lorenzo Alberton, Richard Heyes |
* @license http://www.php.net/license/3_0.txt PHP License 3.0 |
* @link http://pear.php.net/package/Pager |
*/ |
class Pager |
{ |
// {{{ Pager() |
/** |
* Constructor |
* |
* ------------------------------------------------------------------------- |
* VALID options are (default values are set some lines before): |
* - mode (string): "Jumping" or "Sliding" -window - It determines |
* pager behaviour. See the manual for more details |
* - 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 |
* - 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 |
* - httpMethod (string): Specifies the HTTP method to use. Valid values |
* are 'GET' or 'POST' |
* according to "fileName" specs |
* - importQuery (bool): if true (default behaviour), variables and |
* values are imported from the submitted data |
* (query string) and used in the generated links |
* otherwise they're ignored completely |
* - 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. |
* - firstLinkTitle (string): |
* string used as title in <link rel="first"> tag |
* - lastLinkTitle (string): |
* string used as title in <link rel="last"> tag |
* - prevLinkTitle (string): |
* string used as title in <link rel="prev"> tag |
* - nextLinkTitle (string): |
* string used as title in <link rel="next"> tag |
* - curPageLinkClassName |
* (string): name of CSS class used for current page link. |
* - clearIfVoid(bool): if there's only one page, don't display pager. |
* - extraVars (array): additional URL vars to be added to the querystring |
* - excludeVars (array): URL vars to be excluded in the querystring |
* - 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($options = array()) |
{ |
//this check evaluates to true on 5.0.0RC-dev, |
//so i'm using another one, for now... |
//if (version_compare(phpversion(), '5.0.0') == -1) { |
if (get_class($this) == 'pager') { //php4 lowers class names |
// assign factoried method to this for PHP 4 |
eval('$this = Pager::factory($options);'); |
} else { //php5 is case sensitive |
$msg = 'Pager constructor is deprecated.' |
.' You must use the "Pager::factory($params)" method' |
.' instead of "new Pager($params)"'; |
trigger_error($msg, E_USER_ERROR); |
} |
} |
// }}} |
// {{{ factory() |
/** |
* Return a pager based on $mode and $options |
* |
* @param array $options Optional parameters for the storage class |
* @return object Object Storage object |
* @static |
* @access public |
*/ |
function &factory($options = array()) |
{ |
$mode = (isset($options['mode']) ? ucfirst($options['mode']) : 'Jumping'); |
$classname = 'Pager_' . $mode; |
$classfile = 'Pager' . DIRECTORY_SEPARATOR . $mode . '.php'; |
// Attempt to include a custom version of the named class, but don't treat |
// a failure as fatal. The caller may have already included their own |
// version of the named class. |
if (!class_exists($classname)) { |
include_once $classfile; |
} |
// If the class exists, return a new instance of it. |
if (class_exists($classname)) { |
$pager =& new $classname($options); |
return $pager; |
} |
$null = null; |
return $null; |
} |
// }}} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/Common.php |
---|
New file |
0,0 → 1,1502 |
<?php |
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
/** |
* Contains the Pager_Common 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 dot alberton at quipo dot it> |
* @author Richard Heyes <richard@phpguru.org> |
* @copyright 2003-2006 Lorenzo Alberton, Richard Heyes |
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) |
* @version CVS: $Id$ |
* @link http://pear.php.net/package/Pager |
*/ |
/** |
* Two constants used to guess the path- and file-name of the page |
* when the user doesn't set any other value |
*/ |
if (substr($_SERVER['PHP_SELF'], -1) == '/') { |
define('CURRENT_FILENAME', ''); |
define('CURRENT_PATHNAME', 'http://'.$_SERVER['HTTP_HOST'].str_replace('\\', '/', $_SERVER['PHP_SELF'])); |
} else { |
define('CURRENT_FILENAME', preg_replace('/(.*)\?.*/', '\\1', basename($_SERVER['PHP_SELF']))); |
define('CURRENT_PATHNAME', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))); |
} |
/** |
* Error codes |
*/ |
define('PAGER_OK', 0); |
define('ERROR_PAGER', -1); |
define('ERROR_PAGER_INVALID', -2); |
define('ERROR_PAGER_INVALID_PLACEHOLDER', -3); |
define('ERROR_PAGER_INVALID_USAGE', -4); |
define('ERROR_PAGER_NOT_IMPLEMENTED', -5); |
/** |
* Pager_Common - Common base class for [Sliding|Jumping] Window Pager |
* Extend this class to write a custom paging class |
* |
* @category HTML |
* @package Pager |
* @author Lorenzo Alberton <l dot alberton at quipo dot it> |
* @author Richard Heyes <richard@phpguru.org> |
* @copyright 2003-2005 Lorenzo Alberton, Richard Heyes |
* @license http://www.php.net/license/3_0.txt PHP License 3.0 |
* @link http://pear.php.net/package/Pager |
*/ |
class Pager_Common |
{ |
// {{{ 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 for each window |
* @access private |
*/ |
var $_delta = 10; |
/** |
* @var integer current page number |
* @access private |
*/ |
var $_currentPage = 1; |
/** |
* @var integer total pages number |
* @access private |
*/ |
var $_totalPages = 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 If false, don't override the fileName option. Use at your own risk. |
* @access private |
*/ |
var $_fixFileName = true; |
/** |
* @var boolean you have to use FALSE with mod_rewrite |
* @access private |
*/ |
var $_append = true; |
/** |
* @var string specifies which HTTP method to use |
* @access private |
*/ |
var $_httpMethod = 'GET'; |
/** |
* @var string specifies which HTML form to use |
* @access private |
*/ |
var $_formID = ''; |
/** |
* @var boolean whether or not to import submitted data |
* @access private |
*/ |
var $_importQuery = true; |
/** |
* @var string name of the querystring var for pageID |
* @access private |
*/ |
var $_urlVar = 'pageID'; |
/** |
* @var array data to pass through the link |
* @access private |
*/ |
var $_linkData = array(); |
/** |
* @var array additional URL vars |
* @access private |
*/ |
var $_extraVars = array(); |
/** |
* @var array URL vars to ignore |
* @access private |
*/ |
var $_excludeVars = array(); |
/** |
* @var boolean TRUE => expanded mode (for Pager_Sliding) |
* @access private |
*/ |
var $_expanded = true; |
/** |
* @var boolean TRUE => show accesskey attribute on <a> tags |
* @access private |
*/ |
var $_accesskey = false; |
/** |
* @var string extra attributes for the <a> tag |
* @access private |
*/ |
var $_attributes = ''; |
/** |
* @var string alt text for "first page" (use "%d" placeholder for page number) |
* @access private |
*/ |
var $_altFirst = 'first page'; |
/** |
* @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 "last page" (use "%d" placeholder for page number) |
* @access private |
*/ |
var $_altLast = 'last 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 = '<< Back'; |
/** |
* @var string image/text to use as "next" link |
* @access private |
*/ |
var $_nextImg = 'Next >>'; |
/** |
* @var string link separator |
* @access private |
*/ |
var $_separator = ''; |
/** |
* @var integer number of spaces before separator |
* @access private |
*/ |
var $_spacesBeforeSeparator = 0; |
/** |
* @var integer number of spaces after separator |
* @access private |
*/ |
var $_spacesAfterSeparator = 1; |
/** |
* @var string CSS class name for current page link |
* @access private |
*/ |
var $_curPageLinkClassName = ''; |
/** |
* @var string Text before current page link |
* @access private |
*/ |
var $_curPageSpanPre = ''; |
/** |
* @var string Text after current page link |
* @access private |
*/ |
var $_curPageSpanPost = ''; |
/** |
* @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 string $_firstLinkTitle |
* @access private |
*/ |
var $_firstLinkTitle = 'first page'; |
/** |
* @var string $_nextLinkTitle |
* @access private |
*/ |
var $_nextLinkTitle = 'next page'; |
/** |
* @var string $_prevLinkTitle |
* @access private |
*/ |
var $_prevLinkTitle = 'previous page'; |
/** |
* @var string $_lastLinkTitle |
* @access private |
*/ |
var $_lastLinkTitle = 'last page'; |
/** |
* @var string Text to be used for the 'show all' option in the select box |
* @access private |
*/ |
var $_showAllText = ''; |
/** |
* @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 |
* @access private |
*/ |
var $_pearErrorMode = null; |
// }}} |
// {{{ public vars |
/** |
* @var string Complete set of links |
* @access public |
*/ |
var $links = ''; |
/** |
* @var string Complete set of link tags |
* @access public |
*/ |
var $linkTags = ''; |
/** |
* @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(); |
/** |
* @var array list of available options (safety check) |
* @access private |
*/ |
var $_allowed_options = array( |
'totalItems', |
'perPage', |
'delta', |
'linkClass', |
'path', |
'fileName', |
'fixFileName', |
'append', |
'httpMethod', |
'formID', |
'importQuery', |
'urlVar', |
'altFirst', |
'altPrev', |
'altNext', |
'altLast', |
'altPage', |
'prevImg', |
'nextImg', |
'expanded', |
'accesskey', |
'attributes', |
'separator', |
'spacesBeforeSeparator', |
'spacesAfterSeparator', |
'curPageLinkClassName', |
'curPageSpanPre', |
'curPageSpanPost', |
'firstPagePre', |
'firstPageText', |
'firstPagePost', |
'lastPagePre', |
'lastPageText', |
'lastPagePost', |
'firstLinkTitle', |
'nextLinkTitle', |
'prevLinkTitle', |
'lastLinkTitle', |
'showAllText', |
'itemData', |
'clearIfVoid', |
'useSessions', |
'closeSession', |
'sessionVar', |
'pearErrorMode', |
'extraVars', |
'excludeVars', |
'currentPage', |
); |
// }}} |
// {{{ build() |
/** |
* Generate or refresh the links and paged data after a call to setOptions() |
* |
* @access public |
*/ |
function build() |
{ |
$msg = '<b>PEAR::Pager Error:</b>' |
.' function "build()" not implemented.'; |
return $this->raiseError($msg, ERROR_PAGER_NOT_IMPLEMENTED); |
} |
// }}} |
// {{{ getPageData() |
/** |
* Returns an array of current pages data |
* |
* @param $pageID Desired page ID (optional) |
* @return array Page data |
* @access public |
*/ |
function getPageData($pageID = null) |
{ |
$pageID = empty($pageID) ? $this->_currentPage : $pageID; |
if (!isset($this->_pageData)) { |
$this->_generatePageData(); |
} |
if (!empty($this->_pageData[$pageID])) { |
return $this->_pageData[$pageID]; |
} |
return array(); |
} |
// }}} |
// {{{ getPageIdByOffset() |
/** |
* Returns pageID for given offset |
* |
* @param $index Offset to get pageID for |
* @return int PageID for given offset |
*/ |
function getPageIdByOffset($index) |
{ |
$msg = '<b>PEAR::Pager Error:</b>' |
.' function "getPageIdByOffset()" not implemented.'; |
return $this->raiseError($msg, ERROR_PAGER_NOT_IMPLEMENTED); |
} |
// }}} |
// {{{ getOffsetByPageId() |
/** |
* Returns offsets for given pageID. Eg, if you |
* pass it pageID one and your perPage limit is 10 |
* it will return (1, 10). PageID of 2 would |
* give you (11, 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() |
/** |
* @param integer PageID to get offsets for |
* @return array First and last offsets |
*/ |
function getPageRangeByPageId($pageID) |
{ |
$msg = '<b>PEAR::Pager Error:</b>' |
.' function "getPageRangeByPageId()" not implemented.'; |
return $this->raiseError($msg, ERROR_PAGER_NOT_IMPLEMENTED); |
} |
// }}} |
// {{{ getLinks() |
/** |
* Returns back/next/first/last and page links, |
* both as ordered and associative array. |
* |
* NB: in original PEAR::Pager this method accepted two parameters, |
* $back_html and $next_html. Now the only parameter accepted is |
* an integer ($pageID), since the html text for prev/next links can |
* be set in the factory. If a second parameter is provided, then |
* the method act as it previously did. This hack was done to mantain |
* backward compatibility only. |
* |
* @param integer $pageID Optional pageID. If specified, links |
* for that page are provided instead of current one. [ADDED IN NEW PAGER VERSION] |
* @param string $next_html HTML to put inside the next link [deprecated: use the factory instead] |
* @return array back/next/first/last and page links |
*/ |
function getLinks($pageID=null, $next_html='') |
{ |
$msg = '<b>PEAR::Pager Error:</b>' |
.' function "getLinks()" not implemented.'; |
return $this->raiseError($msg, ERROR_PAGER_NOT_IMPLEMENTED); |
} |
// }}} |
// {{{ getCurrentPageID() |
/** |
* Returns ID of current page |
* |
* @return integer ID of current page |
*/ |
function getCurrentPageID() |
{ |
return $this->_currentPage; |
} |
// }}} |
// {{{ getNextPageID() |
/** |
* Returns next page ID. If current page is last page |
* this function returns FALSE |
* |
* @return mixed Next page ID |
*/ |
function getNextPageID() |
{ |
return ($this->getCurrentPageID() == $this->numPages() ? false : $this->getCurrentPageID() + 1); |
} |
// }}} |
// {{{ getPreviousPageID() |
/** |
* Returns previous page ID. If current page is first page |
* this function returns FALSE |
* |
* @return mixed Previous pages' ID |
*/ |
function getPreviousPageID() |
{ |
return $this->isFirstPage() ? false : $this->getCurrentPageID() - 1; |
} |
// }}} |
// {{{ numItems() |
/** |
* Returns number of items |
* |
* @return int Number of items |
*/ |
function numItems() |
{ |
return $this->_totalItems; |
} |
// }}} |
// {{{ numPages() |
/** |
* Returns number of pages |
* |
* @return int Number of pages |
*/ |
function numPages() |
{ |
return (int)$this->_totalPages; |
} |
// }}} |
// {{{ isFirstPage() |
/** |
* Returns whether current page is first page |
* |
* @return bool First page or not |
*/ |
function isFirstPage() |
{ |
return ($this->_currentPage < 2); |
} |
// }}} |
// {{{ isLastPage() |
/** |
* Returns whether current page is last page |
* |
* @return bool Last page or not |
*/ |
function isLastPage() |
{ |
return ($this->_currentPage == $this->_totalPages); |
} |
// }}} |
// {{{ isLastPageComplete() |
/** |
* Returns whether last page is complete |
* |
* @return bool Last age complete or not |
*/ |
function isLastPageComplete() |
{ |
return !($this->_totalItems % $this->_perPage); |
} |
// }}} |
// {{{ _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 modification |
$this->_currentPage = min($this->_currentPage, $this->_totalPages); |
} |
// }}} |
// {{{ _renderLink() |
/** |
* Renders a link using the appropriate method |
* |
* @param altText Alternative text for this link (title property) |
* @param linkText Text contained by this link |
* @return string The link in string form |
* @access private |
*/ |
function _renderLink($altText, $linkText) |
{ |
if ($this->_httpMethod == 'GET') { |
if ($this->_append) { |
$href = '?' . $this->_http_build_query_wrapper($this->_linkData); |
} else { |
$href = str_replace('%d', $this->_linkData[$this->_urlVar], $this->_fileName); |
} |
return sprintf('<a href="%s"%s%s%s title="%s">%s</a>', |
htmlentities($this->_url . $href), |
empty($this->_classString) ? '' : ' '.$this->_classString, |
empty($this->_attributes) ? '' : ' '.$this->_attributes, |
empty($this->_accesskey) ? '' : ' accesskey="'.$this->_linkData[$this->_urlVar].'"', |
$altText, |
$linkText |
); |
} elseif ($this->_httpMethod == 'POST') { |
return sprintf("<a href='javascript:void(0)' onclick='%s'%s%s%s title='%s'>%s</a>", |
$this->_generateFormOnClick($this->_url, $this->_linkData), |
empty($this->_classString) ? '' : ' '.$this->_classString, |
empty($this->_attributes) ? '' : ' '.$this->_attributes, |
empty($this->_accesskey) ? '' : ' accesskey=\''.$this->_linkData[$this->_urlVar].'\'', |
$altText, |
$linkText |
); |
} |
return ''; |
} |
// }}} |
// {{{ _generateFormOnClick() |
/** |
* Mimics http_build_query() behavior in the way the data |
* in $data will appear when it makes it back to the server. |
* For example: |
* $arr = array('array' => array(array('hello', 'world'), |
* 'things' => array('stuff', 'junk')); |
* http_build_query($arr) |
* and _generateFormOnClick('foo.php', $arr) |
* will yield |
* $_REQUEST['array'][0][0] === 'hello' |
* $_REQUEST['array'][0][1] === 'world' |
* $_REQUEST['array']['things'][0] === 'stuff' |
* $_REQUEST['array']['things'][1] === 'junk' |
* |
* However, instead of generating a query string, it generates |
* Javascript to create and submit a form. |
* |
* @param string $formAction where the form should be submitted |
* @param array $data the associative array of names and values |
* @return string A string of javascript that generates a form and submits it |
* @access private |
*/ |
function _generateFormOnClick($formAction, $data) |
{ |
// Check we have an array to work with |
if (!is_array($data)) { |
trigger_error( |
'_generateForm() Parameter 1 expected to be Array or Object. Incorrect value given.', |
E_USER_WARNING |
); |
return false; |
} |
if (!empty($this->_formID)) { |
$str = 'var form = document.getElementById("'.$this->_formID.'"); var input = ""; '; |
} else { |
$str = 'var form = document.createElement("form"); var input = ""; '; |
} |
// We /shouldn't/ need to escape the URL ... |
$str .= sprintf('form.action = "%s"; ', htmlentities($formAction)); |
$str .= sprintf('form.method = "%s"; ', $this->_httpMethod); |
foreach ($data as $key => $val) { |
$str .= $this->_generateFormOnClickHelper($val, $key); |
} |
if (empty($this->_formID)) { |
$str .= 'document.getElementsByTagName("body")[0].appendChild(form);'; |
} |
$str .= 'form.submit(); return false;'; |
return $str; |
} |
// }}} |
// {{{ _generateFormOnClickHelper |
/** |
* This is used by _generateFormOnClick(). |
* Recursively processes the arrays, objects, and literal values. |
* |
* @param data Data that should be rendered |
* @param prev The name so far |
* @return string A string of Javascript that creates form inputs |
* representing the data |
* @access private |
*/ |
function _generateFormOnClickHelper($data, $prev = '') |
{ |
$str = ''; |
if (is_array($data) || is_object($data)) { |
// foreach key/visible member |
foreach ((array)$data as $key => $val) { |
// append [$key] to prev |
$tempKey = sprintf('%s[%s]', $prev, $key); |
$str .= $this->_generateFormOnClickHelper($val, $tempKey); |
} |
} else { // must be a literal value |
// escape newlines and carriage returns |
$search = array("\n", "\r"); |
$replace = array('\n', '\n'); |
$escapedData = str_replace($search, $replace, $data); |
// am I forgetting any dangerous whitespace? |
// would a regex be faster? |
// if it's already encoded, don't encode it again |
if (!$this->_isEncoded($escapedData)) { |
$escapedData = urlencode($escapedData); |
} |
$escapedData = htmlentities($escapedData, ENT_QUOTES, 'UTF-8'); |
$str .= 'input = document.createElement("input"); '; |
$str .= 'input.type = "hidden"; '; |
$str .= sprintf('input.name = "%s"; ', $prev); |
$str .= sprintf('input.value = "%s"; ', $escapedData); |
$str .= 'form.appendChild(input); '; |
} |
return $str; |
} |
// }}} |
// {{{ _getLinksData() |
/** |
* Returns the correct link for the back/pages/next links |
* |
* @return array Data |
* @access private |
*/ |
function _getLinksData() |
{ |
$qs = array(); |
if ($this->_importQuery) { |
if ($this->_httpMethod == 'POST') { |
$qs = $_POST; |
} elseif ($this->_httpMethod == 'GET') { |
$qs = $_GET; |
} |
} |
if (count($this->_extraVars)){ |
$this->_recursive_urldecode($this->_extraVars); |
} |
$qs = array_merge($qs, $this->_extraVars); |
foreach ($this->_excludeVars as $exclude) { |
if (array_key_exists($exclude, $qs)) { |
unset($qs[$exclude]); |
} |
} |
if (count($qs) && get_magic_quotes_gpc()){ |
$this->_recursive_stripslashes($qs); |
} |
return $qs; |
} |
// }}} |
// {{{ _recursive_stripslashes() |
/** |
* Helper method |
* @param mixed $var |
* @access private |
*/ |
function _recursive_stripslashes(&$var) |
{ |
if (is_array($var)) { |
foreach (array_keys($var) as $k) { |
$this->_recursive_stripslashes($var[$k]); |
} |
} else { |
$var = stripslashes($var); |
} |
} |
// }}} |
// {{{ _recursive_urldecode() |
/** |
* Helper method |
* @param mixed $var |
* @access private |
*/ |
function _recursive_urldecode(&$var) |
{ |
if (is_array($var)) { |
foreach (array_keys($var) as $k) { |
$this->_recursive_urldecode($var[$k]); |
} |
} else { |
$trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES)); |
$var = strtr($var, $trans_tbl); |
} |
} |
// }}} |
// {{{ _getBackLink() |
/** |
* Returns back link |
* |
* @param $url URL to use in the link [deprecated: use the factory instead] |
* @param $link HTML to use as the link [deprecated: use the factory instead] |
* @return string The link |
* @access private |
*/ |
function _getBackLink($url='', $link='') |
{ |
//legacy settings... the preferred way to set an option |
//now is passing it to the factory |
if (!empty($url)) { |
$this->_path = $url; |
} |
if (!empty($link)) { |
$this->_prevImg = $link; |
} |
$back = ''; |
if ($this->_currentPage > 1) { |
$this->_linkData[$this->_urlVar] = $this->getPreviousPageID(); |
$back = $this->_renderLink($this->_altPrev, $this->_prevImg) |
. $this->_spacesBefore . $this->_spacesAfter; |
} |
return $back; |
} |
// }}} |
// {{{ _getPageLinks() |
/** |
* Returns pages link |
* |
* @param $url URL to use in the link [deprecated: use the factory instead] |
* @return string Links |
* @access private |
*/ |
function _getPageLinks($url='') |
{ |
$msg = '<b>PEAR::Pager Error:</b>' |
.' function "_getPageLinks()" not implemented.'; |
return $this->raiseError($msg, ERROR_PAGER_NOT_IMPLEMENTED); |
} |
// }}} |
// {{{ _getNextLink() |
/** |
* Returns next link |
* |
* @param $url URL to use in the link [deprecated: use the factory instead] |
* @param $link HTML to use as the link [deprecated: use the factory instead] |
* @return string The link |
* @access private |
*/ |
function _getNextLink($url='', $link='') |
{ |
//legacy settings... the preferred way to set an option |
//now is passing it to the factory |
if (!empty($url)) { |
$this->_path = $url; |
} |
if (!empty($link)) { |
$this->_nextImg = $link; |
} |
$next = ''; |
if ($this->_currentPage < $this->_totalPages) { |
$this->_linkData[$this->_urlVar] = $this->getNextPageID(); |
$next = $this->_spacesAfter |
. $this->_renderLink($this->_altNext, $this->_nextImg) |
. $this->_spacesBefore . $this->_spacesAfter; |
} |
return $next; |
} |
// }}} |
// {{{ _getFirstLinkTag() |
/** |
* @return string |
* @access private |
*/ |
function _getFirstLinkTag() |
{ |
if ($this->isFirstPage() || ($this->_httpMethod != 'GET')) { |
return ''; |
} |
return sprintf('<link rel="first" href="%s" title="%s" />'."\n", |
$this->_getLinkTagUrl(1), |
$this->_firstLinkTitle |
); |
} |
// }}} |
// {{{ _getPrevLinkTag() |
/** |
* Returns previous link tag |
* |
* @return string the link tag |
* @access private |
*/ |
function _getPrevLinkTag() |
{ |
if ($this->isFirstPage() || ($this->_httpMethod != 'GET')) { |
return ''; |
} |
return sprintf('<link rel="previous" href="%s" title="%s" />'."\n", |
$this->_getLinkTagUrl($this->getPreviousPageID()), |
$this->_prevLinkTitle |
); |
} |
// }}} |
// {{{ _getNextLinkTag() |
/** |
* Returns next link tag |
* |
* @return string the link tag |
* @access private |
*/ |
function _getNextLinkTag() |
{ |
if ($this->isLastPage() || ($this->_httpMethod != 'GET')) { |
return ''; |
} |
return sprintf('<link rel="next" href="%s" title="%s" />'."\n", |
$this->_getLinkTagUrl($this->getNextPageID()), |
$this->_nextLinkTitle |
); |
} |
// }}} |
// {{{ _getLastLinkTag() |
/** |
* @return string the link tag |
* @access private |
*/ |
function _getLastLinkTag() |
{ |
if ($this->isLastPage() || ($this->_httpMethod != 'GET')) { |
return ''; |
} |
return sprintf('<link rel="last" href="%s" title="%s" />'."\n", |
$this->_getLinkTagUrl($this->_totalPages), |
$this->_lastLinkTitle |
); |
} |
// }}} |
// {{{ _getLinkTagUrl() |
/** |
* Helper method |
* @return string the link tag url |
* @access private |
*/ |
function _getLinkTagUrl($pageID) |
{ |
$this->_linkData[$this->_urlVar] = $pageID; |
if ($this->_append) { |
$href = '?' . $this->_http_build_query_wrapper($this->_linkData); |
} else { |
$href = str_replace('%d', $this->_linkData[$this->_urlVar], $this->_fileName); |
} |
return htmlentities($this->_url . $href); |
} |
// }}} |
// {{{ 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 |
* @param boolean $showAllData If true, perPage is set equal to totalItems. |
* @param array (or string $optionText for BC reasons) |
* - 'optionText': text to show in each option. |
* Use '%d' where you want to see the number of pages selected. |
* - 'attributes': (html attributes) Tag attributes or |
* HTML attributes (id="foo" pairs), will be inserted in the |
* <select> tag |
* @return string xhtml select box |
* @access public |
*/ |
function getPerPageSelectBox($start=5, $end=30, $step=5, $showAllData=false, $extraParams=array()) |
{ |
require_once 'Pager/HtmlWidgets.php'; |
$widget =& new Pager_HtmlWidgets($this); |
return $widget->getPerPageSelectBox($start, $end, $step, $showAllData, $extraParams); |
} |
// }}} |
// {{{ getPageSelectBox() |
/** |
* Returns a string with a XHTML SELECT menu with the page numbers, |
* useful as an alternative to the links |
* |
* @param array - 'optionText': text to show in each option. |
* Use '%d' where you want to see the number of pages selected. |
* - 'autoSubmit': if TRUE, add some js code to submit the |
* form on the onChange event |
* @param string $extraAttributes (html attributes) Tag attributes or |
* HTML attributes (id="foo" pairs), will be inserted in the |
* <select> tag |
* @return string xhtml select box |
* @access public |
*/ |
function getPageSelectBox($params = array(), $extraAttributes = '') |
{ |
require_once 'Pager/HtmlWidgets.php'; |
$widget =& new Pager_HtmlWidgets($this); |
return $widget->getPageSelectBox($params, $extraAttributes); |
} |
// }}} |
// {{{ _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 ''; |
} |
$this->_linkData[$this->_urlVar] = 1; |
return $this->_renderLink( |
str_replace('%d', 1, $this->_altFirst), |
$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 ''; |
} |
$this->_linkData[$this->_urlVar] = $this->_totalPages; |
return $this->_renderLink( |
str_replace('%d', $this->_totalPages, $this->_altLast), |
$this->_lastPagePre . $this->_lastPageText . $this->_lastPagePost |
); |
} |
// }}} |
// {{{ _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; |
} |
} |
// }}} |
// {{{ _http_build_query_wrapper() |
/** |
* This is a slightly modified version of the http_build_query() function; |
* it heavily borrows code from PHP_Compat's http_build_query(). |
* The main change is the usage of htmlentities instead of urlencode, |
* since it's too aggressive |
* |
* @author Stephan Schmidt <schst@php.net> |
* @author Aidan Lister <aidan@php.net> |
* @author Lorenzo Alberton <l dot alberton at quipo dot it> |
* @param array $data |
* @return string |
* @access private |
*/ |
function _http_build_query_wrapper($data) |
{ |
$data = (array)$data; |
if (empty($data)) { |
return ''; |
} |
$separator = ini_get('arg_separator.output'); |
if ($separator == '&') { |
$separator = '&'; //the string is escaped by htmlentities anyway... |
} |
$tmp = array (); |
foreach ($data as $key => $val) { |
if (is_scalar($val)) { |
//array_push($tmp, $key.'='.$val); |
$val = urlencode($val); |
array_push($tmp, $key .'='. str_replace('%2F', '/', $val)); |
continue; |
} |
// If the value is an array, recursively parse it |
if (is_array($val)) { |
array_push($tmp, $this->__http_build_query($val, htmlentities($key))); |
continue; |
} |
} |
return implode($separator, $tmp); |
} |
// }}} |
// {{{ __http_build_query() |
/** |
* Helper function |
* @author Stephan Schmidt <schst@php.net> |
* @author Aidan Lister <aidan@php.net> |
* @access private |
*/ |
function __http_build_query($array, $name) |
{ |
$tmp = array (); |
foreach ($array as $key => $value) { |
if (is_array($value)) { |
//array_push($tmp, $this->__http_build_query($value, sprintf('%s[%s]', $name, $key))); |
array_push($tmp, $this->__http_build_query($value, $name.'%5B'.$key.'%5D')); |
} elseif (is_scalar($value)) { |
//array_push($tmp, sprintf('%s[%s]=%s', $name, htmlentities($key), htmlentities($value))); |
array_push($tmp, $name.'%5B'.htmlentities($key).'%5D='.htmlentities($value)); |
} elseif (is_object($value)) { |
//array_push($tmp, $this->__http_build_query(get_object_vars($value), sprintf('%s[%s]', $name, $key))); |
array_push($tmp, $this->__http_build_query(get_object_vars($value), $name.'%5B'.$key.'%5D')); |
} |
} |
return implode(ini_get('arg_separator.output'), $tmp); |
} |
// }}} |
// {{{ _isEncoded() |
/** |
* Helper function |
* Check if a string is an encoded multibyte string |
* @param string $string |
* @return boolean |
* @access private |
*/ |
function _isEncoded($string) |
{ |
$hexchar = '&#[\dA-Fx]{2,};'; |
return preg_match("/^(\s|($hexchar))*$/Uims", $string) ? true : false; |
} |
// }}} |
// {{{ 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; |
} |
return PEAR::raiseError($msg, $code, $this->_pearErrorMode); |
} |
// }}} |
// {{{ setOptions() |
/** |
* Set and sanitize options |
* |
* @param mixed $options An associative array of option names and |
* their values. |
* @return integer error code (PAGER_OK on success) |
* @access public |
*/ |
function setOptions($options) |
{ |
foreach ($options as $key => $value) { |
if (in_array($key, $this->_allowed_options) && (!is_null($value))) { |
$this->{'_' . $key} = $value; |
} |
} |
//autodetect http method |
if (!isset($options['httpMethod']) |
&& !isset($_GET[$this->_urlVar]) |
&& isset($_POST[$this->_urlVar]) |
) { |
$this->_httpMethod = 'POST'; |
} else { |
$this->_httpMethod = strtoupper($this->_httpMethod); |
} |
$this->_fileName = ltrim($this->_fileName, '/'); //strip leading slash |
$this->_path = rtrim($this->_path, '/'); //strip trailing slash |
if ($this->_append) { |
if ($this->_fixFileName) { |
$this->_fileName = CURRENT_FILENAME; //avoid possible user error; |
} |
$this->_url = $this->_path.'/'.$this->_fileName; |
} else { |
$this->_url = $this->_path; |
if (strncasecmp($this->_fileName, 'javascript', 10) != 0) { |
$this->_url .= '/'; |
} |
if (!strstr($this->_fileName, '%d')) { |
trigger_error($this->errorMessage(ERROR_PAGER_INVALID_USAGE), E_USER_WARNING); |
} |
} |
$this->_classString = ''; |
if (strlen($this->_linkClass)) { |
$this->_classString = 'class="'.$this->_linkClass.'"'; |
} |
if (strlen($this->_curPageLinkClassName)) { |
$this->_curPageSpanPre = '<span class="'.$this->_curPageLinkClassName.'">'; |
$this->_curPageSpanPost = '</span>'; |
} |
$this->_perPage = max($this->_perPage, 1); //avoid possible user errors |
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(); |
} |
$this->_spacesBefore = str_repeat(' ', $this->_spacesBeforeSeparator); |
$this->_spacesAfter = str_repeat(' ', $this->_spacesAfterSeparator); |
if (isset($_REQUEST[$this->_urlVar]) && empty($options['currentPage'])) { |
$this->_currentPage = (int)$_REQUEST[$this->_urlVar]; |
} |
$this->_currentPage = max($this->_currentPage, 1); |
$this->_linkData = $this->_getLinksData(); |
return PAGER_OK; |
} |
// }}} |
// {{{ getOption() |
/** |
* Return the current value of a given option |
* |
* @param string option name |
* @return mixed option value |
*/ |
function getOption($name) |
{ |
if (!in_array($name, $this->_allowed_options)) { |
$msg = '<b>PEAR::Pager Error:</b>' |
.' invalid option: '.$name; |
return $this->raiseError($msg, ERROR_PAGER_INVALID); |
} |
return $this->{'_' . $name}; |
} |
// }}} |
// {{{ getOptions() |
/** |
* Return an array with all the current pager options |
* |
* @return array list of all the pager options |
*/ |
function getOptions() |
{ |
$options = array(); |
foreach ($this->_allowed_options as $option) { |
$options[$option] = $this->{'_' . $option}; |
} |
return $options; |
} |
// }}} |
// {{{ errorMessage() |
/** |
* Return a textual error message for a PAGER error code |
* |
* @param int $code error code |
* @return string error message |
* @access public |
*/ |
function errorMessage($code) |
{ |
static $errorMessages; |
if (!isset($errorMessages)) { |
$errorMessages = array( |
ERROR_PAGER => 'unknown error', |
ERROR_PAGER_INVALID => 'invalid', |
ERROR_PAGER_INVALID_PLACEHOLDER => 'invalid format - use "%d" as placeholder.', |
ERROR_PAGER_INVALID_USAGE => 'if $options[\'append\'] is set to false, ' |
.' $options[\'fileName\'] MUST contain the "%d" placeholder.', |
ERROR_PAGER_NOT_IMPLEMENTED => 'not implemented' |
); |
} |
return '<b>PEAR::Pager error:</b> '. (isset($errorMessages[$code]) ? |
$errorMessages[$code] : $errorMessages[ERROR_PAGER]); |
} |
// }}} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/examples/example.php |
---|
New file |
0,0 → 1,78 |
<?php |
require_once 'Pager/Pager.php'; |
//create dummy array of data |
$myData = array(); |
for ($i=0; $i<200; $i++) { |
$myData[] = $i; |
} |
$params = array( |
'itemData' => $myData, |
'perPage' => 10, |
'delta' => 8, // for 'Jumping'-style a lower number is better |
'append' => true, |
//'separator' => ' | ', |
'clearIfVoid' => false, |
'urlVar' => 'entrant', |
'useSessions' => true, |
'closeSession' => true, |
//'mode' => 'Sliding', //try switching modes |
'mode' => 'Jumping', |
); |
$pager = & Pager::factory($params); |
$page_data = $pager->getPageData(); |
$links = $pager->getLinks(); |
$selectBox = $pager->getPerPageSelectBox(); |
?> |
<html> |
<head> |
<title>new PEAR::Pager example</title> |
</head> |
<body> |
<table border="1" width="500" summary="example 1"> |
<tr> |
<td colspan="3" align="center"> |
<?php echo $links['all']; ?> |
</td> |
</tr> |
<tr> |
<td colspan="3"> |
<pre><?php print_r($page_data); ?></pre> |
</td> |
</tr> |
</table> |
<h4>Results from methods:</h4> |
<pre> |
getCurrentPageID()...: <?php var_dump($pager->getCurrentPageID()); ?> |
getNextPageID()......: <?php var_dump($pager->getNextPageID()); ?> |
getPreviousPageID()..: <?php var_dump($pager->getPreviousPageID()); ?> |
numItems()...........: <?php var_dump($pager->numItems()); ?> |
numPages()...........: <?php var_dump($pager->numPages()); ?> |
isFirstPage()........: <?php var_dump($pager->isFirstPage()); ?> |
isLastPage().........: <?php var_dump($pager->isLastPage()); ?> |
isLastPageComplete().: <?php var_dump($pager->isLastPageComplete()); ?> |
$pager->range........: <?php var_dump($pager->range); ?> |
</pre> |
<hr /> |
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET"> |
Select how many items per page should be shown:<br /> |
<?php echo $selectBox; ?> |
<input type="submit" value="submit" /> |
</form> |
<hr /> |
</body> |
</html> |
/branches/livraison_narmer/api/pear/Pager/examples/Pager_Wrapper.php |
---|
New file |
0,0 → 1,339 |
<?php |
// CVS: $Id$ |
// |
// Pager_Wrapper |
// ------------- |
// |
// Ready-to-use wrappers for paging the result of a query, |
// when fetching the whole resultset is NOT an option. |
// This is a performance- and memory-savvy method |
// to use PEAR::Pager with a database. |
// With this approach, the network load can be |
// consistently smaller than with PEAR::DB_Pager. |
// |
// The following wrappers are provided: one for each PEAR |
// db abstraction layer (DB, MDB and MDB2), one for |
// PEAR::DB_DataObject, and one for the PHP Eclipse library |
// |
// |
// SAMPLE USAGE |
// ------------ |
// |
// $query = 'SELECT this, that FROM mytable'; |
// require_once 'Pager_Wrapper.php'; //this file |
// $pagerOptions = array( |
// 'mode' => 'Sliding', |
// 'delta' => 2, |
// 'perPage' => 15, |
// ); |
// $paged_data = Pager_Wrapper_MDB2($db, $query, $pagerOptions); |
// //$paged_data['data']; //paged data |
// //$paged_data['links']; //xhtml links for page navigation |
// //$paged_data['page_numbers']; //array('current', 'total'); |
// |
/** |
* Helper method - Rewrite the query into a "SELECT COUNT(*)" query. |
* @param string $sql query |
* @return string rewritten query OR false if the query can't be rewritten |
* @access private |
*/ |
function rewriteCountQuery($sql) |
{ |
if (preg_match('/^\s*SELECT\s+\bDISTINCT\b/is', $sql) || preg_match('/\s+GROUP\s+BY\s+/is', $sql)) { |
return false; |
} |
$open_parenthesis = '(?:\()'; |
$close_parenthesis = '(?:\))'; |
$subquery_in_select = $open_parenthesis.'.*\bFROM\b.*'.$close_parenthesis; |
$pattern = '/(?:.*'.$subquery_in_select.'.*)\bFROM\b\s+/Uims'; |
if (preg_match($pattern, $sql)) { |
return false; |
} |
$subquery_with_limit_order = $open_parenthesis.'.*\b(LIMIT|ORDER)\b.*'.$close_parenthesis; |
$pattern = '/.*\bFROM\b.*(?:.*'.$subquery_with_limit_order.'.*).*/Uims'; |
if (preg_match($pattern, $sql)) { |
return false; |
} |
$queryCount = preg_replace('/(?:.*)\bFROM\b\s+/Uims', 'SELECT COUNT(*) FROM ', $sql, 1); |
list($queryCount, ) = preg_split('/\s+ORDER\s+BY\s+/is', $queryCount); |
list($queryCount, ) = preg_split('/\bLIMIT\b/is', $queryCount); |
return trim($queryCount); |
} |
/** |
* @param object PEAR::DB instance |
* @param string db query |
* @param array PEAR::Pager options |
* @param boolean Disable pagination (get all results) |
* @param integer fetch mode constant |
* @param mixed parameters for query placeholders |
* If you use placeholders for table names or column names, please |
* count the # of items returned by the query and pass it as an option: |
* $pager_options['totalItems'] = count_records('some query'); |
* @return array with links and paged data |
*/ |
function Pager_Wrapper_DB(&$db, $query, $pager_options = array(), $disabled = false, $fetchMode = DB_FETCHMODE_ASSOC, $dbparams = null) |
{ |
if (!array_key_exists('totalItems', $pager_options)) { |
// be smart and try to guess the total number of records |
if ($countQuery = rewriteCountQuery($query)) { |
$totalItems = $db->getOne($countQuery, $dbparams); |
if (PEAR::isError($totalItems)) { |
return $totalItems; |
} |
} else { |
$res =& $db->query($query, $dbparams); |
if (PEAR::isError($res)) { |
return $res; |
} |
$totalItems = (int)$res->numRows(); |
$res->free(); |
} |
$pager_options['totalItems'] = $totalItems; |
} |
require_once 'Pager/Pager.php'; |
$pager = Pager::factory($pager_options); |
$page = array(); |
$page['totalItems'] = $pager_options['totalItems']; |
$page['links'] = $pager->links; |
$page['page_numbers'] = array( |
'current' => $pager->getCurrentPageID(), |
'total' => $pager->numPages() |
); |
list($page['from'], $page['to']) = $pager->getOffsetByPageId(); |
$res = ($disabled) |
? $db->limitQuery($query, 0, $totalItems, $dbparams) |
: $db->limitQuery($query, $page['from']-1, $pager_options['perPage'], $dbparams); |
if (PEAR::isError($res)) { |
return $res; |
} |
$page['data'] = array(); |
while ($res->fetchInto($row, $fetchMode)) { |
$page['data'][] = $row; |
} |
if ($disabled) { |
$page['links'] = ''; |
$page['page_numbers'] = array( |
'current' => 1, |
'total' => 1 |
); |
} |
return $page; |
} |
/** |
* @param object PEAR::MDB instance |
* @param string db query |
* @param array PEAR::Pager options |
* @param boolean Disable pagination (get all results) |
* @param integer fetch mode constant |
* @return array with links and paged data |
*/ |
function Pager_Wrapper_MDB(&$db, $query, $pager_options = array(), $disabled = false, $fetchMode = MDB_FETCHMODE_ASSOC) |
{ |
if (!array_key_exists('totalItems', $pager_options)) { |
//be smart and try to guess the total number of records |
if ($countQuery = rewriteCountQuery($query)) { |
$totalItems = $db->queryOne($countQuery); |
if (PEAR::isError($totalItems)) { |
return $totalItems; |
} |
} else { |
$res = $db->query($query); |
if (PEAR::isError($res)) { |
return $res; |
} |
$totalItems = (int)$db->numRows($res); |
$db->freeResult($res); |
} |
$pager_options['totalItems'] = $totalItems; |
} |
require_once 'Pager/Pager.php'; |
$pager = Pager::factory($pager_options); |
$page = array(); |
$page['totalItems'] = $pager_options['totalItems']; |
$page['links'] = $pager->links; |
$page['page_numbers'] = array( |
'current' => $pager->getCurrentPageID(), |
'total' => $pager->numPages() |
); |
list($page['from'], $page['to']) = $pager->getOffsetByPageId(); |
$res = ($disabled) |
? $db->limitQuery($query, null, 0, $totalItems) |
: $db->limitQuery($query, null, $page['from']-1, $pager_options['perPage']); |
if (PEAR::isError($res)) { |
return $res; |
} |
$page['data'] = array(); |
while ($row = $db->fetchInto($res, $fetchMode)) { |
$page['data'][] = $row; |
} |
if ($disabled) { |
$page['links'] = ''; |
$page['page_numbers'] = array( |
'current' => 1, |
'total' => 1 |
); |
} |
return $page; |
} |
/** |
* @param object PEAR::MDB2 instance |
* @param string db query |
* @param array PEAR::Pager options |
* @param boolean Disable pagination (get all results) |
* @param integer fetch mode constant |
* @return array with links and paged data |
*/ |
function Pager_Wrapper_MDB2(&$db, $query, $pager_options = array(), $disabled = false, $fetchMode = MDB2_FETCHMODE_ASSOC) |
{ |
if (!array_key_exists('totalItems', $pager_options)) { |
//be smart and try to guess the total number of records |
if ($countQuery = rewriteCountQuery($query)) { |
$totalItems = $db->queryOne($countQuery); |
if (PEAR::isError($totalItems)) { |
return $totalItems; |
} |
} else { |
//GROUP BY => fetch the whole resultset and count the rows returned |
$res =& $db->queryCol($query); |
if (PEAR::isError($res)) { |
return $res; |
} |
$totalItems = count($res); |
} |
$pager_options['totalItems'] = $totalItems; |
} |
require_once 'Pager/Pager.php'; |
$pager = Pager::factory($pager_options); |
$page = array(); |
$page['links'] = $pager->links; |
$page['totalItems'] = $pager_options['totalItems']; |
$page['page_numbers'] = array( |
'current' => $pager->getCurrentPageID(), |
'total' => $pager->numPages() |
); |
list($page['from'], $page['to']) = $pager->getOffsetByPageId(); |
$page['limit'] = $page['to'] - $page['from'] +1; |
if (!$disabled) { |
$db->setLimit($pager_options['perPage'], $page['from']-1); |
} |
$page['data'] = $db->queryAll($query, null, $fetchMode); |
if (PEAR::isError($page['data'])) { |
return $page['data']; |
} |
if ($disabled) { |
$page['links'] = ''; |
$page['page_numbers'] = array( |
'current' => 1, |
'total' => 1 |
); |
} |
return $page; |
} |
/** |
* @param object PEAR::DataObject instance |
* @param array PEAR::Pager options |
* @param boolean Disable pagination (get all results) |
* @return array with links and paged data |
* @author Massimiliano Arione <garak@studenti.it> |
*/ |
function Pager_Wrapper_DBDO(&$db, $pager_options = array(), $disabled = false) |
{ |
if (!array_key_exists('totalItems', $pager_options)) { |
$totalItems = $db->count(); |
$pager_options['totalItems'] = $totalItems; |
} |
require_once 'Pager/Pager.php'; |
$pager = Pager::factory($pager_options); |
$page = array(); |
$page['links'] = $pager->links; |
$page['totalItems'] = $pager_options['totalItems']; |
$page['page_numbers'] = array( |
'current' => $pager->getCurrentPageID(), |
'total' => $pager->numPages() |
); |
list($page['from'], $page['to']) = $pager->getOffsetByPageId(); |
$page['limit'] = $page['to'] - $page['from'] + 1; |
if (!$disabled) { |
$db->limit($page['from'] - 1, $pager_options['perPage']); |
} |
$db->find(); |
while ($db->fetch()) { |
$db->getLinks(); |
$page['data'][] = $db->toArray('%s', true); |
} |
return $page; |
} |
/** |
* @param object PHP Eclipse instance |
* @param string db query |
* @param array PEAR::Pager options |
* @param boolean Disable pagination (get all results) |
* @return array with links and paged data |
* @author Matte Edens <matte@arubanetworks.com> |
* @see http://sourceforge.net/projects/eclipselib/ |
*/ |
function Pager_Wrapper_Eclipse(&$db, $query, $pager_options = array(), $disabled = false) |
{ |
if (!$disabled) { |
require_once(ECLIPSE_ROOT . 'PagedQuery.php'); |
$query =& new PagedQuery($db->query($query), $pager_options['perPage']); |
$totalrows = $query->getRowCount(); |
$numpages = $query->getPageCount(); |
$whichpage = isset($_GET[$pager_options['urlVar']]) ? (int)$_GET[$pager_options['urlVar']] - 1 : 0; |
if ($whichpage >= $numpages) { |
$whichpage = $numpages - 1; |
} |
$result = $query->getPage($whichpage); |
} else { |
$result = $db->query($query); |
$totalrows = $result->getRowCount(); |
$numpages = 1; |
} |
if (!$result->isSuccess()) { |
return PEAR::raiseError($result->getErrorMessage()); |
} |
if (!array_key_exists('totalItems', $pager_options)) { |
$pager_options['totalItems'] = $totalrows; |
} |
$page = array(); |
require_once(ECLIPSE_ROOT . 'QueryIterator.php'); |
for ($it =& new QueryIterator($result); $it->isValid(); $it->next()) { |
$page['data'][] =& $it->getCurrent(); |
} |
require_once 'Pager/Pager.php'; |
$pager = Pager::factory($pager_options); |
$page['links'] = $pager->links; |
$page['totalItems'] = $pager_options['totalItems']; |
$page['page_numbers'] = array( |
'current' => $pager->getCurrentPageID(), |
'total' => $numpages |
); |
$page['perPageSelectBox'] = $pager->getperpageselectbox(); |
list($page['from'], $page['to']) = $pager->getOffsetByPageId(); |
$page['limit'] = $page['to'] - $page['from'] +1; |
if ($disabled) { |
$page['links'] = ''; |
$page['page_numbers'] = array( |
'current' => 1, |
'total' => 1 |
); |
} |
return $page; |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/Jumping.php |
---|
New file |
0,0 → 1,280 |
<?php |
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
/** |
* Contains the Pager_Jumping 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 dot alberton at quipo dot it> |
* @author Richard Heyes <richard@phpguru.org>, |
* @copyright 2003-2006 Lorenzo Alberton, Richard Heyes |
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) |
* @version CVS: $Id$ |
* @link http://pear.php.net/package/Pager |
*/ |
/** |
* require PEAR::Pager_Common base class |
*/ |
require_once 'Pager/Common.php'; |
/** |
* Pager_Jumping - Generic data paging class ("jumping window" style) |
* Handles paging a set of data. For usage see the example.php provided. |
* |
* @category HTML |
* @package Pager |
* @author Lorenzo Alberton <l dot alberton at quipo dot it> |
* @author Richard Heyes <richard@phpguru.org>, |
* @copyright 2003-2005 Lorenzo Alberton, Richard Heyes |
* @license http://www.php.net/license/3_0.txt PHP License 3.0 |
* @link http://pear.php.net/package/Pager |
*/ |
class Pager_Jumping extends Pager_Common |
{ |
// {{{ Pager_Jumping() |
/** |
* Constructor |
* |
* @param array $options An associative array of option names |
* and their values |
* @access public |
*/ |
function Pager_Jumping($options = array()) |
{ |
$err = $this->setOptions($options); |
if ($err !== PAGER_OK) { |
return $this->raiseError($this->errorMessage($err), $err); |
} |
$this->build(); |
} |
// }}} |
// {{{ build() |
/** |
* Generate or refresh the links and paged data after a call to setOptions() |
* |
* @access public |
*/ |
function build() |
{ |
//reset |
$this->_pageData = array(); |
$this->links = ''; |
$this->_generatePageData(); |
$this->_setFirstLastText(); |
$this->links .= $this->_getBackLink(); |
$this->links .= $this->_getPageLinks(); |
$this->links .= $this->_getNextLink(); |
$this->linkTags .= $this->_getFirstLinkTag(); |
$this->linkTags .= $this->_getPrevLinkTag(); |
$this->linkTags .= $this->_getNextLinkTag(); |
$this->linkTags .= $this->_getLastLinkTag(); |
} |
// }}} |
// {{{ getPageIdByOffset() |
/** |
* 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; |
} |
// }}} |
// {{{ 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=3 and delta=10, it will return (1, 10). |
* PageID of 8 would give you (1, 10) as well, because 1 <= 8 <= 10. |
* PageID of 11 would give you (11, 20). |
* 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[$pageid]) || is_null($this->_itemData)) { |
// I'm sure I'm missing something here, but this formula works |
// so I'm using it until I find something simpler. |
$start = ((($pageid + (($this->_delta - ($pageid % $this->_delta))) % $this->_delta) / $this->_delta) - 1) * $this->_delta +1; |
return array( |
max($start, 1), |
min($start+$this->_delta-1, $this->_totalPages) |
); |
} else { |
return array(0, 0); |
} |
} |
// }}} |
// {{{ getLinks() |
/** |
* Returns back/next/first/last and page links, |
* both as ordered and associative array. |
* |
* NB: in original PEAR::Pager this method accepted two parameters, |
* $back_html and $next_html. Now the only parameter accepted is |
* an integer ($pageID), since the html text for prev/next links can |
* be set in the constructor. If a second parameter is provided, then |
* the method act as it previously did. This hack's only purpose is to |
* mantain backward compatibility. |
* |
* @param integer $pageID Optional pageID. If specified, links |
* for that page are provided instead of current one. |
* [ADDED IN NEW PAGER VERSION] |
* @param string $next_html HTML to put inside the next link |
* [deprecated: use the constructor instead] |
* @return array Back/pages/next links |
*/ |
function getLinks($pageID=null, $next_html='') |
{ |
//BC hack |
if (!empty($next_html)) { |
$back_html = $pageID; |
$pageID = null; |
} else { |
$back_html = ''; |
} |
if (!is_null($pageID)) { |
$_sav = $this->_currentPage; |
$this->_currentPage = $pageID; |
$this->links = ''; |
if ($this->_totalPages > $this->_delta) { |
$this->links .= $this->_printFirstPage(); |
} |
$this->links .= $this->_getBackLink('', $back_html); |
$this->links .= $this->_getPageLinks(); |
$this->links .= $this->_getNextLink('', $next_html); |
if ($this->_totalPages > $this->_delta) { |
$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; |
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 |
); |
} |
// }}} |
// {{{ _getPageLinks() |
/** |
* Returns pages link |
* |
* @param $url URL to use in the link |
* [deprecated: use the constructor instead] |
* @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 = ''; |
$limits = $this->getPageRangeByPageId($this->_currentPage); |
for ($i=$limits[0]; $i<=min($limits[1], $this->_totalPages); $i++) { |
if ($i != $this->_currentPage) { |
$this->range[$i] = false; |
$this->_linkData[$this->_urlVar] = $i; |
$links .= $this->_renderLink($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 : ''); |
} |
return $links; |
} |
// }}} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/Sliding.php |
---|
New file |
0,0 → 1,324 |
<?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 dot alberton at quipo dot it> |
* @copyright 2003-2006 Lorenzo Alberton |
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) |
* @version CVS: $Id$ |
* @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 dot alberton at quipo dot it> |
* @copyright 2003-2005 Lorenzo Alberton |
* @license http://www.php.net/license/3_0.txt PHP License 3.0 |
* @link http://pear.php.net/package/Pager |
*/ |
class Pager_Sliding extends Pager_Common |
{ |
// {{{ Pager_Sliding() |
/** |
* Constructor |
* |
* @param array $options An associative array of option names |
* and their values |
* @access public |
*/ |
function Pager_Sliding($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><u>'; |
$this->_curPageSpanPost = '</u></b>'; |
//set custom options |
$err = $this->setOptions($options); |
if ($err !== PAGER_OK) { |
return $this->raiseError($this->errorMessage($err), $err); |
} |
$this->build(); |
} |
// }}} |
// {{{ build() |
/** |
* Generate or refresh the links and paged data after a call to setOptions() |
* |
* @access public |
*/ |
function build() |
{ |
//reset |
$this->_pageData = array(); |
$this->links = ''; |
$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(); |
$this->linkTags .= $this->_getFirstLinkTag(); |
$this->linkTags .= $this->_getPrevLinkTag(); |
$this->linkTags .= $this->_getNextLinkTag(); |
$this->linkTags .= $this->_getLastLinkTag(); |
if ($this->_totalPages > (2 * $this->_delta + 1)) { |
$this->links .= $this->_printLastPage(); |
} |
} |
// }}} |
// {{{ getPageIdByOffset() |
/** |
* "Overload" PEAR::Pager method. VOID. Not needed here... |
* @param integer $index Offset to get pageID for |
* @deprecated |
* @access public |
*/ |
function getPageIdByOffset($index=null) { } |
// }}} |
// {{{ 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 = $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. |
* @return array back/pages/next/first/last/all links |
* @access public |
*/ |
function getLinks($pageID = null) |
{ |
if ($pageID != null) { |
$_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; |
if ($pageID != null) { |
$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 |
); |
} |
// }}} |
// {{{ _getPageLinks() |
/** |
* Returns pages link |
* |
* @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($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 |
$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($this->_altPage.' '.$i, $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($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; |
$this->_linkData[$this->_urlVar] = $i; |
$links .= $this->_renderLink($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 : ''); |
} |
} |
return $links; |
} |
// }}} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/HtmlWidgets.php |
---|
New file |
0,0 → 1,217 |
<?php |
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
/** |
* Contains the Pager_HtmlWidgets 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 dot alberton at quipo dot it> |
* @copyright 2003-2006 Lorenzo Alberton |
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) |
* @version CVS: $Id$ |
* @link http://pear.php.net/package/Pager |
*/ |
/** |
* Two constants used to guess the path- and file-name of the page |
* when the user doesn't set any other value |
*/ |
class Pager_HtmlWidgets |
{ |
var $pager = null; |
// {{{ constructor |
function Pager_HtmlWidgets(&$pager) |
{ |
$this->pager =& $pager; |
} |
// }}} |
// {{{ 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 |
* @param boolean $showAllData If true, perPage is set equal to totalItems. |
* @param array (or string $optionText for BC reasons) |
* - 'optionText': text to show in each option. |
* Use '%d' where you want to see the number of pages selected. |
* - 'attributes': (html attributes) Tag attributes or |
* HTML attributes (id="foo" pairs), will be inserted in the |
* <select> tag |
* @return string xhtml select box |
* @access public |
*/ |
function getPerPageSelectBox($start=5, $end=30, $step=5, $showAllData=false, $extraParams=array()) |
{ |
// FIXME: needs POST support |
$optionText = '%d'; |
$attributes = ''; |
if (is_string($extraParams)) { |
//old behavior, BC maintained |
$optionText = $extraParams; |
} else { |
if (array_key_exists('optionText', $extraParams)) { |
$optionText = $extraParams['optionText']; |
} |
if (array_key_exists('attributes', $extraParams)) { |
$attributes = $extraParams['attributes']; |
} |
} |
if (!strstr($optionText, '%d')) { |
return $this->pager->raiseError( |
$this->pager->errorMessage(ERROR_PAGER_INVALID_PLACEHOLDER), |
ERROR_PAGER_INVALID_PLACEHOLDER |
); |
} |
$start = (int)$start; |
$end = (int)$end; |
$step = (int)$step; |
if (!empty($_SESSION[$this->pager->_sessionVar])) { |
$selected = (int)$_SESSION[$this->pager->_sessionVar]; |
} else { |
$selected = $this->pager->_perPage; |
} |
$tmp = '<select name="'.$this->pager->_sessionVar.'"'; |
if (!empty($attributes)) { |
$tmp .= ' '.$attributes; |
} |
$tmp .= '>'; |
for ($i=$start; $i<=$end; $i+=$step) { |
$tmp .= '<option value="'.$i.'"'; |
if ($i == $selected) { |
$tmp .= ' selected="selected"'; |
} |
$tmp .= '>'.sprintf($optionText, $i).'</option>'; |
} |
if ($showAllData && $end < $this->pager->_totalItems) { |
$tmp .= '<option value="'.$this->pager->_totalItems.'"'; |
if ($this->pager->_totalItems == $selected) { |
$tmp .= ' selected="selected"'; |
} |
$tmp .= '>'; |
if (empty($this->pager->_showAllText)) { |
$tmp .= str_replace('%d', $this->pager->_totalItems, $optionText); |
} else { |
$tmp .= $this->pager->_showAllText; |
} |
$tmp .= '</option>'; |
} |
$tmp .= '</select>'; |
return $tmp; |
} |
// }}} |
// {{{ getPageSelectBox() |
/** |
* Returns a string with a XHTML SELECT menu with the page numbers, |
* useful as an alternative to the links |
* |
* @param array - 'optionText': text to show in each option. |
* Use '%d' where you want to see the number of pages selected. |
* - 'autoSubmit': if TRUE, add some js code to submit the |
* form on the onChange event |
* @param string $extraAttributes (html attributes) Tag attributes or |
* HTML attributes (id="foo" pairs), will be inserted in the |
* <select> tag |
* @return string xhtml select box |
* @access public |
*/ |
function getPageSelectBox($params = array(), $extraAttributes = '') |
{ |
$optionText = '%d'; |
if (array_key_exists('optionText', $params)) { |
$optionText = $params['optionText']; |
} |
if (!strstr($optionText, '%d')) { |
return $this->pager->raiseError( |
$this->pager->errorMessage(ERROR_PAGER_INVALID_PLACEHOLDER), |
ERROR_PAGER_INVALID_PLACEHOLDER |
); |
} |
$tmp = '<select name="'.$this->pager->_urlVar.'"'; |
if (!empty($extraAttributes)) { |
$tmp .= ' '.$extraAttributes; |
} |
if (!empty($params['autoSubmit'])) { |
if ($this->pager->_httpMethod == 'GET') { |
$selector = '\' + '.'this.options[this.selectedIndex].value + \''; |
if ($this->pager->_append) { |
$href = '?' . $this->pager->_http_build_query_wrapper($this->pager->_linkData); |
$href = htmlentities($this->pager->_url). preg_replace( |
'/(&|&|\?)('.$this->pager->_urlVar.'=)(\d+)/', |
'\\1\\2'.$selector, |
htmlentities($href) |
); |
} else { |
$href = htmlentities($this->pager->_url . str_replace('%d', $selector, $this->pager->_fileName)); |
} |
$tmp .= ' onchange="document.location.href=\'' |
. $href .'\'' |
. '"'; |
} elseif ($this->pager->_httpMethod == 'POST') { |
$tmp .= " onchange='" |
. $this->pager->_generateFormOnClick($this->pager->_url, $this->pager->_linkData) |
. "'"; |
$tmp = preg_replace( |
'/(input\.name = \"'.$this->pager->_urlVar.'\"; input\.value =) \"(\d+)\";/', |
'\\1 this.options[this.selectedIndex].value;', |
$tmp |
); |
} |
} |
$tmp .= '>'; |
$start = 1; |
$end = $this->pager->numPages(); |
$selected = $this->pager->getCurrentPageID(); |
for ($i=$start; $i<=$end; $i++) { |
$tmp .= '<option value="'.$i.'"'; |
if ($i == $selected) { |
$tmp .= ' selected="selected"'; |
} |
$tmp .= '>'.sprintf($optionText, $i).'</option>'; |
} |
$tmp .= '</select>'; |
return $tmp; |
} |
// }}} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_post_test.php |
---|
New file |
0,0 → 1,67 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerPOST extends WebTestCase { |
var $pager; |
var $baseurl; |
var $options = array(); |
function TestOfPagerPOST($name='Test of Pager with httpMethod="POST"') { |
$this->WebTestCase($name); |
} |
function setUp() { |
$this->options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 1, |
'clearIfVoid' => false, |
'httpMethod' => 'POST', |
); |
//$this->pager = Pager::factory($this->options); |
$this->baseurl = 'http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testMultibyteEncoded() { |
$test_strings_encoded = array( |
'encoded1' => '测试', |
'encoded2' => '안녕', |
); |
$loaded = $this->get($this->baseurl.'/multibyte_post.php'); |
$this->assertTrue($loaded); |
$this->assertResponse(200); |
$this->assertTitle('Pager Test: page 1'); |
$this->assertNoLink('1'); |
$this->assertLink('2'); |
$this->assertLink('Next >>'); |
//$this->showSource(); |
foreach ($test_strings_encoded as $name => $value) { |
$this->assertWantedPattern('/'.$name.'.*'.preg_quote(str_replace('&', '&', $value)).'/Uims'); |
} |
} |
function testMultibytePlain() { |
$test_strings_plain = array( |
'plain1' => '안녕', |
'plain2' => '더보기', |
// 'plain3' => '이젠 전화도 |
//로 걸면 무료', |
); |
$loaded = $this->get($this->baseurl.'/multibyte_post.php'); |
$this->assertTrue($loaded); |
$this->assertResponse(200); |
$this->assertTitle('Pager Test: page 1'); |
$this->assertNoLink('1'); |
$this->assertLink('2'); |
$this->assertLink('Next >>'); |
//$this->showSource(); |
foreach ($test_strings_plain as $name => $value) { |
$this->assertWantedPattern('/'.$name.'.*'.preg_quote(urlencode($value)).'/Uims'); |
} |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_sliding_test.php |
---|
New file |
0,0 → 1,56 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerSliding extends UnitTestCase { |
var $pager; |
function TestOfPagerSliding($name='Test of Pager_Sliding') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), |
'perPage' => 2, |
'mode' => 'Sliding', |
); |
$this->pager = Pager::factory($options); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testPageRangeByPageId1() { |
$this->assertEqual(array(1, 5), $this->pager->getPageRangeByPageId(1)); |
} |
function testPageRangeByPageId4() { |
$this->assertEqual(array(2, 6), $this->pager->getPageRangeByPageId(4)); |
} |
function testPageRangeByPageId_outOfRange() { |
$this->assertEqual(array(0, 0), $this->pager->getPageRangeByPageId(20)); |
} |
function testPageRangeByPageId2() { |
$this->assertEqual(array(2, 6), $this->pager->getPageRangeByPageId(4)); |
} |
function testGetPageData() { |
$this->assertEqual(array(0=>1, 1=>2), $this->pager->getPageData()); |
} |
function testGetPageData2() { |
$this->assertEqual(array(2=>3, 3=>4), $this->pager->getPageData(2)); |
} |
function testGetPageData_OutOfRange() { |
$this->assertEqual(false, $this->pager->getPageData(20)); |
} |
function testClearIfVoid() { |
$this->assertTrue(strlen($this->pager->links) > 0); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), |
'perPage' => 20, |
'mode' => 'Sliding', |
); |
$this->pager = Pager::factory($options); |
$this->assertEqual('', $this->pager->links); |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/README |
---|
New file |
0,0 → 1,5 |
These tests require Simple Test: http://www.lastcraft.com/simple_test.php |
- edit the simple_include.php script and set your SimpleTest install dir; |
- edit the pager_include.php and pager_wrapper_include.php scripts to set |
your Pager directory. |
/branches/livraison_narmer/api/pear/Pager/tests/pager_jumping_tests.php |
---|
New file |
0,0 → 1,20 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class PagerJumpingTests extends GroupTest { |
function PagerJumpingTests() { |
$this->GroupTest('Pager_Jumping Tests'); |
$this->addTestFile('pager_jumping_test.php'); |
$this->addTestFile('pager_jumping_noData_test.php'); |
} |
} |
if (!defined('TEST_RUNNING')) { |
define('TEST_RUNNING', true); |
$test = &new PagerTests(); |
$test->run(new HtmlReporter()); |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_jumping_noData_test.php |
---|
New file |
0,0 → 1,36 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerJumpingNoData extends UnitTestCase { |
var $pager; |
function TestOfPagerJumpingNoData($name='Test of Pager_Jumping - no data') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'totalItems' => 0, |
'perPage' => 2, |
'mode' => 'Jumping', |
); |
$this->pager = Pager::factory($options); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testOffsetByPageId() { |
$this->assertEqual(array(1, 0), $this->pager->getOffsetByPageId()); |
} |
function testPageIdByOffset() { |
$this->assertEqual(false, $this->pager->getPageIdByOffset(0)); |
} |
function testPageIdByOffset2() { |
$this->assertEqual(1, $this->pager->getPageIdByOffset(1)); |
} |
function testPageIdByOffset3() { |
$this->assertEqual(1, $this->pager->getPageIdByOffset(2)); |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_tests.php |
---|
New file |
0,0 → 1,20 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class PagerTests extends GroupTest { |
function PagerTests() { |
$this->GroupTest('Pager Tests'); |
$this->addTestFile('pager_test.php'); |
$this->addTestFile('pager_noData_test.php'); |
} |
} |
if (!defined('TEST_RUNNING')) { |
define('TEST_RUNNING', true); |
$test = &new PagerTests(); |
$test->run(new HtmlReporter()); |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/multibyte_post.php |
---|
New file |
0,0 → 1,48 |
<?php |
require_once 'Pager/Pager.php'; |
//create dummy array of data |
$myData = array(); |
for ($i=0; $i<200; $i++) { |
$myData[] = $i; |
} |
//set a string |
$test_strings_encoded = array( |
'encoded1' => '测试', |
'encoded2' => '안녕', |
); |
$test_strings_plain = array( |
'plain1' => '안녕', |
'plain2' => '더보기', |
// 'plain3' => '이젠 전화도 |
//로 걸면 무료', |
); |
$params = array( |
'itemData' => $myData, |
'perPage' => 10, |
'delta' => 2, |
'append' => true, |
'clearIfVoid' => false, |
'extraVars' => array_merge($test_strings_plain, $test_strings_encoded), |
'httpMethod' => 'POST', |
'path' => 'http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')), |
'fileName' => basename(__FILE__), |
); |
//var_dump($params['fileName']);exit; |
$pager = & Pager::factory($params); |
$page_data = $pager->getPageData(); |
?> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 |
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml"> |
<head> |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
<title>Pager Test: page <?php echo $pager->getCurrentPageID(); ?></title> |
</head> |
<body> |
<?php echo $pager->links; ?> |
<hr /> |
<pre><?php print_r($page_data); ?></pre> |
</body> |
</html> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_noData_test.php |
---|
New file |
0,0 → 1,48 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerNoData extends UnitTestCase { |
var $pager; |
function TestOfPagerNoData($name='Test of Pager - no data') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'totalItems' => 0, |
'perPage' => 5, |
'mode' => 'Sliding', |
); |
$this->pager = Pager::factory($options); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testCurrentPageID () { |
$this->assertEqual(0, $this->pager->getCurrentPageID()); |
} |
function testNextPageID () { |
$this->assertEqual(false, $this->pager->getNextPageID()); |
} |
function testPrevPageID () { |
$this->assertEqual(false, $this->pager->getPreviousPageID()); |
} |
function testNumItems () { |
$this->assertEqual(0, $this->pager->numItems()); |
} |
function testNumPages () { |
$this->assertEqual(0, $this->pager->numPages()); |
} |
function testFirstPage () { |
$this->assertEqual(true, $this->pager->isFirstPage()); |
} |
function testLastPage () { |
$this->assertEqual(true, $this->pager->isLastPage()); |
} |
function testLastPageComplete () { |
$this->assertEqual(true, $this->pager->isLastPageComplete()); |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_post_tests.php |
---|
New file |
0,0 → 1,11 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
$test = &new GroupTest('Pager POST tests'); |
$test->addTestFile('pager_post_test.php'); |
exit ($test->run(new HTMLReporter()) ? 0 : 1); |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_jumping_test.php |
---|
New file |
0,0 → 1,83 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerJumping extends UnitTestCase { |
var $pager; |
function TestOfPagerJumping($name='Test of Pager_Jumping') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), |
'perPage' => 5, |
'mode' => 'Jumping', |
'delta' => 2 |
); |
$this->pager = Pager::factory($options); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testPageIdByOffset1() { |
$this->assertEqual(1, $this->pager->getPageIdByOffset(1)); |
} |
function testPageIdByOffset5() { |
$this->assertEqual(1, $this->pager->getPageIdByOffset(5)); |
} |
function testPageIdByOffset6() { |
$this->assertEqual(2, $this->pager->getPageIdByOffset(6)); |
} |
function testPageRangeByPageId1() { |
$this->assertEqual(array(1, 2), $this->pager->getPageRangeByPageId(1)); |
} |
function testPageRangeByPageId2() { |
$this->assertEqual(array(1, 2), $this->pager->getPageRangeByPageId(2)); |
} |
function testPageRangeByPageId3() { |
$this->assertEqual(array(3, 3), $this->pager->getPageRangeByPageId(3)); |
} |
function testPageRangeByPageId_outOfRange() { |
$this->assertEqual(array(0, 0), $this->pager->getPageRangeByPageId(20)); |
} |
function testGetPageData() { |
$this->assertEqual(array(0=>1, 1=>2, 2=>3, 3=>4, 4=>5), $this->pager->getPageData()); |
} |
function testGetPageData2() { |
$this->assertEqual(array(5=>6, 6=>7, 7=>8, 8=>9, 9=>10), $this->pager->getPageData(2)); |
} |
function testGetPageData_OutOfRange() { |
$this->assertEqual(false, $this->pager->getPageData(4)); |
} |
/** |
* Returns offsets for given pageID. Eg, if you pass pageID=5 and your |
* delta is 2, it will return 3 and 7. A pageID of 6 would give you 4 and 8 |
* If the method is called without parameter, pageID is set to currentPage#. |
* |
* 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 perPage=10 and pageId=3, it will return you 1 and 10. |
* PageID of 8 would give you 1 and 10 as well, because 1 <= 8 <= 10. |
* PageID of 11 would give you 11 and 20. |
* |
* @param pageID PageID to get offsets for |
* @return array First and last offsets |
* @access public |
*/ |
/** |
* 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 perPage=10 and pageId=3, it will return you 1 and 10. |
* PageID of 8 would give you 1 and 10 as well, because 1 <= 8 <= 10. |
* PageID of 11 would give you 11 and 20. |
* |
* @param pageID PageID to get offsets for |
* @return array First and last offsets |
* @access public |
*/ |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_sliding_tests.php |
---|
New file |
0,0 → 1,21 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class PagerSlidingTests extends GroupTest { |
function PagerSlidingTests() { |
$this->GroupTest('Pager_Sliding Tests'); |
$this->addTestFile('pager_sliding_test.php'); |
$this->addTestFile('pager_sliding_notExpanded_test.php'); |
$this->addTestFile('pager_sliding_noData_test.php'); |
} |
} |
if (!defined('TEST_RUNNING')) { |
define('TEST_RUNNING', true); |
$test = &new PagerTests(); |
$test->run(new HtmlReporter()); |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/all_tests.php |
---|
New file |
0,0 → 1,25 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
define('TEST_RUNNING', true); |
require_once './pager_tests.php'; |
require_once './pager_jumping_tests.php'; |
require_once './pager_sliding_tests.php'; |
class AllTests extends GroupTest { |
function AllTests() { |
$this->GroupTest('All PEAR::Pager Tests'); |
$this->AddTestCase(new PagerTests()); |
$this->AddTestCase(new PagerJumpingTests()); |
$this->AddTestCase(new PagerSlidingTests()); |
} |
} |
$test = &new AllTests(); |
$test->run(new HtmlReporter()); |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_test_xss.php |
---|
New file |
0,0 → 1,43 |
<?php |
// $Id$ |
//override url |
$_SERVER['PHP_SELF'] = '">test'; |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerXSS extends UnitTestCase { |
var $pager; |
var $baseurl; |
function TestOfPagerXSS($name='Test of Pager - XSS attacks') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
); |
$this->pager = Pager::factory($options); |
$this->baseurl = substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testXSS() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'nextImg' => '»' |
); |
$this->pager = Pager::factory($options); |
$expected = ' <a href="./">test?pageID=2" title="next page">»</a> '; |
$this->assertEqual($expected, $this->pager->_getNextLink()); |
} |
} |
if (!defined('TEST_RUNNING')) { |
define('TEST_RUNNING', true); |
$test = &new TestOfPagerXSS(); |
$test->run(new HtmlReporter()); |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/simple_include.php |
---|
New file |
0,0 → 1,17 |
<?php |
// $Id$ |
// |
// This testsuite requires SimpleTest. |
// You can find it here: |
// http://www.lastcraft.com/simple_test.php |
// |
if (!defined('SIMPLE_TEST')) { |
define('SIMPLE_TEST', '../simpletest/'); |
} |
require_once(SIMPLE_TEST . 'unit_tester.php'); |
require_once(SIMPLE_TEST . 'reporter.php'); |
require_once(SIMPLE_TEST . 'mock_objects.php'); |
require_once(SIMPLE_TEST . 'web_tester.php'); |
require_once(SIMPLE_TEST . 'reporter.php'); |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_sliding_noData_test.php |
---|
New file |
0,0 → 1,30 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerSlidingNoData extends UnitTestCase { |
var $pager; |
function TestOfPagerSlidingNoData($name='Test of Pager_Sliding - no data') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'totalItems' => 0, |
'perPage' => 2, |
'mode' => 'Sliding', |
); |
$this->pager = Pager::factory($options); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testOffsetByPageId() { |
$this->assertEqual(array(1, 0), $this->pager->getOffsetByPageId()); |
} |
function testPageIdByOffset() { |
$this->assertNull($this->pager->getPageIdByOffset()); |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_wrapper_test.php |
---|
New file |
0,0 → 1,205 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_wrapper_include.php'; |
class TestOfPagerWrapper extends UnitTestCase |
{ |
function TestOfPagerWrapper($name='Test of Pager_Wrapper') { |
$this->UnitTestCase($name); |
} |
function setUp() { } |
function tearDown() { } |
/** |
* Basic tests for rewriteCountQuery() |
*/ |
function testRewriteCountQuery() { |
//test LIMIT |
$query = 'SELECT a, b, c, d FROM mytable WHERE a=1 AND c="g" LIMIT 2'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
//test ORDER BY and quotes |
$query = 'SELECT a, b, c, d FROM mytable WHERE a=1 AND c="g" ORDER BY (a, b)'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
//test CR/LF |
$query = 'SELECT a, b, c, d FROM mytable |
WHERE a=1 |
AND c="g" |
ORDER BY (a, b)'; |
$expected = 'SELECT COUNT(*) FROM mytable |
WHERE a=1 |
AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
//test GROUP BY |
$query = 'SELECT a, b, c, d FROM mytable WHERE a=1 GROUP BY c'; |
$this->assertFalse(rewriteCountQuery($query)); |
//test DISTINCT |
$query = 'SELECT DISTINCT a, b, c, d FROM mytable WHERE a=1 GROUP BY c'; |
$this->assertFalse(rewriteCountQuery($query)); |
//test MiXeD Keyword CaSe |
$query = 'SELECT a, b, c, d from mytable WHERE a=1 AND c="g"'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
//test function speed... this query used to be very slow to parse |
$query = "SELECT i.item_id, |
ia.addition, |
u.username, |
i.date_created, |
i.start_date, |
i.expiry_date |
FROM item i, item_addition ia, item_type it, item_type_mapping itm, usr u, category c |
WHERE ia.item_type_mapping_id = itm.item_type_mapping_id |
AND i.updated_by_id = u.usr_id |
AND it.item_type_id = itm.item_type_id |
AND i.item_id = ia.item_id |
AND i.item_type_id = it.item_type_id |
AND itm.field_name = 'title' AND it.item_type_id = 2 AND i.category_id = 1 AND i.status = 4 |
AND i.category_id = c.category_id |
AND 0 NOT IN (COALESCE(c.perms, '-1')) |
ORDER BY i.last_updated DESC"; |
$expected = "SELECT COUNT(*) FROM item i, item_addition ia, item_type it, item_type_mapping itm, usr u, category c |
WHERE ia.item_type_mapping_id = itm.item_type_mapping_id |
AND i.updated_by_id = u.usr_id |
AND it.item_type_id = itm.item_type_id |
AND i.item_id = ia.item_id |
AND i.item_type_id = it.item_type_id |
AND itm.field_name = 'title' AND it.item_type_id = 2 AND i.category_id = 1 AND i.status = 4 |
AND i.category_id = c.category_id |
AND 0 NOT IN (COALESCE(c.perms, '-1'))"; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
} |
/** |
* Test rewriteCountQuery() with queries having a subquery in the SELECT clause |
*/ |
function testRewriteCountQuery_SubqueriesInSelectClause() { |
$query = 'SELECT a, (SELECT a FROM b) AS b, c, d FROM mytable WHERE a=1 AND c="g" LIMIT 2'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertFalse(rewriteCountQuery($query)); |
$query = 'SELECT a, (SELECT a FROM b) AS b, (SELECT c FROM c) AS c, d FROM mytable WHERE a=1 AND c="g" LIMIT 2'; |
//$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertFalse(rewriteCountQuery($query)); |
$query = 'SELECT `id`, `ip`, ( |
SELECT TIMEDIFF(MAX(P.`time`), MIN(P.`time`)) |
FROM `przejscia` as P |
WHERE P.`id_wejscia`=W.`id` |
) as `czas` |
FROM `wejscia` as W |
WHERE W.id_domeny=? |
ORDER BY W.czas_wejscia DESC'; |
$expected = 'SELECT COUNT(*) |
FROM `wejscia` as W |
WHERE W.id_domeny=? |
ORDER BY W.czas_wejscia DESC'; |
$this->assertFalse(rewriteCountQuery($query)); |
} |
/** |
* Test rewriteCountQuery() with queries having a subquery in the FROM clause |
*/ |
function testRewriteCountQuery_SubqueriesInFromClause() { |
$query = 'SELECT a, b, c, d FROM (SELECT a, b, c, d FROM mytable WHERE a=1) AS tbl_alias WHERE a=1'; |
$expected = 'SELECT COUNT(*) FROM (SELECT a, b, c, d FROM mytable WHERE a=1) AS tbl_alias WHERE a=1'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
} |
/** |
* Test rewriteCountQuery() with queries having a subquery in the WHERE clause |
*/ |
function testRewriteCountQuery_SubqueriesInWhereClause() { |
//this one is not rewritten: subqueries with ORDER BY clauses might get truncated |
$query = 'SELECT Version.VersionId, Version.Identifier,News.* |
FROM VersionBroker |
JOIN ObjectType ON ObjectType.ObjectTypeId = VersionBroker.ObjectTypeId |
JOIN Version ON VersionBroker.Identifier = Version.Identifier |
JOIN News ON Version.ObjectId = News.NewsId |
WHERE Version.Status = \'Approved\' |
AND ObjectType.Name = \'News\' |
AND Version.ApprovedTS = ( |
SELECT SubV.ApprovedTS |
FROM Version SubV |
WHERE SubV.Identifier = VersionBroker.Identifier |
ORDER BY ApprovedTS DESC |
LIMIT 1) |
ORDER BY ApprovedTS DESC'; |
$expected = 'SELECT COUNT(*) |
FROM VersionBroker |
JOIN ObjectType ON ObjectType.ObjectTypeId = VersionBroker.ObjectTypeId |
JOIN Version ON VersionBroker.Identifier = Version.Identifier |
JOIN News ON Version.ObjectId = News.NewsId |
WHERE Version.Status = \'Approved\' |
AND ObjectType.Name = \'News\' |
AND Version.ApprovedTS = ( |
SELECT SubV.ApprovedTS |
FROM Version SubV |
WHERE SubV.Identifier = VersionBroker.Identifier |
ORDER BY ApprovedTS DESC |
LIMIT 1) |
ORDER BY ApprovedTS DESC'; |
//$this->assertEqual($expected, rewriteCountQuery($query)); |
$this->assertFalse(rewriteCountQuery($query)); |
//this one should pass... subquery without ORDER BY or LIMIT clause |
$query = 'SELECT Version.VersionId, Version.Identifier,News.* FROM VersionBroker JOIN |
ObjectType ON ObjectType.ObjectTypeId = VersionBroker.ObjectTypeId JOIN |
Version ON VersionBroker.Identifier = Version.Identifier JOIN News ON |
Version.ObjectId = News.NewsId WHERE Version.Status = \'Approved\' AND |
ObjectType.Name = \'News\' AND Version.ApprovedTS = ( SELECT SubV.ApprovedTS |
FROM Version SubV WHERE SubV.Identifier = VersionBroker.Identifier ) ORDER BY ApprovedTS DESC'; |
$expected = 'SELECT COUNT(*) FROM VersionBroker JOIN |
ObjectType ON ObjectType.ObjectTypeId = VersionBroker.ObjectTypeId JOIN |
Version ON VersionBroker.Identifier = Version.Identifier JOIN News ON |
Version.ObjectId = News.NewsId WHERE Version.Status = \'Approved\' AND |
ObjectType.Name = \'News\' AND Version.ApprovedTS = ( SELECT SubV.ApprovedTS |
FROM Version SubV WHERE SubV.Identifier = VersionBroker.Identifier )'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
} |
/** |
* Test rewriteCountQuery() with queries having keywords embedded in other words |
*/ |
function testRewriteCountQuery_EmbeddedKeywords() { |
$query = 'SELECT afieldFROM, b, c, d FROM mytable WHERE a=1 AND c="g"'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
$query = 'SELECT FROMafield, b, c, d FROM mytable WHERE a=1 AND c="g"'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
$query = 'SELECT afieldFROMaaa, b, c, d FROM mytable WHERE a=1 AND c="gLIMIT"'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="gLIMIT"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
$query = 'SELECT DISTINCTaaa, b, c, d FROM mytable WHERE a=1 AND c="g"'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
//this one fails... the regexp should NOT match keywords within quotes. |
//we need a full blown stack-based parser to catch this... |
$query = 'SELECT afieldFROMaaa, b, c, d FROM mytable WHERE a=1 AND c="g LIMIT a"'; |
$expected = 'SELECT COUNT(*) FROM mytable WHERE a=1 AND c="g LIMIT a"'; |
$this->assertEqual($expected, rewriteCountQuery($query)); |
} |
} |
if (!defined('TEST_RUNNING')) { |
define('TEST_RUNNING', true); |
$test = &new TestOfPagerWrapper(); |
$test->run(new HtmlReporter()); |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_test.php |
---|
New file |
0,0 → 1,553 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPager extends UnitTestCase { |
var $pager; |
var $baseurl; |
function TestOfPager($name='Test of Pager') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
); |
$this->pager = Pager::factory($options); |
$this->baseurl = substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testCurrentPageID () { |
$this->assertEqual(1, $this->pager->getCurrentPageID()); |
} |
function testNextPageID () { |
$this->assertEqual(2, $this->pager->getNextPageID()); |
} |
function testPrevPageID () { |
$this->assertEqual(false, $this->pager->getPreviousPageID()); |
} |
function testNumItems () { |
$this->assertEqual(10, $this->pager->numItems()); |
} |
function testNumPages () { |
$this->assertEqual(2, $this->pager->numPages()); |
} |
function testFirstPage () { |
$this->assertEqual(true, $this->pager->isFirstPage()); |
} |
function testLastPage () { |
$this->assertEqual(false, $this->pager->isLastPage()); |
} |
function testLastPageComplete () { |
$this->assertEqual(true, $this->pager->isLastPageComplete()); |
} |
function testOffsetByPageId() { |
$this->assertEqual(array(1, 5), $this->pager->getOffsetByPageId(1)); |
$this->assertEqual(array(6, 10), $this->pager->getOffsetByPageId(2)); |
} |
function testOffsetByPageId_outOfRange() { |
$this->assertEqual(array(0, 0), $this->pager->getOffsetByPageId(20)); |
} |
function testGetPageData() { |
$this->assertEqual(array(0=>1, 1=>2, 2=>3, 3=>4, 4=>5), $this->pager->getPageData()); |
$this->assertEqual(array(5=>6, 6=>7, 7=>8, 8=>9, 9=>10), $this->pager->getPageData(2)); |
} |
function testGetPageData_OutOfRange() { |
$this->assertEqual(array(), $this->pager->getPageData(3)); |
} |
function testSelectBox() { |
$selectBox = '<select name="'.$this->pager->_sessionVar.'">'; |
$selectBox .= '<option value="5" selected="selected">5</option>'; |
$selectBox .= '<option value="10">10</option>'; |
$selectBox .= '<option value="15">15</option>'; |
$selectBox .= '</select>'; |
$this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(5, 15, 5)); |
} |
function testSelectBoxWithString() { |
$selectBox = '<select name="'.$this->pager->_sessionVar.'">'; |
$selectBox .= '<option value="5" selected="selected">5 bugs</option>'; |
$selectBox .= '<option value="10">10 bugs</option>'; |
$selectBox .= '<option value="15">15 bugs</option>'; |
$selectBox .= '</select>'; |
$this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(5, 15, 5, false, '%d bugs')); |
} |
function testSelectBoxWithShowAll() { |
$selectBox = '<select name="'.$this->pager->_sessionVar.'">'; |
$selectBox .= '<option value="3">3</option>'; |
$selectBox .= '<option value="4">4</option>'; |
$selectBox .= '<option value="5" selected="selected">5</option>'; |
$selectBox .= '<option value="6">6</option>'; |
$selectBox .= '<option value="10">10</option>'; |
$selectBox .= '</select>'; |
$this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(3, 6, 1, true)); |
} |
function testSelectBoxWithShowAllAndText() { |
$this->pager->_showAllText = 'Show All'; |
$selectBox = '<select name="'.$this->pager->_sessionVar.'">'; |
$selectBox .= '<option value="3">3 bugs</option>'; |
$selectBox .= '<option value="4">4 bugs</option>'; |
$selectBox .= '<option value="5" selected="selected">5 bugs</option>'; |
$selectBox .= '<option value="6">6 bugs</option>'; |
$selectBox .= '<option value="10">Show All</option>'; |
$selectBox .= '</select>'; |
$this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(3, 6, 1, true, '%d bugs')); |
} |
function testSelectBoxWithShowAllWithExtraAttribs() { |
$this->pager->_showAllText = 'Show All'; |
$selectBox = '<select name="'.$this->pager->_sessionVar.'" onmouseover="doSth">'; |
$selectBox .= '<option value="3">3 bugs</option>'; |
$selectBox .= '<option value="4">4 bugs</option>'; |
$selectBox .= '<option value="5" selected="selected">5 bugs</option>'; |
$selectBox .= '<option value="6">6 bugs</option>'; |
$selectBox .= '<option value="10">Show All</option>'; |
$selectBox .= '</select>'; |
$params = array('optionText' => '%d bugs', 'attributes' => 'onmouseover="doSth"'); |
$this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(3, 6, 1, true, $params)); |
} |
function testSelectBoxInvalid() { |
$err = $this->pager->getPerPageSelectBox(5, 15, 5, false, '%s bugs'); |
$this->assertEqual(ERROR_PAGER_INVALID_PLACEHOLDER, $err->getCode()); |
} |
function testAppendInvalid() { |
$options = array( |
'totalItems' => 10, |
'append' => false, |
'fileName' => 'invalidFileName' |
); |
$err =& Pager::factory($options); //ERROR_PAGER_INVALID_USAGE |
$this->assertError(); |
} |
function testAppendValid() { |
$options = array( |
'totalItems' => 10, |
'append' => false, |
'fileName' => 'valid_%d_FileName' |
); |
$err =& Pager::factory($options); |
$this->assertNoErrors(); |
} |
function testEscapeEntities() { |
//encode special chars |
$options = array( |
'extraVars' => array( |
'request' => array('aRequest'), |
'escape' => 'äö%<>+', |
), |
'perPage' => 5, |
); |
$this->pager =& Pager::factory($options); |
//$expected = '?request[]=aRequest&escape=äö%<>+&pageID='; |
//$this->assertEqual($expected, $this->pager->_getLinksUrl()); |
$expected = 'request%5B0%5D=aRequest&escape=%E4%F6%25%3C%3E%2B'; |
$rendered = $this->pager->_renderLink('', ''); |
preg_match('/href="(.*)"/U', $rendered, $matches); |
$actual = str_replace($_SERVER['PHP_SELF'].'?', '', $matches[1]); |
$this->assertEqual($expected, $actual); |
//don't encode slashes |
$options = array( |
'extraVars' => array( |
'request' => 'cat/subcat', |
), |
'perPage' => 5, |
); |
$this->pager =& Pager::factory($options); |
//$expected = '?request=cat/subcat&pageID='; |
//$this->assertEqual($expected, $this->pager->_getLinksUrl()); |
$expected = '<a href="'.$_SERVER['PHP_SELF'].'?request=cat/subcat" title=""></a>'; |
$actual = $this->pager->_renderLink('', ''); |
$this->assertEqual($expected, $actual); |
} |
function testMultibyteStrings() { |
$options = array( |
'extraVars' => array( |
'test' => '测试', |
), |
'perPage' => 5, |
); |
$this->pager =& Pager::factory($options); |
//$expected = '<a href="'.$_SERVER['PHP_SELF'].'?test=测试" title=""></a>'; |
$rendered = $this->pager->_renderLink('', ''); |
preg_match('/href="(.*)"/U', $rendered, $matches); |
$actual = str_replace($_SERVER['PHP_SELF'].'?test=', '', $matches[1]); |
$this->assertEqual(urlencode($options['extraVars']['test']), $actual); |
} |
function testCurrentPage() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 2, |
'currentPage' => 2, |
); |
$this->pager =& Pager::factory($options); |
$this->assertEqual(3, $this->pager->getNextPageID()); |
$this->assertEqual(1, $this->pager->getPreviousPageID()); |
$this->assertEqual(2, $this->pager->_currentPage); |
} |
function testArrayExtraVars() { |
$arr = array( |
'apple', |
'orange', |
); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'extraVars' => array('arr' => $arr, 'no' => 'test'), |
); |
$this->pager =& Pager::factory($options); |
/* |
//old |
$expected = '?arr[0]=apple&arr[1]=orange&pageID='; |
$this->assertEqual($expected, $this->pager->_getLinksUrl()); |
*/ |
$expected = $options['extraVars']; |
$this->assertEqual($expected, $this->pager->_getLinksData()); |
$expected = '<a href="'.$_SERVER['PHP_SELF'].'?arr%5B0%5D=apple&arr%5B1%5D=orange&no=test&pageID=2" title=""></a>'; |
$actual = $this->pager->_renderLink('', ''); |
$this->assertEqual($expected, $actual); |
} |
function testExcludeVars() { |
$arr = array( |
'apple', |
'orange', |
); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'extraVars' => array('arr' => $arr, 'no' => 'test'), |
'excludeVars' => array('no'), |
); |
$this->pager =& Pager::factory($options); |
$expected = array( |
'arr' => array( |
0 => 'apple', |
1 => 'orange' |
), |
); |
$actual = $this->pager->_getLinksData(); |
$this->assertEqual($expected, $this->pager->_getLinksData()); |
$expected = '<a href="'.$_SERVER['PHP_SELF'].'?arr%5B0%5D=apple&arr%5B1%5D=orange&pageID=2" title=""></a>'; |
$actual = $this->pager->_renderLink('', ''); |
$this->assertEqual($expected, $actual); |
} |
function testArgSeparator() { |
$bkp_arg_separator = ini_get('arg_separator.output'); |
ini_set('arg_separator.output', '&'); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'extraVars' => array('apple' => 1), |
); |
$this->pager =& Pager::factory($options); |
$expected = '<a href="'.$_SERVER['PHP_SELF'].'?apple=1&pageID=2" title=""></a>'; |
$actual = $this->pager->_renderLink('', ''); |
$this->assertEqual($expected, $actual); |
ini_set('arg_separator.output', $bkp_arg_separator); |
} |
function testAttributes() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'linkClass' => 'testclass', |
'attributes' => 'target="_blank"', |
); |
$this->pager =& Pager::factory($options); |
$expected = '<a href="'.$_SERVER['PHP_SELF'].'?pageID=2" class="testclass" target="_blank" title=""></a>'; |
$actual = $this->pager->_renderLink('', ''); |
$this->assertEqual($expected, $actual); |
} |
function testImportQuery() { |
//add some fake url vars |
$_GET['arr'] = array( |
'apple', |
'orange', |
); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'importQuery' => false, |
); |
$this->pager =& Pager::factory($options); |
$expected = array(); |
$actual = $this->pager->_getLinksData(); |
$this->assertEqual($expected, $this->pager->_getLinksData()); |
$expected = '<a href="'.$_SERVER['PHP_SELF'].'?pageID=2" title=""></a>'; |
$actual = $this->pager->_renderLink('', ''); |
$this->assertEqual($expected, $actual); |
//remove fake url vars |
unset($_GET['arr']); |
} |
function testGetNextLinkTag() { |
//append = true |
$expected = '<link rel="next" href="'.$_SERVER['PHP_SELF'].'?pageID=2" title="next page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getNextLinkTag()); |
//append = false |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 1, |
'append' => false, |
'fileName' => 'myfile.%d.php', |
); |
$this->pager = Pager::factory($options); |
$expected = '<link rel="next" href="'.$this->baseurl.'/myfile.2.php" title="next page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getNextLinkTag()); |
//test empty tag |
$options['currentPage'] = 2; |
$this->pager = Pager::factory($options); |
$this->assertEqual('', $this->pager->_getNextLinkTag()); |
} |
function testGetLastLinkTag() { |
//append = true |
$expected = '<link rel="last" href="'.$_SERVER['PHP_SELF'].'?pageID=2" title="last page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getLastLinkTag()); |
//append = false |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 1, |
'append' => false, |
'fileName' => 'myfile.%d.php', |
); |
$this->pager = Pager::factory($options); |
$expected = '<link rel="last" href="'.$this->baseurl.'/myfile.2.php" title="last page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getLastLinkTag()); |
//test empty tag |
$options['currentPage'] = 2; |
$this->pager = Pager::factory($options); |
$this->assertEqual('', $this->pager->_getLastLinkTag()); |
} |
function testGetFirstLinkTag() { |
//append = true |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
); |
$this->pager = Pager::factory($options); |
$expected = '<link rel="first" href="'.$_SERVER['PHP_SELF'].'?pageID=1" title="first page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getFirstLinkTag()); |
//append = false |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
'append' => false, |
'fileName' => 'myfile.%d.php', |
); |
$this->pager = Pager::factory($options); |
$expected = '<link rel="first" href="'.$this->baseurl.'/myfile.1.php" title="first page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getFirstLinkTag()); |
//test empty tag |
$options['currentPage'] = 1; |
$this->pager = Pager::factory($options); |
$this->assertEqual('', $this->pager->_getFirstLinkTag()); |
} |
function testGetPrevLinkTag() { |
//append = true |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
); |
$this->pager = Pager::factory($options); |
$expected = '<link rel="previous" href="'.$_SERVER['PHP_SELF'].'?pageID=1" title="previous page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getPrevLinkTag()); |
//append = false |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
'append' => false, |
'fileName' => 'myfile.%d.php', |
); |
$this->pager = Pager::factory($options); |
$expected = '<link rel="previous" href="'.$this->baseurl.'/myfile.1.php" title="previous page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getPrevLinkTag()); |
//test empty tag |
$options['currentPage'] = 1; |
$this->pager = Pager::factory($options); |
$this->assertEqual('', $this->pager->_getPrevLinkTag()); |
} |
function testPrintFirstPage() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
); |
$this->pager = Pager::factory($options); |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="first page">[1]</a> '; |
$this->assertEqual($expected, $this->pager->_printFirstPage()); |
$this->pager->_firstPageText = 'FIRST'; |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="first page">[FIRST]</a> '; |
$this->assertEqual($expected, $this->pager->_printFirstPage()); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
'altFirst' => 'page %d', |
); |
$this->pager = Pager::factory($options); |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="page 1">[1]</a> '; |
$this->assertEqual($expected, $this->pager->_printFirstPage()); |
} |
function testPrintLastPage() { |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="last page">[2]</a>'; |
$this->assertEqual($expected, $this->pager->_printLastPage()); |
$this->pager->_lastPageText = 'LAST'; |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="last page">[LAST]</a>'; |
$this->assertEqual($expected, $this->pager->_printLastPage()); |
$this->pager->_altLast = 'page %d'; |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="page 2">[LAST]</a>'; |
$this->assertEqual($expected, $this->pager->_printLastPage()); |
} |
function testGetBackLink() { |
$img = '«'; |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 2, |
'prevImg' => $img, |
); |
$this->pager = Pager::factory($options); |
$expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="previous page">'.$img.'</a> '; |
$this->assertEqual($expected, $this->pager->_getBackLink()); |
} |
function testGetNexLink() { |
$img = '»'; |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'currentPage' => 1, |
'nextImg' => $img, |
); |
$this->pager = Pager::factory($options); |
$expected = ' <a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="next page">'.$img.'</a> '; |
$this->assertEqual($expected, $this->pager->_getNextLink()); |
} |
function testHttpMethodAutoDetect() { |
$_POST['pageID'] = 3; |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
); |
$this->pager = Pager::factory($options); |
$this->assertEqual('POST', $this->pager->_httpMethod); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'httpMethod' => 'GET', |
); |
$this->pager = Pager::factory($options); |
$this->assertEqual('GET', $this->pager->_httpMethod); |
unset($_POST['pageID']); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'httpMethod' => 'POST', |
); |
$this->pager = Pager::factory($options); |
$this->assertEqual('POST', $this->pager->_httpMethod); |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
); |
$this->pager = Pager::factory($options); |
$this->assertEqual('GET', $this->pager->_httpMethod); |
} |
function testAccesskey() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), |
'perPage' => 5, |
'accesskey' => true, |
); |
$this->pager = Pager::factory($options); |
$this->assertWantedPattern('/accesskey="\d"/i', $this->pager->links); |
//var_dump($this->pager->links); |
} |
function testIsEncoded() { |
//var_dump(urlencode('안녕')); |
$test_strings_encoded = array( |
'encoded0' => '试', |
'encoded1' => '测试', |
'encoded2' => '안녕', |
'encoded3' => '안 녕', |
'encoded4' => '안 |
녕', |
); |
$test_strings_plain = array( |
'plain1' => '안녕', |
'plain2' => '더보기', |
// 'plain3' => '이젠 전화도 |
//로 걸면 무료', |
'plain4' => 'abcde', //not multibyte |
'plain5' => '&#abcfg;', //invalid hex-encoded char |
'plain5' => '안 nasty 녕', //mixed plain/encoded text |
); |
foreach ($test_strings_encoded as $string) { |
//echo '<hr />'.str_replace('&', '&', $string); |
$this->assertTrue($this->pager->_isEncoded($string)); |
} |
foreach ($test_strings_plain as $string) { |
$this->assertFalse($this->pager->_isEncoded($string)); |
} |
} |
function testGetOption() { |
$this->assertEqual(5, $this->pager->getOption('perPage')); |
$err = $this->pager->getOption('non_existent_option'); |
$this->assertEqual(ERROR_PAGER_INVALID, $err->getCode()); |
} |
function testGetOptions() { |
$options = $this->pager->getOptions(); |
$this->assertTrue(is_array($options)); |
$this->assertEqual(5, $options['perPage']); |
} |
function testSetOptionsAndBuild() { |
$options = array( |
'perPage' => 2, |
); |
$this->pager->setOptions($options); |
$this->pager->build(); |
$this->assertEqual(2, $this->pager->getOption('perPage')); |
$this->assertEqual(array(0=>1, 1=>2), $this->pager->getPageData()); |
$this->assertEqual(array(2=>3, 3=>4), $this->pager->getPageData(2)); |
$options = array( |
'currentPage' => 2, |
'append' => false, |
'fileName' => 'myfile.%d.php', |
); |
$this->pager->setOptions($options); |
$this->pager->build(); |
$expected = '<link rel="previous" href="'.$this->baseurl.'/myfile.1.php" title="previous page" />'."\n"; |
$this->assertEqual($expected, $this->pager->_getPrevLinkTag()); |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_sliding_notExpanded_test.php |
---|
New file |
0,0 → 1,49 |
<?php |
// $Id$ |
require_once 'simple_include.php'; |
require_once 'pager_include.php'; |
class TestOfPagerSlidingNotExpanded extends UnitTestCase { |
var $pager; |
function TestOfPagerSlidingNotExpanded($name='Test of Pager_Sliding - expanded=false') { |
$this->UnitTestCase($name); |
} |
function setUp() { |
$options = array( |
'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21), |
'perPage' => 2, |
'mode' => 'Sliding', |
'expanded' => false |
); |
$this->pager = new Pager($options); |
} |
function tearDown() { |
unset($this->pager); |
} |
function testPageRangeByPageId1() { |
$this->assertEqual(array(1, 3), $this->pager->getPageRangeByPageId(1)); |
} |
function testPageRangeByPageId2() { |
$this->assertEqual(array(1, 4), $this->pager->getPageRangeByPageId(2)); |
} |
function testPageRangeByPageId3() { |
$this->assertEqual(array(1, 5), $this->pager->getPageRangeByPageId(3)); |
} |
function testPageRangeByPageId4() { |
$this->assertEqual(array(2, 6), $this->pager->getPageRangeByPageId(4)); |
} |
function testPageRangeByPageId9() { |
$this->assertEqual(array(7, 11), $this->pager->getPageRangeByPageId(9)); |
} |
function testPageRangeByPageId10() { |
$this->assertEqual(array(8, 11), $this->pager->getPageRangeByPageId(10)); |
} |
function testPageRangeByPageId11() { |
$this->assertEqual(array(9, 11), $this->pager->getPageRangeByPageId(11)); |
} |
function testPageRangeByPageId_outOfRange() { |
$this->assertEqual(array(0, 0), $this->pager->getPageRangeByPageId(20)); |
} |
} |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_wrapper_include.php |
---|
New file |
0,0 → 1,5 |
<?php |
// $Id$ |
require_once 'Pager/Pager.php'; |
require_once 'Pager/Wrapper.php'; |
?> |
/branches/livraison_narmer/api/pear/Pager/tests/pager_include.php |
---|
New file |
0,0 → 1,4 |
<?php |
// $Id$ |
require_once 'Pager/Pager.php'; |
?> |