Completed
Pull Request — develop (#241)
by ANTHONIUS
08:03
created

CreatePaginator::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 2 Features 0
Metric Value
c 2
b 2
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
/**
3
 * YAWIK
4
 *
5
 * @filesource
6
 * @license    MIT
7
 * @copyright  2013 - 2016 Cross Solution <http://cross-solution.de>
8
 */
9
10
/**  */
11
namespace Core\Controller\Plugin;
12
13
use Solr\Event\SolrEvent;
14
use Zend\EventManager\EventManager;
15
use Zend\EventManager\ResponseCollection;
16
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
17
use Zend\Mvc\Controller\PluginManager as ControllerManager;
18
use Zend\Paginator\Paginator;
19
use Zend\ServiceManager\ServiceLocatorInterface;
20
21
/**
22
 * Creates a paginator from the paginator service.
23
 *
24
 * Passing in GET (or POST) request parameters as creation options to the paginator manager.
25
 *
26
 * @author Mathias Gelhausen <[email protected]>
27
 */
28
class CreatePaginator extends AbstractPlugin
29
{
30
    const EVENT_CREATE_PAGINATOR = 'core.create_paginator';
31
    /**
32
     * @var ServiceLocatorInterface
33
     */
34
    protected $serviceManager;
35
    
36
    /**
37
     * @param ServiceLocatorInterface $serviceManager
38
     */
39
    public function __construct(ServiceLocatorInterface $serviceManager)
40
    {
41
        $this->serviceManager = $serviceManager;
42
    }
43
    
44
    /**
45
     * Creates a paginator from the paginator service.
46
     *
47
     * Uses query parameters from the request merged with $defaultParams as
48
     * creation options while retrieving the service.
49
     * Please note that a query parameter with the same name as a default parameter
50
     * overrides the default parameter.
51
     *
52
     *
53
     * @param string $paginatorName
54
     * @param array  $defaultParams
55
     * @param bool   $usePostParams if true, the POST parameters from the request are used.
56
     *
57
     * @return \Zend\Paginator\Paginator
58
     * @throws \InvalidArgumentException
59
     */
60
    public function __invoke($paginatorName, $defaultParams = array(), $usePostParams = false)
61
    {
62
        if (is_bool($defaultParams)) {
63
            $usePostParams = $defaultParams;
64
            $defaultParams = array();
65
        }
66
67
        if (!is_array($defaultParams) && !$defaultParams instanceof \Traversable) {
68
            throw new \InvalidArgumentException('$defaultParams must be an array or implement \Traversable');
69
        }
70
71
        /* @var $controller \Zend\Mvc\Controller\AbstractController
72
         * @var $paginators \Core\Paginator\PaginatorService
73
         * @var $request    \Zend\Http\Request
74
         */
75
        $controller = $this->getController();
76
        $paginators = $this->serviceManager->get('Core/PaginatorService');
77
        $request    = $controller->getRequest();
78
        $params     = $usePostParams
79
            ? $request->getPost()->toArray()
80
            : $request->getQuery()->toArray();
81
82
        // We allow \Traversable so we cannot simply merge.
83
        foreach ($defaultParams as $key => $val) {
84
            if (!isset($params[$key])) {
85
                $params[$key] = $val;
86
            }
87
        }
88
89
        /* try to create $paginator from event listener */
90
        /* @var ResponseCollection $response */
91
        /* @var EventManager $eventManager */
92
        /* @var $paginator \Zend\Paginator\Paginator */
93
        $eventManager = $this->serviceManager->get('EventManager');
94
        $response      = $eventManager->trigger(
95
            static::EVENT_CREATE_PAGINATOR,
96
            $this,
97
            [
98
                'params' => $params,
99
                'paginatorName' =>$paginatorName,
100
            ]
101
        );
102
        $paginator = $response->last(); // get the last result from listener
103
104
        if(!$paginator instanceof Paginator){
105
            // paginator is not created, so we create from service
106
            $paginator = $paginators->get($paginatorName, $params);
107
        }
108
109
        $paginator->setCurrentPageNumber(isset($params['page']) ? $params['page'] : 1)
110
                  ->setItemCountPerPage(isset($params['count']) ? $params['count'] : 10)
111
                  ->setPageRange(isset($params['range']) ? $params['range'] : 5);
112
113
        return $paginator;
114
115
    }
116
    
117
    /**
118
     * @param ControllerManager $controllerManager
119
     * @return CreatePaginator
120
     */
121
    public static function factory(ControllerManager $controllerManager)
122
    {
123
        return new static($controllerManager->getServiceLocator());
124
    }
125
}
126