# HG changeset patch # User cavaliet # Date 1319209854 -7200 # Node ID 99ad73ef73852d1305d59e9cb125b3aaa30623be # Parent fc78844c8a768d1f0ffad10663e9cd1e2fda4aea first step for tag list and add Pagerfanta for paginator diff -r fc78844c8a76 -r 99ad73ef7385 .hgsubstate --- a/.hgsubstate Thu Oct 20 18:35:34 2011 +0200 +++ b/.hgsubstate Fri Oct 21 17:10:54 2011 +0200 @@ -1,1 +1,1 @@ -7d2fb5d7c9fff6d099ab7d154e7b520bec6773e3 vendor/bundles/IRI/Bundle/WikiTagBundle +cc32af72517618a30f426fe5fba0572ad0a50035 vendor/bundles/IRI/Bundle/WikiTagBundle diff -r fc78844c8a76 -r 99ad73ef7385 app/autoload.php --- a/app/autoload.php Thu Oct 20 18:35:34 2011 +0200 +++ b/app/autoload.php Fri Oct 21 17:10:54 2011 +0200 @@ -15,6 +15,7 @@ 'Assetic' => __DIR__.'/../vendor/assetic/src', 'Metadata' => __DIR__.'/../vendor/metadata/src', 'FOS' => __DIR__.'/../vendor/bundles', + 'Pagerfanta' => __DIR__.'/../vendor/bundles', 'IRI\Bundle\WikiTagBundle' => __DIR__.'/../vendor/bundles', )); $loader->registerPrefixes(array( diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/AdapterInterface.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/AdapterInterface.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +/** + * AdapterInterface. + * + * @author Pablo Díez + * + * @api + */ +interface AdapterInterface +{ + /** + * Returns the number of results. + * + * @return integer The number of results. + * + * @api + */ + function getNbResults(); + + /** + * Returns an slice of the results. + * + * @param integer $offset The offset. + * @param integer $length The length. + * + * @return array The slice. + * + * @api + */ + function getSlice($offset, $length); +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/ArrayAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/ArrayAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +/** + * ArrayAdapter. + * + * @author Pablo Díez + * + * @api + */ +class ArrayAdapter implements AdapterInterface +{ + private $array; + + /** + * Constructor. + * + * @param array $array The array. + * + * @api + */ + public function __construct(array $array) + { + $this->array = $array; + } + + /** + * Returns the array. + * + * @return array The array. + * + * @api + */ + public function getArray() + { + return $this->array; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + return count($this->array); + } + + /** + * {@inheritdoc} + */ + public function getSlice($offset, $length) + { + return array_slice($this->array, $offset, $length); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/DoctrineCollectionAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineCollectionAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +use Doctrine\Common\Collections\Collection; + +/** + * DoctrineCollectionAdapter. + * + * @author Pablo Díez + * + * @api + */ +class DoctrineCollectionAdapter implements AdapterInterface +{ + private $collection; + + /** + * Constructor. + * + * @param Collection $collection A Doctrine collection. + * + * @api + */ + public function __construct(Collection $collection) + { + $this->collection = $collection; + } + + /** + * Returns the collection. + * + * @return Collection The collection. + * + * @api + */ + public function getCollection() + { + return $this->collection; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + return $this->collection->count(); + } + + /** + * {@inheritdoc} + */ + public function getSlice($offset, $length) + { + return $this->collection->slice($offset, $length); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/DoctrineODMMongoDBAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineODMMongoDBAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +use Doctrine\ODM\MongoDB\Query\Builder; + +/** + * DoctrineODMMongoDBAdapter. + * + * @author Pablo Díez + * + * @api + */ +class DoctrineODMMongoDBAdapter implements AdapterInterface +{ + private $queryBuilder; + + /** + * Constructor. + * + * @param Builder $queryBuilder A DoctrineMongo query builder. + * + * @api + */ + public function __construct(Builder $queryBuilder) + { + $this->queryBuilder = $queryBuilder; + } + + /** + * Returns the query builder. + * + * @return Builder The query builder. + * + * @api + */ + public function getQueryBuilder() + { + return $this->queryBuilder; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + return $this->queryBuilder->getQuery()->count(); + } + + /** + * {@inheritdoc} + */ + public function getSlice($offset, $length) + { + return iterator_to_array($this->queryBuilder->limit($length)->skip($offset)->getQuery()->execute()); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/DoctrineORM/CountWalker.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineORM/CountWalker.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter\DoctrineORM; + +use Doctrine\ORM\Query\TreeWalkerAdapter, + Doctrine\ORM\Query\AST\SelectStatement, + Doctrine\ORM\Query\AST\SelectExpression, + Doctrine\ORM\Query\AST\PathExpression, + Doctrine\ORM\Query\AST\AggregateExpression; + +class CountWalker extends TreeWalkerAdapter +{ + + /** + * Walks down a SelectStatement AST node, modifying it to retrieve a COUNT + * + * @param SelectStatement $AST + * @return void + */ + public function walkSelectStatement(SelectStatement $AST) + { + $parent = null; + $parentName = null; + + + + foreach ($this->_getQueryComponents() AS $dqlAlias => $qComp) { + + // skip mixed data in query + if (isset($qComp['resultVariable'])) { + continue; + } + + if ($qComp['parent'] === null && $qComp['nestingLevel'] == 0) { + $parent = $qComp; + $parentName = $dqlAlias; + break; + } + } + + + $pathExpression = new PathExpression( + PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $parentName, + $parent['metadata']->getSingleIdentifierFieldName() + ); + $pathExpression->type = PathExpression::TYPE_STATE_FIELD; + + $AST->selectClause->selectExpressions = array( + new SelectExpression( + new AggregateExpression('count', $pathExpression, true), null + ) + ); + + // ORDER BY is not needed, only increases query execution through unnecessary sorting. + $AST->orderByClause = null; + } + +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/DoctrineORM/LimitSubqueryWalker.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineORM/LimitSubqueryWalker.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter\DoctrineORM; + +use Doctrine\ORM\Query\TreeWalkerAdapter, + Doctrine\ORM\Query\AST\SelectStatement, + Doctrine\ORM\Query\AST\SimpleSelectExpression, + Doctrine\ORM\Query\AST\PathExpression, + Doctrine\ORM\Query\AST\AggregateExpression; + +/** + * Replaces the selectClause of the AST with a SELECT DISTINCT root.id equivalent + * + * @category DoctrineExtensions + * @package DoctrineExtensions\Paginate + * @author David Abdemoulaie + * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) + * @license http://hobodave.com/license.txt New BSD License + */ +class LimitSubqueryWalker extends TreeWalkerAdapter +{ + + /** + * Walks down a SelectStatement AST node, modifying it to retrieve DISTINCT ids + * of the root Entity + * + * @param SelectStatement $AST + * @return void + */ + public function walkSelectStatement(SelectStatement $AST) + { + $parent = null; + $parentName = null; + foreach ($this->_getQueryComponents() AS $dqlAlias => $qComp) { + + // skip mixed data in query + if (isset($qComp['resultVariable'])) { + continue; + } + + if ($qComp['parent'] === null && $qComp['nestingLevel'] == 0) { + $parent = $qComp; + $parentName = $dqlAlias; + break; + } + } + + $pathExpression = new PathExpression( + PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $parentName, + $parent['metadata']->getSingleIdentifierFieldName() + ); + $pathExpression->type = PathExpression::TYPE_STATE_FIELD; + + $AST->selectClause->selectExpressions = array( + new SimpleSelectExpression($pathExpression) + ); + + if (isset($AST->orderByClause)) { + foreach ($AST->orderByClause->orderByItems as $item) { + $pathExpression = new PathExpression( + PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, + $item->expression->identificationVariable, + $item->expression->field + ); + $pathExpression->type = PathExpression::TYPE_STATE_FIELD; + $AST->selectClause->selectExpressions[] = new SimpleSelectExpression($pathExpression); + } + } + + $AST->selectClause->isDistinct = true; + } + +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/DoctrineORM/WhereInWalker.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineORM/WhereInWalker.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,123 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter\DoctrineORM; + +use Doctrine\ORM\Query\TreeWalkerAdapter, + Doctrine\ORM\Query\AST\SelectStatement, + Doctrine\ORM\Query\AST\PathExpression, + Doctrine\ORM\Query\AST\InExpression, + Doctrine\ORM\Query\AST\InputParameter, + Doctrine\ORM\Query\AST\ConditionalPrimary, + Doctrine\ORM\Query\AST\ConditionalTerm, + Doctrine\ORM\Query\AST\ConditionalExpression, + Doctrine\ORM\Query\AST\ConditionalFactor, + Doctrine\ORM\Query\AST\WhereClause; + +/** + * Replaces the whereClause of the AST with a WHERE id IN (:foo_1, :foo_2) equivalent + * + * @category DoctrineExtensions + * @package DoctrineExtensions\Paginate + * @author David Abdemoulaie + * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/) + * @license http://hobodave.com/license.txt New BSD License + */ +class WhereInWalker extends TreeWalkerAdapter +{ + + /** + * Replaces the whereClause in the AST + * + * Generates a clause equivalent to WHERE IN (:pgid_1, :pgid_2, ...) + * + * The parameter namespace (pgid) is retrieved from the pg.ns query hint + * The total number of parameters is retrieved from the id.count query hint + * + * @param SelectStatement $AST + * @return void + */ + public function walkSelectStatement(SelectStatement $AST) + { + $parent = null; + $parentName = null; + foreach ($this->_getQueryComponents() AS $dqlAlias => $qComp) { + + // skip mixed data in query + if (isset($qComp['resultVariable'])) { + continue; + } + + if ($qComp['parent'] === null && $qComp['nestingLevel'] == 0) { + $parent = $qComp; + $parentName = $dqlAlias; + break; + } + } + + $pathExpression = new PathExpression( + PathExpression::TYPE_STATE_FIELD, $parentName, $parent['metadata']->getSingleIdentifierFieldName() + ); + $pathExpression->type = PathExpression::TYPE_STATE_FIELD; + $inExpression = new InExpression($pathExpression); + $ns = $this->_getQuery()->getHint('pg.ns'); + $count = $this->_getQuery()->getHint('id.count'); + for ($i = 1; $i <= $count; $i++) { + $inExpression->literals[] = new InputParameter(":{$ns}_$i"); + } + $conditionalPrimary = new ConditionalPrimary; + $conditionalPrimary->simpleConditionalExpression = $inExpression; + + // if no existing whereClause + if ($AST->whereClause === null) { + $AST->whereClause = new WhereClause( + new ConditionalExpression(array( + new ConditionalTerm(array( + new ConditionalFactor($conditionalPrimary) + )) + )) + ); + } else { // add to the existing using AND + // existing AND clause + if ($AST->whereClause->conditionalExpression instanceof ConditionalTerm) { + $AST->whereClause->conditionalExpression->conditionalFactors[] = $conditionalPrimary; + } + // single clause where + elseif ($AST->whereClause->conditionalExpression instanceof ConditionalPrimary) { + $AST->whereClause->conditionalExpression = new ConditionalExpression( + array( + new ConditionalTerm( + array( + $AST->whereClause->conditionalExpression, + $conditionalPrimary + ) + ) + ) + ); + } + // an OR clause + elseif ($AST->whereClause->conditionalExpression instanceof ConditionalExpression) { + $tmpPrimary = new ConditionalPrimary; + $tmpPrimary->conditionalExpression = $AST->whereClause->conditionalExpression; + $AST->whereClause->conditionalExpression = new ConditionalTerm( + array( + $tmpPrimary, + $conditionalPrimary, + ) + ); + } else { + // error check to provide a more verbose error on failure + throw \Exception("Unknown conditionalExpression in WhereInWalker"); + } + } + } + +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/DoctrineORMAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineORMAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,151 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +use Doctrine\ORM\QueryBuilder; +use Doctrine\ORM\Query; +use Doctrine\ORM\NoResultException; + +/** + * DoctrineORMAdapter. + * + * @author Pablo Díez + * @author Benjamin Eberlei + * + * @api + */ +class DoctrineORMAdapter implements AdapterInterface +{ + /** + * @var Query + */ + private $query; + + private $fetchJoinCollection; + + /** + * Constructor. + * + * @param Query|QueryBuilder $query A Doctrine ORM query or query builder. + * @param Boolean $fetchJoinCollection Whether the query joins a collection (false by default). + * + * @api + */ + public function __construct($query, $fetchJoinCollection = false) + { + if ($query instanceof QueryBuilder) { + $query = $query->getQuery(); + } + + $this->query = $query; + $this->fetchJoinCollection = (Boolean) $fetchJoinCollection; + } + + /** + * Returns the query + * + * @return Query + * + * @api + */ + public function getQuery() + { + return $this->query; + } + + /** + * Returns whether the query joins a collection. + * + * @return Boolean Whether the query joins a collection. + */ + public function getFetchJoinCollection() + { + return $this->fetchJoinCollection; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + /* @var $countQuery Query */ + $countQuery = $this->cloneQuery($this->query); + + $countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\CountWalker')); + $countQuery->setFirstResult(null)->setMaxResults(null); + + try { + $data = $countQuery->getScalarResult(); + $data = array_map('current', $data); + return array_sum($data); + } catch(NoResultException $e) { + return 0; + } + } + + /** + * {@inheritdoc} + */ + public function getSlice($offset, $length) + { + if ($this->fetchJoinCollection) { + $subQuery = $this->cloneQuery($this->query); + $subQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\LimitSubqueryWalker')) + ->setFirstResult($offset) + ->setMaxResults($length); + + $ids = array_map('current', $subQuery->getScalarResult()); + + $whereInQuery = $this->cloneQuery($this->query); + // don't do this for an empty id array + if (count($ids) > 0) { + $namespace = 'pg_'; + + $whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\WhereInWalker')); + $whereInQuery->setHint('id.count', count($ids)); + $whereInQuery->setHint('pg.ns', $namespace); + $whereInQuery->setFirstResult(null)->setMaxResults(null); + foreach ($ids as $i => $id) { + $i++; + $whereInQuery->setParameter("{$namespace}_{$i}", $id); + } + } + + return $whereInQuery->getResult($this->query->getHydrationMode()); + } + + return $this->cloneQuery($this->query) + ->setMaxResults($length) + ->setFirstResult($offset) + ->getResult($this->query->getHydrationMode()) + ; + } + + /** + * Clones a query. + * + * @param Query $query The query. + * + * @return Query The cloned query. + */ + private function cloneQuery(Query $query) + { + /* @var $cloneQuery Query */ + $cloneQuery = clone $query; + $cloneQuery->setParameters($query->getParameters()); + foreach ($query->getHints() as $name => $value) { + $cloneQuery->setHint($name, $value); + } + + return $cloneQuery; + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/MandangoAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/MandangoAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +use Mandango\Query; + +/** + * MandangoAdapter. + * + * @author Pablo Díez + * + * @api + */ +class MandangoAdapter implements AdapterInterface +{ + private $query; + + /** + * Constructor. + * + * @param Query $query The query. + * + * @api + */ + public function __construct(Query $query) + { + $this->query = $query; + } + + /** + * Returns the query. + * + * @return Query The query. + * + * @api + */ + public function getQuery() + { + return $this->query; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + return $this->query->count(); + } + + /** + * {@inheritdoc} + */ + public function getSlice($offset, $length) + { + return $this->query->limit($length)->skip($offset)->all(); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/NullAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/NullAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +/** + * NullAdapter. + * + * @author Benjamin Dulau + */ +class NullAdapter implements AdapterInterface +{ + private $nbResults; + + /** + * Constructor. + * + * @param integer $nbResults Total item count. + * + * @api + */ + public function __construct($nbResults = 0) + { + $this->nbResults = (int) $nbResults; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + return $this->nbResults; + } + + /** + * The following methods are derived from code of the Zend Framework + * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd). + * + * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * + * {@inheritdoc} + * + */ + public function getSlice($offset, $length) + { + if ($offset >= $this->getNbResults()) { + return array(); + } + + $remainItemCount = $this->getNbResults() - $offset; + $currentItemCount = $remainItemCount > $length ? $length : $remainItemCount; + + return array_fill(0, $currentItemCount, null); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Adapter/PropelAdapter.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Adapter/PropelAdapter.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Adapter; + +/** + * PropelAdapter. + * + * @author William DURAND + */ +class PropelAdapter implements AdapterInterface +{ + private $query; + + /** + * Constructor. + */ + public function __construct($query) + { + $this->query = $query; + } + + /** + * Returns the query. + */ + public function getQuery() + { + return $this->query; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + $q = clone $this->getQuery(); + + return $q->limit(0)->offset(0)->count(); + } + + /** + * {@inheritdoc} + */ + public function getSlice($offset, $length) + { + $q = clone $this->getQuery(); + + return $q->limit($length)->offset($offset)->find(); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/Exception.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/Exception.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * Exception. + * + * @author Pablo Díez + */ +interface Exception +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/InvalidArgumentException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/InvalidArgumentException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * InvalidArgumentException. + * + * @author Pablo Díez + */ +class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/LessThan1CurrentPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/LessThan1CurrentPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * LessThan1CurrentPageException. + * + * @author Pablo Díez + */ +class LessThan1CurrentPageException extends NotValidCurrentPageException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/LessThan1MaxPerPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/LessThan1MaxPerPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * LessThan1MaxPerPageException + * + * @author Pablo Díez + */ +class LessThan1MaxPerPageException extends NotValidMaxPerPageException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/LogicException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/LogicException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * LogicException. + * + * @author Pablo Díez + */ +class LogicException extends \LogicException implements Exception +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/NotIntegerCurrentPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/NotIntegerCurrentPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * NotIntegerCurrentPageException. + * + * @author Pablo Díez + */ +class NotIntegerCurrentPageException extends NotValidCurrentPageException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/NotIntegerMaxPerPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/NotIntegerMaxPerPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * NotIntegerMaxPerPageException + * + * @author Pablo Díez + */ +class NotIntegerMaxPerPageException extends NotValidMaxPerPageException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/NotValidCurrentPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/NotValidCurrentPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * NotValidCurrentPageException. + * + * @author Pablo Díez + */ +class NotValidCurrentPageException extends InvalidArgumentException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/NotValidMaxPerPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/NotValidMaxPerPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * NotValidMaxPerPageException. + * + * @author Pablo Díez + */ +class NotValidMaxPerPageException extends InvalidArgumentException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Exception/OutOfRangeCurrentPageException.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Exception/OutOfRangeCurrentPageException.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\Exception; + +/** + * OutOfRangeCurrentPageException. + * + * @author Pablo Díez + */ +class OutOfRangeCurrentPageException extends NotValidCurrentPageException +{ +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/Pagerfanta.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/Pagerfanta.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,244 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta; + +use Pagerfanta\Adapter\AdapterInterface; +use Pagerfanta\Exception\LogicException; +use Pagerfanta\Exception\NotIntegerMaxPerPageException; +use Pagerfanta\Exception\LessThan1MaxPerPageException; +use Pagerfanta\Exception\NotIntegerCurrentPageException; +use Pagerfanta\Exception\LessThan1CurrentPageException; +use Pagerfanta\Exception\OutOfRangeCurrentPageException; + +/** + * Pagerfanta. + * + * @author Pablo Díez + * + * @api + */ +class Pagerfanta implements PagerfantaInterface, \IteratorAggregate +{ + private $adapter; + private $maxPerPage; + private $currentPage; + private $currentPageResults; + private $nbResults; + private $nbPages; + + /** + * Constructor. + * + * @param AdapterInterface $adapter An adapter. + * @param integer $maxPerPage The maximum of results per page. + * + * @api + */ + public function __construct(AdapterInterface $adapter) + { + $this->adapter = $adapter; + $this->maxPerPage = 10; + $this->currentPage = 1; + } + + /** + * Returns the adapter. + * + * @return AdapterInterface The adapter. + * + * @api + */ + public function getAdapter() + { + return $this->adapter; + } + + /** + * This method implements a fluent interface. + * + * {@inheritdoc} + */ + public function setMaxPerPage($maxPerPage) + { + // tries to normalize from string to integer + if (is_string($maxPerPage) && (int) $maxPerPage == $maxPerPage) { + $maxPerPage = (int) $maxPerPage; + } + + if (!is_int($maxPerPage)) { + throw new NotIntegerMaxPerPageException(); + } + + if ($maxPerPage < 1) { + throw new LessThan1MaxPerPageException(); + } + + $this->currentPageResults = null; + $this->nbPages = null; + $this->maxPerPage = $maxPerPage; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getMaxPerPage() + { + return $this->maxPerPage; + } + + /** + * This method implements a fluent interface. + * + * {@inheritdoc} + */ + public function setCurrentPage($currentPage, $allowOutOfRangePages = false, $normalizeOutOfRangePages = false) + { + // tries to normalize from string to integer + if ((is_string($currentPage) || is_float($currentPage)) && (int) $currentPage == $currentPage) { + $currentPage = (int) $currentPage; + } + + // integer? + if (!is_int($currentPage)) { + throw new NotIntegerCurrentPageException(); + } + + // less than 1? + if ($currentPage < 1) { + $currentPage = 1; + } + + // out of range pages + if (!$allowOutOfRangePages && $currentPage > 1) { + if ($currentPage > $this->getNbPages()) { + if (!$normalizeOutOfRangePages) { + throw new OutOfRangeCurrentPageException(); + } + + $currentPage = $this->getNbPages(); + } + } + + $this->currentPageResults = null; + $this->currentPage = $currentPage; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getCurrentPage() + { + return $this->currentPage; + } + + /** + * {@inheritdoc} + */ + public function getCurrentPageResults() + { + if (null === $this->currentPageResults) { + $offset = ($this->getCurrentPage() - 1) * $this->getMaxPerPage(); + $length = $this->getMaxPerPage(); + $this->currentPageResults = $this->adapter->getSlice($offset, $length); + } + + return $this->currentPageResults; + } + + /** + * {@inheritdoc} + */ + public function getNbResults() + { + if (null === $this->nbResults) { + $this->nbResults = $this->getAdapter()->getNbResults(); + } + + return $this->nbResults; + } + + /** + * {@inheritdoc} + */ + public function getNbPages() + { + if (null === $this->nbPages) { + $this->nbPages = (int) ceil($this->getNbResults() / $this->getMaxPerPage()); + } + + return $this->nbPages; + } + + /** + * {@inheritdoc} + */ + public function haveToPaginate() + { + return $this->getNbResults() > $this->maxPerPage; + } + + /** + * {@inheritdoc} + */ + public function hasPreviousPage() + { + return $this->currentPage > 1; + } + + /** + * {@inheritdoc} + */ + public function getPreviousPage() + { + if (!$this->hasPreviousPage()) { + throw new LogicException('There is not previous page.'); + } + + return $this->currentPage - 1; + } + + /** + * {@inheritdoc} + */ + public function hasNextPage() + { + return $this->currentPage < $this->getNbPages(); + } + + /** + * {@inheritdoc} + */ + public function getNextPage() + { + if (!$this->hasNextPage()) { + throw new LogicException('There is not next page.'); + } + + return $this->currentPage + 1; + } + + /** + * Implements the \IteratorAggregate interface. + * + * Returns an \ArrayIterator instance with the current results. + * + * @api + */ + public function getIterator() + { + return new \ArrayIterator($this->getCurrentPageResults()); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/PagerfantaInterface.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/PagerfantaInterface.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,145 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta; + +/** + * PagerfantaInterface. + * + * @author Pablo Díez + * + * @api + */ +interface PagerfantaInterface +{ + /** + * Sets the max per page. + * + * @param integer $maxPerPage The max per page. + * + * @api + */ + function setMaxPerPage($maxPerPage); + + /** + * Returns the max per page. + * + * Tries to normalize from string to integer. + * + * @return integer The max per page. + * + * @throws NotIntegerMaxPerPageException If the max per page is not an integer even normalizing. + * @throws LessThan1MaxPerPageException If the max per page is less than 1. + * + * @api + */ + function getMaxPerPage(); + + /** + * Sets the current page. + * + * @param integer $currentPage The current page. + * @param Boolean $allowOutOfRangePages Whether to allow out of range pages or not (false by default). + * @param Boolean $normalizeOutOfRangePages Whether to show the last page instead (false by default). + * + * @throws NotIntegerCurrentPageException If the current page is not an integer even normalizing. + * @throws LessThan1CurrentPageException If the current page is less than 1. + * @throws OutOfRangeCurrentPageException If It is not allowed out of range pages and they are not normalized. + * + * @api + */ + function setCurrentPage($currentPage); + + /** + * Returns the current page. + * + * @return integer The current page. + * + * @api + */ + function getCurrentPage(); + + /** + * Returns the results for the current page. + * + * @return array The results. + * + * @api + */ + function getCurrentPageResults(); + + /** + * Returns the number of results. + * + * @return integer The number of results. + * + * @api + */ + function getNbResults(); + + /** + * Returns the number of pages. + * + * @return integer The number of pages. + * + * @api + */ + function getNbPages(); + + /** + * Returns whether have to paginate or not. + * + * This is true if the number of results is higher than the max per page. + * + * @return Boolean Whether have to paginate or not. + */ + function haveToPaginate(); + + /** + * Returns whether there is previous page or not. + * + * @return Boolean Whether there is previous page or not. + * + * @api + */ + function hasPreviousPage(); + + /** + * Returns the previous page. + * + * @return integer The previous page. + * + * @throws PagerfantaException If there is not previous page. + * + * @api + */ + function getPreviousPage(); + + /** + * Returns whether there is next page or not. + * + * @return Boolean Whether there is previous page or not. + * + * @api + */ + function hasNextPage(); + + /** + * Returns the next page. + * + * @return integer The next page. + * + * @throws PagerfantaException If there is not next page. + * + * @api + */ + function getNextPage(); +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/View/DefaultView.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/View/DefaultView.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,182 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\View; + +use Pagerfanta\PagerfantaInterface; + +/** + * DefaultInterface. + * + * @author Pablo Díez + * + * @api + */ +class DefaultView implements ViewInterface +{ + /** + * {@inheritdoc} + */ + public function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array()) + { + $options = array_merge(array( + 'proximity' => 2, + 'previous_message' => 'Previous', + 'next_message' => 'Next', + 'css_disabled_class' => 'disabled', + 'css_dots_class' => 'dots', + 'css_current_class' => 'current', + ), $options); + + $currentPage = $pagerfanta->getCurrentPage(); + + $startPage = $currentPage - $options['proximity']; + $endPage = $currentPage + $options['proximity']; + + if ($startPage < 1) { + $endPage = min($endPage + (1 - $startPage), $pagerfanta->getNbPages()); + $startPage = 1; + } + if ($endPage > $pagerfanta->getNbPages()) { + $startPage = max($startPage - ($endPage - $pagerfanta->getNbPages()), 1); + $endPage = $pagerfanta->getNbPages(); + } + + $pages = array(); + + // previous + if ($pagerfanta->hasPreviousPage()) { + $pages[] = array($pagerfanta->getPreviousPage(), $options['previous_message']); + } else { + $pages[] = sprintf('%s', $options['css_disabled_class'], $options['previous_message']); + } + + // first + if ($startPage > 1) { + $pages[] = array(1, 1); + if (3 == $startPage) { + $pages[] = array(2, 2); + } elseif (2 != $startPage) { + $pages[] = sprintf('...', $options['css_dots_class']); + } + } + + // pages + for ($page = $startPage; $page <= $endPage; $page++) { + if ($page == $currentPage) { + $pages[] = sprintf('%s', $options['css_current_class'], $page); + } else { + $pages[] = array($page, $page); + } + } + + // last + if ($pagerfanta->getNbPages() > $endPage) { + if ($pagerfanta->getNbPages() > ($endPage + 1)) { + if ($pagerfanta->getNbPages() > ($endPage + 2)) { + $pages[] = sprintf('...', $options['css_dots_class']); + } else { + $pages[] = array($endPage + 1, $endPage + 1); + } + } + + $pages[] = array($pagerfanta->getNbPages(), $pagerfanta->getNbPages()); + } + + // next + if ($pagerfanta->hasNextPage()) { + $pages[] = array($pagerfanta->getNextPage(), $options['next_message']); + } else { + $pages[] = sprintf('%s', $options['css_disabled_class'], $options['next_message']); + } + + // process + $pagesHtml = ''; + foreach ($pages as $page) { + if (is_string($page)) { + $pagesHtml .= $page; + } else { + $pagesHtml .= ''.$page[1].''; + } + } + + return ''; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'default'; + } +} + +/* + +CSS: + +.pagerfanta { +} + +.pagerfanta a, +.pagerfanta span { + display: inline-block; + border: 1px solid blue; + color: blue; + margin-right: .2em; + padding: .25em .35em; +} + +.pagerfanta a { + text-decoration: none; +} + +.pagerfanta a:hover { + background: #ccf; +} + +.pagerfanta .dots { + border-width: 0; +} + +.pagerfanta .current { + background: #ccf; + font-weight: bold; +} + +.pagerfanta .disabled { + border-color: #ccf; + color: #ccf; +} + +COLORS: + +.pagerfanta a, +.pagerfanta span { + border-color: blue; + color: blue; +} + +.pagerfanta a:hover { + background: #ccf; +} + +.pagerfanta .current { + background: #ccf; +} + +.pagerfanta .disabled { + border-color: #ccf; + color: #cf; +} + +*/ diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/View/OptionableView.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/View/OptionableView.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\View; + +use Pagerfanta\PagerfantaInterface; + +/** + * OptionableView. + * + * This view renders another view with a default options to reuse them in a project. + * + * @author Pablo Díez + * + * @api + */ +class OptionableView implements ViewInterface +{ + private $view; + private $defaultOptions; + + /** + * Constructor. + * + * @param ViewInterface $view A view. + * @param array $options An array of default options (optional). + * + * @api + */ + public function __construct(ViewInterface $view, array $defaultOptions = array()) + { + $this->view = $view; + $this->defaultOptions = $defaultOptions; + } + + /** + * {@inheritdoc} + */ + public function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array()) + { + return $this->view->render($pagerfanta, $routeGenerator, array_merge($this->defaultOptions, $options)); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'optionable'; + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/View/TwitterBootstrapView.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/View/TwitterBootstrapView.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,133 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\View; + +use Pagerfanta\PagerfantaInterface; + +/** + * TwitterBootstrapView. + * + * View that can be used with the pagination module + * from the Twitter Bootstrap CSS Toolkit + * http://twitter.github.com/bootstrap/ + * + * @author Pablo Díez + * @author Jan Sorgalla + * + * @api + */ +class TwitterBootstrapView implements ViewInterface +{ + /** + * {@inheritdoc} + */ + public function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array()) + { + $options = array_merge(array( + 'proximity' => 3, + 'prev_message' => '← Previous', + 'prev_disabled_href' => '', + 'next_message' => 'Next →', + 'next_disabled_href' => '', + 'dots_message' => '…', + 'dots_href' => '', + 'css_container_class' => 'pagination', + 'css_prev_class' => 'prev', + 'css_next_class' => 'next', + 'css_disabled_class' => 'disabled', + 'css_dots_class' => 'disabled', + 'css_active_class' => 'active', + ), $options); + + $currentPage = $pagerfanta->getCurrentPage(); + + $startPage = $currentPage - $options['proximity']; + $endPage = $currentPage + $options['proximity']; + + if ($startPage < 1) { + $endPage = min($endPage + (1 - $startPage), $pagerfanta->getNbPages()); + $startPage = 1; + } + if ($endPage > $pagerfanta->getNbPages()) { + $startPage = max($startPage - ($endPage - $pagerfanta->getNbPages()), 1); + $endPage = $pagerfanta->getNbPages(); + } + + $pages = array(); + + // previous + $class = $options['css_prev_class']; + $url = $options['prev_disabled_href']; + if (!$pagerfanta->hasPreviousPage()) { + $class .= ' '.$options['css_disabled_class']; + } else { + $url = $routeGenerator($pagerfanta->getPreviousPage()); + } + + $pages[] = sprintf('
  • %s
  • ', $class, $url, $options['prev_message']); + + + // first + if ($startPage > 1) { + $pages[] = sprintf('
  • %s
  • ', $routeGenerator(1), 1); + if (3 == $startPage) { + $pages[] = sprintf('
  • %s
  • ', $routeGenerator(2), 2); + } elseif (2 != $startPage) { + $pages[] = sprintf('
  • %s
  • ', $options['css_dots_class'], $options['dots_href'], $options['dots_message']); + } + } + + // pages + for ($page = $startPage; $page <= $endPage; $page++) { + $class = ''; + if ($page == $currentPage) { + $class = sprintf(' class="%s"', $options['css_active_class']); + } + + $pages[] = sprintf('%s', $class, $routeGenerator($page), $page); + } + + // last + if ($pagerfanta->getNbPages() > $endPage) { + if ($pagerfanta->getNbPages() > ($endPage + 1)) { + if ($pagerfanta->getNbPages() > ($endPage + 2)) { + $pages[] = sprintf('
  • %s
  • ', $options['css_dots_class'], $options['dots_href'], $options['dots_message']); + } else { + $pages[] = sprintf('
  • %s
  • ', $routeGenerator($endPage + 1), $endPage + 1); + } + } + + $pages[] = sprintf('
  • %s
  • ', $routeGenerator($pagerfanta->getNbPages()), $pagerfanta->getNbPages()); + } + + // next + $class = $options['css_next_class']; + $url = $options['next_disabled_href']; + if (!$pagerfanta->hasNextPage()) { + $class .= ' '.$options['css_disabled_class']; + } else { + $url = $routeGenerator($pagerfanta->getNextPage()); + } + + $pages[] = sprintf('
  • %s
  • ', $class, $url, $options['next_message']); + + return sprintf('
      %s
    ', $options['css_container_class'], implode('', $pages)); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'twitter_bootstrap'; + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/View/ViewFactory.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/View/ViewFactory.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\View; + +use Pagerfanta\PagerfantaInterface; +use Pagerfanta\Exception\InvalidArgumentException; + +/** + * ViewFactory. + * + * @author Pablo Díez + * + * @api + */ +class ViewFactory implements ViewFactoryInterface +{ + private $views; + + /** + * Constructor. + * + * @api + */ + public function __construct() + { + $this->views = array(); + } + + /** + * {@inheritdoc} + */ + public function set($name, ViewInterface $view) + { + $this->views[$name] = $view; + } + + /** + * {@inheritdoc} + */ + public function has($name) + { + return isset($this->views[$name]); + } + + /** + * {@inheritdoc} + */ + public function add(array $views) + { + foreach ($views as $name => $view) { + $this->set($name, $view); + } + } + + /** + * {@inheritdoc} + */ + public function get($name) + { + if (!$this->has($name)) { + throw new InvalidArgumentException(sprintf('The view "%s" does not exist.', $name)); + } + + return $this->views[$name]; + } + + /** + * {@inheritdoc} + */ + public function remove($name) + { + if (!$this->has($name)) { + throw new InvalidArgumentException(sprintf('The view "%s" does not exist.', $name)); + } + + unset($this->views[$name]); + } + + /** + * {@inheritdoc} + */ + public function all() + { + return $this->views; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $this->views = array(); + } +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/View/ViewFactoryInterface.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/View/ViewFactoryInterface.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\View; + +use Pagerfanta\PagerfantaInterface; + +/** + * ViewFactoryInterface. + * + * @author Pablo Díez + * + * @api + */ +interface ViewFactoryInterface +{ + /** + * Sets a view. + * + * @param string $name The view name. + * @param ViewInterface $view The view. + */ + function set($name, ViewInterface $view); + + /** + * Returns whether a view exists or not. + * + * @param string $name The name. + * + * @return Boolean Whether a view exists or not. + * + * @api + */ + function has($name); + + /** + * Adds views. + * + * @param array $views An array of views. + * + * @api + */ + function add(array $views); + + /** + * Returns a view. + * + * @param string $name The name. + * + * @return ViewInterface The view. + * + * @throws \InvalidArgumentException If the view does not exist. + * + * @api + */ + function get($name); + + /** + * Returns all the views. + * + * @return array The views. + */ + function all(); + + /** + * Removes a view. + * + * @param string $name The name. + * + * @throws \InvalidArgumentException If the view does not exist. + * + * @api + */ + function remove($name); + + /** + * Clears the views. + * + * @api + */ + function clear(); +} diff -r fc78844c8a76 -r 99ad73ef7385 vendor/bundles/Pagerfanta/View/ViewInterface.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/Pagerfanta/View/ViewInterface.php Fri Oct 21 17:10:54 2011 +0200 @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pagerfanta\View; + +use Pagerfanta\PagerfantaInterface; + +/** + * ViewInterface. + * + * @author Pablo Díez + * + * @api + */ +interface ViewInterface +{ + /** + * Renders a pagerfanta. + * + * The route generator is any callable to generate the routes receiving the page number + * as first and unique argument. + * + * @param PagerfantaInterface $pagerfanta A pagerfanta. + * @param mixed $routeGenerator A callable to generate the routes. + * @param array $options An array of options (optional). + * + * @api + */ + function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array()); + + /** + * Returns the canonical name. + * + * @return string The canonical name. + * + * @api + */ + function getName(); + +}