@@ -18,33 +18,67 @@ namespace Admin\Listener;
18
18
19
19
use Zend\EventManager\AbstractListenerAggregate;
20
20
use Zend\EventManager\EventManagerInterface;
21
+ use Zend\Filter\FilterChain;
22
+ use Zend\Filter\FilterInterface;
23
+ use Zend\Filter\StringToLower;
24
+ use Zend\Filter\Word\CamelCaseToDash;
21
25
use Zend\Mvc\MvcEvent;
26
+ use Zend\View\Resolver\TemplateMapResolver;
22
27
23
28
class LayoutListener extends AbstractListenerAggregate
24
29
{
30
+ /** @var TemplateMapResolver */
31
+ private $templateMapResolver;
32
+
33
+ /** @var FilterInterface */
34
+ private $filter;
35
+
36
+ public function __construct(TemplateMapResolver $templateMapResolver)
37
+ {
38
+ $this->templateMapResolver = $templateMapResolver;
39
+ $this->filter = (new FilterChain())
40
+ ->attach(new CamelCaseToDash())
41
+ ->attach(new StringToLower());
42
+ }
43
+
25
44
public function attach(EventManagerInterface $events, $priority = 1)
26
45
{
27
46
$this->listeners[] = $events->attach(
28
47
MvcEvent::EVENT_RENDER,
29
48
[$this, 'setLayout']
30
49
);
31
50
}
32
-
51
+
33
52
public function setLayout(MvcEvent $event) : void
34
53
{
35
- // Get route match object
54
+ // Get and check the route match object
36
55
$routeMatch = $event->getRouteMatch();
56
+ if (! $routeMatch) {
57
+ return;
58
+ }
37
59
38
- // Check route match and parameter for current module
39
- if ($routeMatch
40
- && $routeMatch->getParam('module') === 'Admin'
41
- ) {
42
- // Get root view model
43
- $layoutViewModel = $event->getViewModel();
60
+ // Get and check the parameter for current controller
61
+ $controller = $routeMatch->getParam('controller');
62
+ if (! $controller) {
63
+ return;
64
+ }
65
+
66
+ // Extract module name
67
+ $module = substr($controller, 0, strpos($controller, '\\'));
68
+
69
+ // Convert the module name from camel case to a lower string with dashes
70
+ $name = 'layout/' . $this->filter->filter($module);
44
71
45
- // Change template
46
- $layoutViewModel->setTemplate('layout/backend');
72
+ // Has the resolver an entry / layout with the given name?
73
+ if (! $this->templateMapResolver->has($name)) {
74
+ return;
47
75
}
76
+
77
+ // Get root view model
78
+ $layoutViewModel = $event->getViewModel();
79
+
80
+ // Change template
81
+ $layoutViewModel->setTemplate($name);
48
82
}
49
83
}
50
84
```
@@ -59,16 +93,22 @@ namespace Admin;
59
93
60
94
use Application\Listener\LayoutListener;
61
95
use Zend\Mvc\MvcEvent;
96
+ use Zend\View\Resolver\TemplateMapResolver;
62
97
63
98
class Module
64
99
{
65
- public function onBootstrap(MvcEvent $e ) : void
100
+ public function onBootstrap(MvcEvent $event ) : void
66
101
{
67
- $application = $e->getApplication();
102
+ $application = $event->getApplication();
103
+
104
+ /** @var TemplateMapResolver $templateMapResolver */
105
+ $templateMapResolver = $application->getServiceManager()->get(
106
+ 'ViewTemplateMapResolver'
107
+ );
68
108
69
109
// Create and register layout listener
70
- $layoutAggregate = new LayoutListener();
71
- $layoutAggregate ->attach($application->getEventManager());
110
+ $listener = new LayoutListener($templateMapResolver );
111
+ $listener ->attach($application->getEventManager());
72
112
}
73
113
74
114
// …
0 commit comments