<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Paginator; use Traversable; use Zend\Paginator\Adapter\AdapterInterface; use Zend\Stdlib\ArrayUtils; abstract class Factory { /** * Adapter plugin manager * @var AdapterPluginManager */ protected static $adapters; /** * Create adapter from items if necessary, and return paginator * @param Traversable/array $items * @return Paginator */ protected static function createAdapterFromItems($items) { if ($items instanceof Traversable) { $items = ArrayUtils::iteratorToArray($items); } if (!is_array($items)) { throw new Exception\InvalidArgumentException( 'The factory needs an associative array ' . 'or a Traversable object as an argument when ' . "it's used with one parameter" ); } if (!isset($items['adapter']) && !isset($items['items'])) { throw new Exception\InvalidArgumentException( 'The factory needs an associative array ' . 'or a Traversable object with keys ' . '"adapter" and "items"' ); } $adapter = $items['adapter']; $items = $items['items']; $paginator = static::getAdapterFromManager($items, $adapter); return $paginator; } /** * Get adapter from manager if necessary, and return paginator * @param mixed $items * @param mixed $adapter * @return Paginator */ protected static function getAdapterFromManager($items, $adapter) { if ($adapter instanceof AdapterInterface || $adapter instanceof AdapterAggregateInterface) { return new Paginator($adapter); } $adapter = static::getAdapterPluginManager()->get($adapter, $items); return new Paginator($adapter); } /** * Create paginator with items and adapter * @param mixed $items * @param mixed $adapter * @return Paginator */ public static function factory($items, $adapter = null) { if (null === $adapter) { $paginator = static::createAdapterFromItems($items); return $paginator; } $paginator = static::getAdapterFromManager($items, $adapter); return $paginator; } /** * Change the adapter plugin manager * * @param AdapterPluginManager $adapters * @return void */ public static function setAdapterPluginManager(AdapterPluginManager $adapters) { static::$adapters = $adapters; } /** * Get the adapter plugin manager * * @return AdapterPluginManager */ public static function getAdapterPluginManager() { if (static::$adapters === null) { static::$adapters = new AdapterPluginManager(); } return static::$adapters; } }