diff --git a/lib/Doctrine/Pager/Range.php b/lib/Doctrine/Pager/Range.php new file mode 100644 index 000000000..8fdbf51aa --- /dev/null +++ b/lib/Doctrine/Pager/Range.php @@ -0,0 +1,143 @@ +. + */ + +/** + * Doctrine_Pager_Range + * + * @author Guilherme Blanco + * @package Doctrine + * @subpackage Pager + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @version $Revision$ + * @link www.phpdoctrine.com + * @since 1.0 + */ +abstract class Doctrine_Pager_Range +{ + /** + * @var array $options Custom Doctrine_Pager_Range implementation options + */ + protected $options; + + /** + * @var Doctrine_Pager $pager Doctrine_Pager object related to the pager range + */ + private $pager; + + + /** + * __construct + * + * @param array $options Custom subclass implementation options. + * Default is a blank array + * @param Doctrine_Pager $pager Optional Doctrine_Pager object to be associated + * @return void + */ + final public function __construct($options = array(), $pager = null) + { + $this->setOptions($options); + + if ($pager !== null) { + $this->setPager($pager); + } + } + + + /** + * getPager + * + * Returns the Doctrine_Pager object related to the pager range + * + * @return Doctrine_Pager Doctrine_Pager object related to the pager range + */ + public function getPager() + { + return $this->pager; + } + + + /** + * setPager + * + * Defines the Doctrine_Pager object related to the pager range and + * automatically (re-)initialize Doctrine_Pager_Range + * + * @param $pager Doctrine_Pager object related to the pager range + * @return void + */ + public function setPager($pager) + { + $this->pager = $pager; + + // Lazy-load initialization. It only should be called when all + // needed information data is ready (this can only happens when we have + // options stored and a Doctrine_Pager assocated) + $this->initialize(); + } + + + /** + * getOptions + * + * Returns the custom Doctrine_Pager_Range implementation options + * + * @return array Custom Doctrine_Pager_Range implementation options + */ + public function getOptions() + { + return $this->options; + } + + + /** + * setOptions + * + * Defines the subclass implementation options + * + * @param $options Custom Doctrine_Pager_Range implementation options + * @return void + */ + protected function setOptions($options) + { + $this->options = $options; + } + + + /** + * initialize + * + * Initialize Doctrine_Page_Range subclass which does custom class definitions + * + * @return void + */ + abstract protected function initialize(); + + + /** + * rangeAroundPage + * + * Calculate and returns an array representing the range around the current page + * + * @return array + */ + abstract public function rangeAroundPage(); +} diff --git a/lib/Doctrine/Pager/Range/Jumping.php b/lib/Doctrine/Pager/Range/Jumping.php new file mode 100644 index 000000000..e44b9bb4f --- /dev/null +++ b/lib/Doctrine/Pager/Range/Jumping.php @@ -0,0 +1,113 @@ +. + */ + +Doctrine::autoload('Doctrine_Pager_Range'); + +/** + * Doctrine_Pager_Range_Jumping + * + * @author Guilherme Blanco + * @package Doctrine + * @subpackage Pager + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @version $Revision$ + * @link www.phpdoctrine.com + * @since 1.0 + */ +class Doctrine_Pager_Range_Jumping extends Doctrine_Pager_Range +{ + /** + * @var int $chunkLength Chunk length to be returned + */ + private $chunkLength; + + + /** + * initialize + * + * Initialize Doctrine_Pager_Range_Jumping and does custom assignments + * + * @return void + */ + protected function initialize() + { + if (isset($this->options['chunk'])) { + $this->setChunkLength($this->options['chunk']); + } else { + throw new Doctrine_Pager_Exception('Missing parameter \'chunk\' that must be define in options.'); + } + } + + + /** + * getChunkLength + * + * Returns the size of the chunk defined + * + * @return int Chunk length + */ + public function getChunkLength() + { + return $this->chunkLength; + } + + + /** + * setChunkLength + * + * Defines the size of the chunk + * + * @param $chunkLength Chunk length + * @return void + */ + protected function setChunkLength($chunkLength) + { + $this->chunkLength = $chunkLength; + } + + + /** + * rangeAroundPage + * + * Calculate and returns an array representing the range around the current page + * + * @return array + */ + public function rangeAroundPage() + { + $pager = $this->getPager(); + $page = $pager->getPage(); + + // Define initial assignments for StartPage and EndPage + $startPage = $page - ($page - 1) % $this->getChunkLength(); + $endPage = ($startPage + $this->getChunkLength()) - 1; + + // Check for EndPage out-range + if ( $endPage > $pager->getLastPage() ) { + $endPage = $pager->getLastPage(); + } + + // No need to check for out-range in start, it will never happens + + return range($startPage, $endPage); + } +} diff --git a/lib/Doctrine/Pager/Range/Sliding.php b/lib/Doctrine/Pager/Range/Sliding.php new file mode 100644 index 000000000..33f8f9646 --- /dev/null +++ b/lib/Doctrine/Pager/Range/Sliding.php @@ -0,0 +1,119 @@ +. + */ + +Doctrine::autoload('Doctrine_Pager_Range'); + +/** + * Doctrine_Pager_Range_Sliding + * + * @author Guilherme Blanco + * @package Doctrine + * @subpackage Pager + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @version $Revision$ + * @link www.phpdoctrine.com + * @since 1.0 + */ +class Doctrine_Pager_Range_Sliding extends Doctrine_Pager_Range +{ + /** + * @var int $chunkLength Chunk length to be returned + */ + private $chunkLength; + + + /** + * initialize + * + * Initialize Doctrine_Pager_Range_Sliding and does custom assignments + * + * @return void + */ + protected function initialize() + { + if (isset($this->options['chunk'])) { + $this->setChunkLength($this->options['chunk']); + } else { + throw new Doctrine_Pager_Exception('Missing parameter \'chunk\' that must be define in options.'); + } + } + + + /** + * getChunkLength + * + * Returns the size of the chunk defined + * + * @return int Chunk length + */ + public function getChunkLength() + { + return $this->chunkLength; + } + + + /** + * setChunkLength + * + * Defines the size of the chunk + * + * @param $chunkLength Chunk length + * @return void + */ + protected function setChunkLength($chunkLength) + { + $this->chunkLength = $chunkLength; + } + + + /** + * rangeAroundPage + * + * Calculate and returns an array representing the range around the current page + * + * @return array + */ + public function rangeAroundPage() + { + $pager = $this->getPager(); + $page = $pager->getPage(); + + // Define initial assignments for StartPage and EndPage + $startPage = $page - floor($this->getChunkLength() - 1) / 2; + $endPage = ($startPage + $this->getChunkLength()) - 1; + + // Check for EndPage out-range + if ( $endPage > $pager->getLastPage() ) { + $offset = $endPage - $pager->getLastPage(); + + $endPage = $pager->getLastPage(); + $startPage = $startPage - $offset; + } + + // Check for StartPage out-range + if ( $startPage < $pager->getFirstPage() ) { + $startPage = $pager->getFirstPage(); + } + + return range($startPage, $endPage); + } +}