Small view tweaks, gitignore update, and error phtml path
[zf2.biz/application_blanche.git] / modules / Application / src / Application / View / Listener.php
1 <?php
2
3 namespace Application\View;
4
5 use ArrayAccess,
6     Zend\Di\Locator,
7     Zend\EventManager\EventCollection,
8     Zend\EventManager\ListenerAggregate,
9     Zend\EventManager\StaticEventCollection,
10     Zend\Http\Response,
11     Zend\Mvc\Application,
12     Zend\Mvc\MvcEvent,
13     Zend\View\Renderer;
14
15 class Listener implements ListenerAggregate
16 {
17     protected $layout;
18     protected $listeners = array();
19     protected $staticListeners = array();
20     protected $view;
21     protected $displayExceptions = false;
22
23     public function __construct(Renderer $renderer, $layout = 'layout.phtml')
24     {
25         $this->view   = $renderer;
26         $this->layout = $layout;
27     }
28
29     public function setDisplayExceptionsFlag($flag)
30     {
31         $this->displayExceptions = (bool) $flag;
32         return $this;
33     }
34
35     public function displayExceptions()
36     {
37         return $this->displayExceptions;
38     }
39
40     public function attach(EventCollection $events)
41     {
42         $this->listeners[] = $events->attach('dispatch.error', array($this, 'renderError'));
43         $this->listeners[] = $events->attach('dispatch', array($this, 'render404'), -80);
44         $this->listeners[] = $events->attach('dispatch', array($this, 'renderLayout'), -1000);
45     }
46
47     public function detach(EventCollection $events)
48     {
49         foreach ($this->listeners as $key => $listener) {
50             $events->detach($listener);
51             unset($this->listeners[$key]);
52             unset($listener);
53         }
54     }
55
56     public function registerStaticListeners(StaticEventCollection $events, $locator)
57     {
58         $ident   = 'Application\Controller\PageController';
59         $handler = $events->attach($ident, 'dispatch', array($this, 'renderPageController'), -50);
60         $this->staticListeners[] = array($ident, $handler);
61
62         $ident   = 'Zend\Mvc\Controller\ActionController';
63         $handler = $events->attach($ident, 'dispatch', array($this, 'renderView'), -50);
64         $this->staticListeners[] = array($ident, $handler);
65     }
66
67     public function detachStaticListeners(StaticEventCollection $events)
68     {
69         foreach ($this->staticListeners as $i => $info) {
70             list($id, $handler) = $info;
71             $events->detach($id, $handler);
72             unset($this->staticListeners[$i]);
73         }
74     }
75
76     public function renderPageController(MvcEvent $e)
77     {
78         $page = $e->getResult();
79         if ($page instanceof Response) {
80             return;
81         }
82
83         $response = $e->getResponse();
84         if ($response->isNotFound()) {
85             return;
86         } 
87
88         $routeMatch = $e->getRouteMatch();
89
90         if (!$routeMatch) {
91             $page = '404';
92         } else {
93             $page = $routeMatch->getParam('action', '404');
94         }
95
96         if ($page == '404') {
97             $response->setStatusCode(404);
98         }
99
100         $script     = 'pages/' . $page . '.phtml';
101
102         // Action content
103         $content    = $this->view->render($script);
104         $e->setResult($content);
105
106         return $this->renderLayout($e);
107     }
108
109     public function renderView(MvcEvent $e)
110     {
111         $response = $e->getResponse();
112         if (!$response->isSuccess()) {
113             return;
114         }
115
116         $routeMatch = $e->getRouteMatch();
117         $controller = $routeMatch->getParam('controller', 'index');
118         $action     = $routeMatch->getParam('action', 'index');
119         $script     = $controller . '/' . $action . '.phtml';
120
121         $vars       = $e->getResult();
122         if (is_scalar($vars)) {
123             $vars = array('content' => $vars);
124         } elseif (is_object($vars) && !$vars instanceof ArrayAccess) {
125             $vars = (array) $vars;
126         }
127
128         $content    = $this->view->render($script, $vars);
129
130         $e->setResult($content);
131         return $content;
132     }
133
134     public function renderLayout(MvcEvent $e)
135     {
136         $response = $e->getResponse();
137         if (!$response) {
138             $response = new Response();
139             $e->setResponse($response);
140         }
141         if ($response->isRedirect()) {
142             return $response;
143         }
144
145         $footer   = $e->getParam('footer', false);
146         $vars     = array('footer' => $footer);
147
148         if (false !== ($contentParam = $e->getParam('content', false))) {
149             $vars['content'] = $contentParam;
150         } else {
151             $vars['content'] = $e->getResult();
152         }
153
154         $layout   = $this->view->render($this->layout, $vars);
155         $response->setContent($layout);
156         return $response;
157     }
158
159     public function render404(MvcEvent $e)
160     {
161         $vars = $e->getResult();
162         if ($vars instanceof Response) {
163             return;
164         }
165
166         $response = $e->getResponse();
167         if ($response->getStatusCode() != 404) {
168             // Only handle 404's
169             return;
170         }
171
172         $vars = array('message' => 'Page not found.');
173
174         $content = $this->view->render('pages/404.phtml', $vars);
175
176         $e->setResult($content);
177
178         return $this->renderLayout($e);
179     }
180
181     public function renderError(MvcEvent $e)
182     {
183         $error    = $e->getError();
184         $app      = $e->getTarget();
185         $response = $e->getResponse();
186         if (!$response) {
187             $response = new Response();
188             $e->setResponse($response);
189         }
190
191         switch ($error) {
192             case Application::ERROR_CONTROLLER_NOT_FOUND:
193             case Application::ERROR_CONTROLLER_INVALID:
194                 $vars = array(
195                     'message' => 'Page not found.',
196                 );
197                 $response->setStatusCode(404);
198                 break;
199
200             case Application::ERROR_EXCEPTION:
201             default:
202                 $exception = $e->getParam('exception');
203                 $vars = array(
204                     'message'            => 'An error occurred during execution; please try again later.',
205                     'exception'          => $e->getParam('exception'),
206                     'display_exceptions' => $this->displayExceptions(),
207                 );
208                 $response->setStatusCode(500);
209                 break;
210         }
211
212         $content = $this->view->render('error/index.phtml', $vars);
213
214         $e->setResult($content);
215
216         return $this->renderLayout($e);
217     }
218 }