Index: library/Zend/Paginator.php =================================================================== --- library/Zend/Paginator.php (revision 17353) +++ library/Zend/Paginator.php (working copy) @@ -30,6 +30,11 @@ require_once 'Zend/Json.php'; /** + * @see Zend_Paginator_AdapterAggregate + */ +require_once 'Zend/Paginator/AdapterAggregate.php'; + +/** * @category Zend * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -261,40 +266,45 @@ public static function factory($data, $adapter = self::INTERNAL_ADAPTER, array $prefixPaths = null) { - if ($adapter == self::INTERNAL_ADAPTER) { - if (is_array($data)) { - $adapter = 'Array'; - } else if ($data instanceof Zend_Db_Table_Select) { - $adapter = 'DbTableSelect'; - } else if ($data instanceof Zend_Db_Select) { - $adapter = 'DbSelect'; - } else if ($data instanceof Iterator) { - $adapter = 'Iterator'; - } else if (is_integer($data)) { - $adapter = 'Null'; - } else { - $type = (is_object($data)) ? get_class($data) : gettype($data); + if($data instanceof Zend_Paginator_AdapterAggregate) { + $adapterInstance = $data->getPaginatorAdapter(); + } else { + if ($adapter == self::INTERNAL_ADAPTER) { + if (is_array($data)) { + $adapter = 'Array'; + } else if ($data instanceof Zend_Db_Table_Select) { + $adapter = 'DbTableSelect'; + } else if ($data instanceof Zend_Db_Select) { + $adapter = 'DbSelect'; + } else if ($data instanceof Iterator) { + $adapter = 'Iterator'; + } else if (is_integer($data)) { + $adapter = 'Null'; + } else { + $type = (is_object($data)) ? get_class($data) : gettype($data); - /** - * @see Zend_Paginator_Exception - */ - require_once 'Zend/Paginator/Exception.php'; + /** + * @see Zend_Paginator_Exception + */ + require_once 'Zend/Paginator/Exception.php'; - throw new Zend_Paginator_Exception('No adapter for type ' . $type); + throw new Zend_Paginator_Exception('No adapter for type ' . $type); + } } - } - $pluginLoader = self::getAdapterLoader(); + $pluginLoader = self::getAdapterLoader(); - if (null !== $prefixPaths) { - foreach ($prefixPaths as $prefix => $path) { - $pluginLoader->addPrefixPath($prefix, $path); + if (null !== $prefixPaths) { + foreach ($prefixPaths as $prefix => $path) { + $pluginLoader->addPrefixPath($prefix, $path); + } } + + $adapterClassName = $pluginLoader->load($adapter); + $adapterInstance = new $adapterClassName($data); } - $adapterClassName = $pluginLoader->load($adapter); - - return new self(new $adapterClassName($data)); + return new self($adapterInstance); } /** @@ -409,11 +419,21 @@ } /** - * Constructor. + * @param Zend_Paginator_Adapter_Interface|Zend_Paginator_AdapterAggregate */ - public function __construct(Zend_Paginator_Adapter_Interface $adapter) + public function __construct($adapter) { - $this->_adapter = $adapter; + if($adapter instanceof Zend_Paginator_Adapter_Interface) { + $this->_adapter = $adapter; + } elseif($adapter instanceof Zend_Paginator_AdapterAggregate) { + $this->_adapter = $adapter->getPaginatorAdapter(); + } else { + require_once "Zend/Paginator/Exception.php"; + throw new Zend_Paginator_Exception( + "Zend_Paginator only accepts instances of the type 'Zend_Paginator_Adapter_Interface' or ". + "'Zend_Paginator_AdapterAggregate'." + ); + } $config = self::$_config; Index: tests/Zend/PaginatorTest.php =================================================================== --- tests/Zend/PaginatorTest.php (revision 17353) +++ tests/Zend/PaginatorTest.php (working copy) @@ -894,9 +894,42 @@ $this->assertEquals(9, $this->_paginator->getItem(-2, 1)); $this->assertEquals(101, $this->_paginator->getItem(-1, -1)); } + + public function testAcceptAndHandlePaginatorAdapterAggregateDataInFactory() + { + $p = Zend_Paginator::factory(new Zend_Paginator_TestArrayAggregate()); + + $this->assertEquals(1, count($p)); + $this->assertType('Zend_Paginator_Adapter_Array', $p->getAdapter()); + $this->assertEquals(4, count($p->getAdapter())); + } + + public function testAcceptAndHandlePaginatorAdapterAggreageInConstructor() + { + $p = new Zend_Paginator(new Zend_Paginator_TestArrayAggregate()); + + $this->assertEquals(1, count($p)); + $this->assertType('Zend_Paginator_Adapter_Array', $p->getAdapter()); + $this->assertEquals(4, count($p->getAdapter())); + } + + public function testInvalidDataInConstructor_ThrowsException() + { + $this->setExpectedException("Zend_Paginator_Exception"); + + $p = new Zend_Paginator(array()); + } } +class Zend_Paginator_TestArrayAggregate implements Zend_Paginator_AdapterAggregate +{ + public function getPaginatorAdapter() + { + return new Zend_Paginator_Adapter_Array(array(1, 2, 3, 4)); + } +} + // Call Zend_PaginatorTest::main() if this source file is executed directly. if (PHPUnit_MAIN_METHOD === 'Zend_PaginatorTest::main') { Zend_PaginatorTest::main(); -} +} \ No newline at end of file