1<?php
2/**
3 * Zend Framework (http://framework.zend.com/)
4 *
5 * @link      http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license   http://framework.zend.com/license/new-bsd New BSD License
8 */
9
10namespace Zend\View;
11
12use ArrayAccess;
13use Zend\EventManager\Event;
14use Zend\Stdlib\RequestInterface as Request;
15use Zend\Stdlib\ResponseInterface as Response;
16use Zend\View\Model\ModelInterface as Model;
17use Zend\View\Renderer\RendererInterface as Renderer;
18
19class ViewEvent extends Event
20{
21    /**#@+
22     * View events triggered by eventmanager
23     */
24    const EVENT_RENDERER = 'renderer';
25    const EVENT_RENDERER_POST = 'renderer.post';
26    const EVENT_RESPONSE = 'response';
27    /**#@-*/
28
29    /**
30     * @var null|Model
31     */
32    protected $model;
33
34    /**
35     * @var Renderer
36     */
37    protected $renderer;
38
39    /**
40     * @var null|Request
41     */
42    protected $request;
43
44    /**
45     * @var null|Response
46     */
47    protected $response;
48
49    /**
50     * @var mixed
51     */
52    protected $result;
53
54    /**
55     * Set the view model
56     *
57     * @param  Model $model
58     * @return ViewEvent
59     */
60    public function setModel(Model $model)
61    {
62        $this->model = $model;
63        return $this;
64    }
65
66    /**
67     * Set the MVC request object
68     *
69     * @param  Request $request
70     * @return ViewEvent
71     */
72    public function setRequest(Request $request)
73    {
74        $this->request = $request;
75        return $this;
76    }
77
78    /**
79     * Set the MVC response object
80     *
81     * @param  Response $response
82     * @return ViewEvent
83     */
84    public function setResponse(Response $response)
85    {
86        $this->response = $response;
87        return $this;
88    }
89
90    /**
91     * Set result of rendering
92     *
93     * @param  mixed $result
94     * @return ViewEvent
95     */
96    public function setResult($result)
97    {
98        $this->result = $result;
99        return $this;
100    }
101
102    /**
103     * Retrieve the view model
104     *
105     * @return null|Model
106     */
107    public function getModel()
108    {
109        return $this->model;
110    }
111
112    /**
113     * Set value for renderer
114     *
115     * @param  Renderer $renderer
116     * @return ViewEvent
117     */
118    public function setRenderer(Renderer $renderer)
119    {
120        $this->renderer = $renderer;
121        return $this;
122    }
123
124    /**
125     * Get value for renderer
126     *
127     * @return null|Renderer
128     */
129    public function getRenderer()
130    {
131        return $this->renderer;
132    }
133
134    /**
135     * Retrieve the MVC request object
136     *
137     * @return null|Request
138     */
139    public function getRequest()
140    {
141        return $this->request;
142    }
143
144    /**
145     * Retrieve the MVC response object
146     *
147     * @return null|Response
148     */
149    public function getResponse()
150    {
151        return $this->response;
152    }
153
154    /**
155     * Retrieve the result of rendering
156     *
157     * @return mixed
158     */
159    public function getResult()
160    {
161        return $this->result;
162    }
163
164    /**
165     * Get event parameter
166     *
167     * @param  string $name
168     * @param  mixed $default
169     * @return mixed
170     */
171    public function getParam($name, $default = null)
172    {
173        switch ($name) {
174            case 'model':
175                return $this->getModel();
176            case 'renderer':
177                return $this->getRenderer();
178            case 'request':
179                return $this->getRequest();
180            case 'response':
181                return $this->getResponse();
182            case 'result':
183                return $this->getResult();
184            default:
185                return parent::getParam($name, $default);
186        }
187    }
188
189    /**
190     * Get all event parameters
191     *
192     * @return array|\ArrayAccess
193     */
194    public function getParams()
195    {
196        $params             = parent::getParams();
197        $params['model']    = $this->getModel();
198        $params['renderer'] = $this->getRenderer();
199        $params['request']  = $this->getRequest();
200        $params['response'] = $this->getResponse();
201        $params['result']   = $this->getResult();
202        return $params;
203    }
204
205    /**
206     * Set event parameters
207     *
208     * @param  array|object|ArrayAccess $params
209     * @return ViewEvent
210     */
211    public function setParams($params)
212    {
213        parent::setParams($params);
214        if (!is_array($params) && !$params instanceof ArrayAccess) {
215            return $this;
216        }
217
218        foreach (array('model', 'renderer', 'request', 'response', 'result') as $param) {
219            if (isset($params[$param])) {
220                $method = 'set' . $param;
221                $this->$method($params[$param]);
222            }
223        }
224        return $this;
225    }
226
227    /**
228     * Set an individual event parameter
229     *
230     * @param  string $name
231     * @param  mixed $value
232     * @return ViewEvent
233     */
234    public function setParam($name, $value)
235    {
236        switch ($name) {
237            case 'model':
238                $this->setModel($value);
239                break;
240            case 'renderer':
241                $this->setRenderer($value);
242                break;
243            case 'request':
244                $this->setRequest($value);
245                break;
246            case 'response':
247                $this->setResponse($value);
248                break;
249            case 'result':
250                $this->setResult($value);
251                break;
252            default:
253                parent::setParam($name, $value);
254                break;
255        }
256        return $this;
257    }
258}
259