Pager
[ class tree: Pager ] [ index: Pager ] [ all elements ]

Source for file Common.php

Documentation is available at Common.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
  3.  
  4. /**
  5.  * Contains the Pager_Common class
  6.  *
  7.  * PHP versions 4 and 5
  8.  *
  9.  * LICENSE: Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
  20.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  21.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
  23.  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  26.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * @category   HTML
  31.  * @package    Pager
  32.  * @author     Lorenzo Alberton <l dot alberton at quipo dot it>
  33.  * @author     Richard Heyes <richard@phpguru.org>
  34.  * @copyright  2003-2006 Lorenzo Alberton, Richard Heyes
  35.  * @license    http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
  36.  * @version    CVS: $Id: Common.php,v 1.60 2007/07/29 08:10:34 quipo Exp $
  37.  * @link       http://pear.php.net/package/Pager
  38.  */
  39.  
  40. /**
  41.  * Two constants used to guess the path- and file-name of the page
  42.  * when the user doesn't set any other value
  43.  */
  44. if (substr($_SERVER['PHP_SELF']-1== '/'{
  45.     $http !empty($_SERVER['HTTPS']'https://' 'http://';
  46.     define('CURRENT_FILENAME''');
  47.     define('CURRENT_PATHNAME'$http.$_SERVER['HTTP_HOST'].str_replace('\\''/'$_SERVER['PHP_SELF']));
  48. else {
  49.     define('CURRENT_FILENAME'preg_replace('/(.*)\?.*/''\\1'basename($_SERVER['PHP_SELF'])));
  50.     define('CURRENT_PATHNAME'str_replace('\\''/'dirname($_SERVER['PHP_SELF'])));
  51. }
  52. /**
  53.  * Error codes
  54.  */
  55. define('PAGER_OK',                         0);
  56. define('ERROR_PAGER',                     -1);
  57. define('ERROR_PAGER_INVALID',             -2);
  58. define('ERROR_PAGER_INVALID_PLACEHOLDER'-3);
  59. define('ERROR_PAGER_INVALID_USAGE',       -4);
  60. define('ERROR_PAGER_NOT_IMPLEMENTED',     -5);
  61.  
  62. /**
  63.  * Pager_Common - Common base class for [Sliding|Jumping] Window Pager
  64.  * Extend this class to write a custom paging class
  65.  *
  66.  * @category   HTML
  67.  * @package    Pager
  68.  * @author     Lorenzo Alberton <l dot alberton at quipo dot it>
  69.  * @author     Richard Heyes <richard@phpguru.org>
  70.  * @copyright  2003-2005 Lorenzo Alberton, Richard Heyes
  71.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  72.  * @link       http://pear.php.net/package/Pager
  73.  */
  74. {
  75.     // {{{ class vars
  76.  
  77.     /**
  78.      * @var integer number of items
  79.      * @access private
  80.      */
  81.     var $_totalItems;
  82.  
  83.     /**
  84.      * @var integer number of items per page
  85.      * @access private
  86.      */
  87.     var $_perPage     = 10;
  88.  
  89.     /**
  90.      * @var integer number of page links for each window
  91.      * @access private
  92.      */
  93.     var $_delta       = 10;
  94.  
  95.     /**
  96.      * @var integer current page number
  97.      * @access private
  98.      */
  99.     var $_currentPage = 1;
  100.  
  101.     /**
  102.      * @var integer total pages number
  103.      * @access private
  104.      */
  105.     var $_totalPages  = 1;
  106.  
  107.     /**
  108.      * @var string CSS class for links
  109.      * @access private
  110.      */
  111.     var $_linkClass   '';
  112.  
  113.     /**
  114.      * @var string wrapper for CSS class name
  115.      * @access private
  116.      */
  117.     var $_classString '';
  118.  
  119.     /**
  120.      * @var string path name
  121.      * @access private
  122.      */
  123.     var $_path        = CURRENT_PATHNAME;
  124.  
  125.     /**
  126.      * @var string file name
  127.      * @access private
  128.      */
  129.     var $_fileName    = CURRENT_FILENAME;
  130.     
  131.     /**
  132.      * @var boolean If false, don't override the fileName option. Use at your own risk.
  133.      * @access private
  134.      */
  135.     var $_fixFileName = true;
  136.  
  137.     /**
  138.      * @var boolean you have to use FALSE with mod_rewrite
  139.      * @access private
  140.      */
  141.     var $_append      = true;
  142.  
  143.     /**
  144.      * @var string specifies which HTTP method to use
  145.      * @access private
  146.      */
  147.     var $_httpMethod  'GET';
  148.     
  149.     /**
  150.      * @var string specifies which HTML form to use
  151.      * @access private
  152.      */
  153.     var $_formID  '';
  154.  
  155.     /**
  156.      * @var boolean whether or not to import submitted data
  157.      * @access private
  158.      */
  159.     var $_importQuery = true;
  160.  
  161.     /**
  162.      * @var string name of the querystring var for pageID
  163.      * @access private
  164.      */
  165.     var $_urlVar      'pageID';
  166.  
  167.     /**
  168.      * @var array data to pass through the link
  169.      * @access private
  170.      */
  171.     var $_linkData    = array();
  172.  
  173.     /**
  174.      * @var array additional URL vars
  175.      * @access private
  176.      */
  177.     var $_extraVars   = array();
  178.     
  179.     /**
  180.      * @var array URL vars to ignore
  181.      * @access private
  182.      */
  183.     var $_excludeVars = array();
  184.  
  185.     /**
  186.      * @var boolean TRUE => expanded mode (for Pager_Sliding)
  187.      * @access private
  188.      */
  189.     var $_expanded    = true;
  190.     
  191.     /**
  192.      * @var boolean TRUE => show accesskey attribute on <a> tags
  193.      * @access private
  194.      */
  195.     var $_accesskey   = false;
  196.  
  197.     /**
  198.      * @var string extra attributes for the <a> tag
  199.      * @access private
  200.      */
  201.     var $_attributes  '';
  202.     
  203.     /**
  204.      * @var string onclick
  205.      * @access private
  206.      */
  207.     var $_onclick '';
  208.  
  209.     /**
  210.      * @var string alt text for "first page" (use "%d" placeholder for page number)
  211.      * @access private
  212.      */
  213.     var $_altFirst     'first page';
  214.  
  215.     /**
  216.      * @var string alt text for "previous page"
  217.      * @access private
  218.      */
  219.     var $_altPrev     'previous page';
  220.  
  221.     /**
  222.      * @var string alt text for "next page"
  223.      * @access private
  224.      */
  225.     var $_altNext     'next page';
  226.  
  227.     /**
  228.      * @var string alt text for "last page" (use "%d" placeholder for page number)
  229.      * @access private
  230.      */
  231.     var $_altLast     'last page';
  232.  
  233.     /**
  234.      * @var string alt text for "page"
  235.      * @access private
  236.      */
  237.     var $_altPage     'page';
  238.  
  239.     /**
  240.      * @var string image/text to use as "prev" link
  241.      * @access private
  242.      */
  243.     var $_prevImg     '&lt;&lt; Back';
  244.  
  245.     /**
  246.      * @var string image/text to use as "next" link
  247.      * @access private
  248.      */
  249.     var $_nextImg     'Next &gt;&gt;';
  250.  
  251.     /**
  252.      * @var string link separator
  253.      * @access private
  254.      */
  255.     var $_separator   '';
  256.  
  257.     /**
  258.      * @var integer number of spaces before separator
  259.      * @access private
  260.      */
  261.     var $_spacesBeforeSeparator = 0;
  262.  
  263.     /**
  264.      * @var integer number of spaces after separator
  265.      * @access private
  266.      */
  267.     var $_spacesAfterSeparator  = 1;
  268.  
  269.     /**
  270.      * @var string CSS class name for current page link
  271.      * @access private
  272.      */
  273.     var $_curPageLinkClassName  '';
  274.  
  275.     /**
  276.      * @var string Text before current page link
  277.      * @access private
  278.      */
  279.     var $_curPageSpanPre        '';
  280.  
  281.     /**
  282.      * @var string Text after current page link
  283.      * @access private
  284.      */
  285.     var $_curPageSpanPost       '';
  286.  
  287.     /**
  288.      * @var string Text before first page link
  289.      * @access private
  290.      */
  291.     var $_firstPagePre  '[';
  292.  
  293.     /**
  294.      * @var string Text to be used for first page link
  295.      * @access private
  296.      */
  297.     var $_firstPageText '';
  298.  
  299.     /**
  300.      * @var string Text after first page link
  301.      * @access private
  302.      */
  303.     var $_firstPagePost ']';
  304.  
  305.     /**
  306.      * @var string Text before last page link
  307.      * @access private
  308.      */
  309.     var $_lastPagePre   '[';
  310.  
  311.     /**
  312.      * @var string Text to be used for last page link
  313.      * @access private
  314.      */
  315.     var $_lastPageText  '';
  316.  
  317.     /**
  318.      * @var string Text after last page link
  319.      * @access private
  320.      */
  321.     var $_lastPagePost  ']';
  322.  
  323.     /**
  324.      * @var string Will contain the HTML code for the spaces
  325.      * @access private
  326.      */
  327.     var $_spacesBefore  '';
  328.  
  329.     /**
  330.      * @var string Will contain the HTML code for the spaces
  331.      * @access private
  332.      */
  333.     var $_spacesAfter   '';
  334.  
  335.     /**
  336.      * @var string $_firstLinkTitle 
  337.      * @access private
  338.      */
  339.     var $_firstLinkTitle 'first page';
  340.  
  341.     /**
  342.      * @var string $_nextLinkTitle 
  343.      * @access private
  344.      */
  345.     var $_nextLinkTitle 'next page';
  346.  
  347.     /**
  348.      * @var string $_prevLinkTitle 
  349.      * @access private
  350.      */
  351.     var $_prevLinkTitle 'previous page';
  352.  
  353.     /**
  354.      * @var string $_lastLinkTitle 
  355.      * @access private
  356.      */
  357.     var $_lastLinkTitle 'last page';
  358.  
  359.     /**
  360.      * @var string Text to be used for the 'show all' option in the select box
  361.      * @access private
  362.      */
  363.     var $_showAllText   '';
  364.  
  365.     /**
  366.      * @var array data to be paged
  367.      * @access private
  368.      */
  369.     var $_itemData      = null;
  370.  
  371.     /**
  372.      * @var boolean If TRUE and there's only one page, links aren't shown
  373.      * @access private
  374.      */
  375.     var $_clearIfVoid   = true;
  376.  
  377.     /**
  378.      * @var boolean Use session for storing the number of items per page
  379.      * @access private
  380.      */
  381.     var $_useSessions   = false;
  382.  
  383.     /**
  384.      * @var boolean Close the session when finished reading/writing data
  385.      * @access private
  386.      */
  387.     var $_closeSession  = false;
  388.  
  389.     /**
  390.      * @var string name of the session var for number of items per page
  391.      * @access private
  392.      */
  393.     var $_sessionVar    'setPerPage';
  394.  
  395.     /**
  396.      * Pear error mode (when raiseError is called)
  397.      * (see PEAR doc)
  398.      *
  399.      * @var int $_pearErrorMode 
  400.      * @access private
  401.      */
  402.     var $_pearErrorMode = null;
  403.  
  404.     // }}}
  405.     // {{{ public vars
  406.  
  407.     /**
  408.      * @var string Complete set of links
  409.      * @access public
  410.      */
  411.     var $links = '';
  412.  
  413.     /**
  414.      * @var string Complete set of link tags
  415.      * @access public
  416.      */
  417.     var $linkTags = '';
  418.  
  419.     /**
  420.      * @var array Array with a key => value pair representing
  421.      *             page# => bool value (true if key==currentPageNumber).
  422.      *             can be used for extreme customization.
  423.      * @access public
  424.      */
  425.     var $range = array();
  426.     
  427.     /**
  428.      * @var array list of available options (safety check)
  429.      * @access private
  430.      */
  431.     var $_allowed_options = array(
  432.         'totalItems',
  433.         'perPage',
  434.         'delta',
  435.         'linkClass',
  436.         'path',
  437.         'fileName',
  438.         'fixFileName',
  439.         'append',
  440.         'httpMethod',
  441.         'formID',
  442.         'importQuery',
  443.         'urlVar',
  444.         'altFirst',
  445.         'altPrev',
  446.         'altNext',
  447.         'altLast',
  448.         'altPage',
  449.         'prevImg',
  450.         'nextImg',
  451.         'expanded',
  452.         'accesskey',
  453.         'attributes',
  454.         'onclick',
  455.         'separator',
  456.         'spacesBeforeSeparator',
  457.         'spacesAfterSeparator',
  458.         'curPageLinkClassName',
  459.         'curPageSpanPre',
  460.         'curPageSpanPost',
  461.         'firstPagePre',
  462.         'firstPageText',
  463.         'firstPagePost',
  464.         'lastPagePre',
  465.         'lastPageText',
  466.         'lastPagePost',
  467.         'firstLinkTitle',
  468.         'nextLinkTitle',
  469.         'prevLinkTitle',
  470.         'lastLinkTitle',
  471.         'showAllText',
  472.         'itemData',
  473.         'clearIfVoid',
  474.         'useSessions',
  475.         'closeSession',
  476.         'sessionVar',
  477.         'pearErrorMode',
  478.         'extraVars',
  479.         'excludeVars',
  480.         'currentPage',
  481.     );
  482.  
  483.     // }}}
  484.     // {{{ build()
  485.  
  486.     /**
  487.      * Generate or refresh the links and paged data after a call to setOptions()
  488.      *
  489.      * @access public
  490.      */
  491.     function build()
  492.     {
  493.         //reset
  494.         $this->_pageData = array();
  495.         $this->links = '';
  496.  
  497.         $this->_generatePageData();
  498.         $this->_setFirstLastText();
  499.  
  500.         if ($this->_totalPages (2 * $this->_delta + 1)) {
  501.             $this->links .= $this->_printFirstPage();
  502.         }
  503.  
  504.         $this->links .= $this->_getBackLink();
  505.         $this->links .= $this->_getPageLinks();
  506.         $this->links .= $this->_getNextLink();
  507.  
  508.         $this->linkTags .= $this->_getFirstLinkTag();
  509.         $this->linkTags .= $this->_getPrevLinkTag();
  510.         $this->linkTags .= $this->_getNextLinkTag();
  511.         $this->linkTags .= $this->_getLastLinkTag();
  512.  
  513.         if ($this->_totalPages (2 * $this->_delta + 1)) {
  514.             $this->links .= $this->_printLastPage();
  515.         }
  516.     }
  517.  
  518.     // }}}
  519.     // {{{ getPageData()
  520.  
  521.     /**
  522.      * Returns an array of current pages data
  523.      *
  524.      * @param $pageID Desired page ID (optional)
  525.      * @return array Page data
  526.      * @access public
  527.      */
  528.     function getPageData($pageID = null)
  529.     {
  530.         $pageID = empty($pageID$this->_currentPage $pageID;
  531.  
  532.         if (!isset($this->_pageData)) {
  533.             $this->_generatePageData();
  534.         }
  535.         if (!empty($this->_pageData[$pageID])) {
  536.             return $this->_pageData[$pageID];
  537.         }
  538.         return array();
  539.     }
  540.  
  541.     // }}}
  542.     // {{{ getPageIdByOffset()
  543.  
  544.     /**
  545.      * Returns pageID for given offset
  546.      *
  547.      * @param $index Offset to get pageID for
  548.      * @return int PageID for given offset
  549.      */
  550.     function getPageIdByOffset($index)
  551.     {
  552.         $msg '<b>PEAR::Pager Error:</b>'
  553.               .' function "getPageIdByOffset()" not implemented.';
  554.         return $this->raiseError($msgERROR_PAGER_NOT_IMPLEMENTED);
  555.     }
  556.  
  557.     // }}}
  558.     // {{{ getOffsetByPageId()
  559.  
  560.     /**
  561.      * Returns offsets for given pageID. Eg, if you
  562.      * pass it pageID one and your perPage limit is 10
  563.      * it will return (1, 10). PageID of 2 would
  564.      * give you (11, 20).
  565.      *
  566.      * @param integer PageID to get offsets for
  567.      * @return array  First and last offsets
  568.      * @access public
  569.      */
  570.     function getOffsetByPageId($pageid = null)
  571.     {
  572.         $pageid = isset($pageid$pageid $this->_currentPage;
  573.         if (!isset($this->_pageData)) {
  574.             $this->_generatePageData();
  575.         }
  576.  
  577.         if (isset($this->_pageData[$pageid]|| is_null($this->_itemData)) {
  578.             return array(
  579.                         max(($this->_perPage ($pageid - 1)) + 11),
  580.                         min($this->_totalItems$this->_perPage $pageid)
  581.                    );
  582.         else {
  583.             return array(00);
  584.         }
  585.     }
  586.  
  587.     // }}}
  588.     // {{{ getPageRangeByPageId()
  589.  
  590.     /**
  591.      * @param integer PageID to get offsets for
  592.      * @return array  First and last offsets
  593.      */
  594.     function getPageRangeByPageId($pageID)
  595.     {
  596.         $msg '<b>PEAR::Pager Error:</b>'
  597.               .' function "getPageRangeByPageId()" not implemented.';
  598.         return $this->raiseError($msgERROR_PAGER_NOT_IMPLEMENTED);
  599.     }
  600.  
  601.     // }}}
  602.     // {{{ getLinks()
  603.  
  604.     /**
  605.      * Returns back/next/first/last and page links,
  606.      * both as ordered and associative array.
  607.      *
  608.      * NB: in original PEAR::Pager this method accepted two parameters,
  609.      * $back_html and $next_html. Now the only parameter accepted is
  610.      * an integer ($pageID), since the html text for prev/next links can
  611.      * be set in the factory. If a second parameter is provided, then
  612.      * the method act as it previously did. This hack was done to mantain
  613.      * backward compatibility only.
  614.      *
  615.      * @param integer $pageID Optional pageID. If specified, links
  616.      *                 for that page are provided instead of current one.  [ADDED IN NEW PAGER VERSION]
  617.      * @param  string $next_html HTML to put inside the next link [deprecated: use the factory instead]
  618.      * @return array back/next/first/last and page links
  619.      */
  620.     function getLinks($pageID=null$next_html='')
  621.     {
  622.         $msg '<b>PEAR::Pager Error:</b>'
  623.               .' function "getLinks()" not implemented.';
  624.         return $this->raiseError($msgERROR_PAGER_NOT_IMPLEMENTED);
  625.     }
  626.  
  627.     // }}}
  628.     // {{{ getCurrentPageID()
  629.  
  630.     /**
  631.      * Returns ID of current page
  632.      *
  633.      * @return integer ID of current page
  634.      */
  635.     function getCurrentPageID()
  636.     {
  637.         return $this->_currentPage;
  638.     }
  639.  
  640.     // }}}
  641.     // {{{ getNextPageID()
  642.  
  643.     /**
  644.      * Returns next page ID. If current page is last page
  645.      * this function returns FALSE
  646.      *
  647.      * @return mixed Next page ID
  648.      */
  649.     function getNextPageID()
  650.     {
  651.         return ($this->getCurrentPageID(== $this->numPages(? false : $this->getCurrentPageID(+ 1);
  652.     }
  653.  
  654.     // }}}
  655.     // {{{ getPreviousPageID()
  656.  
  657.     /**
  658.      * Returns previous page ID. If current page is first page
  659.      * this function returns FALSE
  660.      *
  661.      * @return mixed Previous pages' ID
  662.      */
  663.     function getPreviousPageID()
  664.     {
  665.         return $this->isFirstPage(? false : $this->getCurrentPageID(- 1;
  666.     }
  667.  
  668.     // }}}
  669.     // {{{ numItems()
  670.  
  671.     /**
  672.      * Returns number of items
  673.      *
  674.      * @return int Number of items
  675.      */
  676.     function numItems()
  677.     {
  678.         return $this->_totalItems;
  679.     }
  680.  
  681.     // }}}
  682.     // {{{ numPages()
  683.  
  684.     /**
  685.      * Returns number of pages
  686.      *
  687.      * @return int Number of pages
  688.      */
  689.     function numPages()
  690.     {
  691.         return (int)$this->_totalPages;
  692.     }
  693.  
  694.     // }}}
  695.     // {{{ isFirstPage()
  696.  
  697.     /**
  698.      * Returns whether current page is first page
  699.      *
  700.      * @return bool First page or not
  701.      */
  702.     function isFirstPage()
  703.     {
  704.         return ($this->_currentPage < 2);
  705.     }
  706.  
  707.     // }}}
  708.     // {{{ isLastPage()
  709.  
  710.     /**
  711.      * Returns whether current page is last page
  712.      *
  713.      * @return bool Last page or not
  714.      */
  715.     function isLastPage()
  716.     {
  717.         return ($this->_currentPage == $this->_totalPages);
  718.     }
  719.  
  720.     // }}}
  721.     // {{{ isLastPageComplete()
  722.  
  723.     /**
  724.      * Returns whether last page is complete
  725.      *
  726.      * @return bool Last age complete or not
  727.      */
  728.     function isLastPageComplete()
  729.     {
  730.         return !($this->_totalItems $this->_perPage);
  731.     }
  732.  
  733.     // }}}
  734.     // {{{ _generatePageData()
  735.  
  736.     /**
  737.      * Calculates all page data
  738.      * @access private
  739.      */
  740.     function _generatePageData()
  741.     {
  742.         // Been supplied an array of data?
  743.