123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- <?php
- /**
- * This file is part of the Propel package.
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @license MIT License
- */
- /**
- * Implements a pager based on a ModelCriteria
- * The code from this class heavily borrows from symfony's sfPager class
- *
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
- * @author François Zaninotto
- * @version $Revision: 1665 $
- * @package propel.runtime.query
- */
- class PropelModelPager implements IteratorAggregate, Countable
- {
- protected
- $query = null,
- $page = 1,
- $maxPerPage = 10,
- $lastPage = 1,
- $nbResults = 0,
- $objects = null,
- $parameters = array(),
- $currentMaxLink = 1,
- $parameterHolder = null,
- $maxRecordLimit = false,
- $results = null,
- $resultsCounter = 0;
- public function __construct(Criteria $query, $maxPerPage = 10)
- {
- $this->setQuery($query);
- $this->setMaxPerPage($maxPerPage);
- }
-
- public function setQuery(Criteria $query)
- {
- $this->query = $query;
- }
-
- public function getQuery()
- {
- return $this->query;
- }
- public function init()
- {
- $hasMaxRecordLimit = ($this->getMaxRecordLimit() !== false);
- $maxRecordLimit = $this->getMaxRecordLimit();
- $qForCount = clone $this->getQuery();
- $count = $qForCount
- ->offset(0)
- ->limit(0)
- ->count();
- $this->setNbResults($hasMaxRecordLimit ? min($count, $maxRecordLimit) : $count);
- $q = $this->getQuery()
- ->offset(0)
- ->limit(0);
- if (($this->getPage() == 0 || $this->getMaxPerPage() == 0)) {
- $this->setLastPage(0);
- } else {
- $this->setLastPage(ceil($this->getNbResults() / $this->getMaxPerPage()));
- $offset = ($this->getPage() - 1) * $this->getMaxPerPage();
- $q->offset($offset);
- if ($hasMaxRecordLimit) {
- $maxRecordLimit = $maxRecordLimit - $offset;
- if ($maxRecordLimit > $this->getMaxPerPage()) {
- $q->limit($this->getMaxPerPage());
- } else {
- $q->limit($maxRecordLimit);
- }
- } else {
- $q->limit($this->getMaxPerPage());
- }
- }
- }
- /**
- * Get the collection of results in the page
- *
- * @return PropelObjectCollection A collection of results
- */
- public function getResults()
- {
- if (null === $this->results) {
- $this->results = $this->getQuery()
- ->setFormatter(ModelCriteria::FORMAT_OBJECT)
- ->find();
- }
- return $this->results;
- }
- public function getCurrentMaxLink()
- {
- return $this->currentMaxLink;
- }
- public function getMaxRecordLimit()
- {
- return $this->maxRecordLimit;
- }
- public function setMaxRecordLimit($limit)
- {
- $this->maxRecordLimit = $limit;
- }
- public function getLinks($nb_links = 5)
- {
- $links = array();
- $tmp = $this->page - floor($nb_links / 2);
- $check = $this->lastPage - $nb_links + 1;
- $limit = ($check > 0) ? $check : 1;
- $begin = ($tmp > 0) ? (($tmp > $limit) ? $limit : $tmp) : 1;
- $i = (int) $begin;
- while (($i < $begin + $nb_links) && ($i <= $this->lastPage)) {
- $links[] = $i++;
- }
- $this->currentMaxLink = count($links) ? $links[count($links) - 1] : 1;
- return $links;
- }
-
- /**
- * Test whether the number of results exceeds the max number of results per page
- *
- * @return boolean true if the pager displays only a subset of the results
- */
- public function haveToPaginate()
- {
- return (($this->getMaxPerPage() != 0) && ($this->getNbResults() > $this->getMaxPerPage()));
- }
- /**
- * Get the index of the first element in the page
- * Returns 1 on the first page, $maxPerPage +1 on the second page, etc
- *
- * @return int
- */
- public function getFirstIndex()
- {
- if ($this->page == 0) {
- return 1;
- } else {
- return ($this->page - 1) * $this->maxPerPage + 1;
- }
- }
- /**
- * Get the index of the last element in the page
- * Always less than or eaqual to $maxPerPage
- *
- * @return int
- */
- public function getLastIndex()
- {
- if ($this->page == 0) {
- return $this->nbResults;
- } else {
- if (($this->page * $this->maxPerPage) >= $this->nbResults) {
- return $this->nbResults;
- } else {
- return ($this->page * $this->maxPerPage);
- }
- }
- }
- /**
- * Get the total number of results of the query
- * This can be greater than $maxPerPage
- *
- * @return int
- */
- public function getNbResults()
- {
- return $this->nbResults;
- }
- /**
- * Set the total number of results of the query
- *
- * @param int $nb
- */
- protected function setNbResults($nb)
- {
- $this->nbResults = $nb;
- }
- /**
- * Check whether the current page is the first page
- *
- * @return boolean true if the current page is the first page
- */
- public function isFirstPage()
- {
- return $this->getPage() == $this->getFirstPage();
- }
- /**
- * Get the number of the first page
- *
- * @return int Always 1
- */
- public function getFirstPage()
- {
- return 1;
- }
- /**
- * Check whether the current page is the last page
- *
- * @return boolean true if the current page is the last page
- */
- public function isLastPage()
- {
- return $this->getPage() == $this->getLastPage();
- }
- /**
- * Get the number of the last page
- *
- * @return int
- */
- public function getLastPage()
- {
- return $this->lastPage;
- }
- /**
- * Set the number of the first page
- *
- * @param int $page
- */
- protected function setLastPage($page)
- {
- $this->lastPage = $page;
- if ($this->getPage() > $page) {
- $this->setPage($page);
- }
- }
- /**
- * Get the number of the current page
- *
- * @return int
- */
- public function getPage()
- {
- return $this->page;
- }
- /**
- * Set the number of the current page
- *
- * @param int $page
- */
- public function setPage($page)
- {
- $this->page = intval($page);
- if ($this->page <= 0) {
- // set first page, which depends on a maximum set
- $this->page = $this->getMaxPerPage() ? 1 : 0;
- }
- }
-
- /**
- * Get the number of the next page
- *
- * @return int
- */
- public function getNextPage()
- {
- return min($this->getPage() + 1, $this->getLastPage());
- }
- /**
- * Get the number of the previous page
- *
- * @return int
- */
- public function getPreviousPage()
- {
- return max($this->getPage() - 1, $this->getFirstPage());
- }
- /**
- * Get the maximum number results per page
- *
- * @return int
- */
- public function getMaxPerPage()
- {
- return $this->maxPerPage;
- }
- /**
- * Set the maximum number results per page
- *
- * @param int $max
- */
- public function setMaxPerPage($max)
- {
- if ($max > 0) {
- $this->maxPerPage = $max;
- if ($this->page == 0) {
- $this->page = 1;
- }
- } else if ($max == 0) {
- $this->maxPerPage = 0;
- $this->page = 0;
- } else {
- $this->maxPerPage = 1;
- if ($this->page == 0) {
- $this->page = 1;
- }
- }
- }
-
- public function getIterator()
- {
- return $this->getResults()->getIterator();
- }
- /**
- * Returns the total number of results.
- *
- * @see Countable
- * @return int
- */
- public function count()
- {
- return $this->getNbResults();
- }
- }
|