Skip to content
This repository was archived by the owner on Jan 31, 2020. It is now read-only.

Commit 30946b5

Browse files
committed
Updates listener and modules in code examples
1 parent de3cb37 commit 30946b5

File tree

1 file changed

+54
-14
lines changed

1 file changed

+54
-14
lines changed

doc/book/cookbook/setting-module-specific-layouts.md

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,67 @@ namespace Admin\Listener;
1818

1919
use Zend\EventManager\AbstractListenerAggregate;
2020
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;
2125
use Zend\Mvc\MvcEvent;
26+
use Zend\View\Resolver\TemplateMapResolver;
2227

2328
class LayoutListener extends AbstractListenerAggregate
2429
{
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+
2544
public function attach(EventManagerInterface $events, $priority = 1)
2645
{
2746
$this->listeners[] = $events->attach(
2847
MvcEvent::EVENT_RENDER,
2948
[$this, 'setLayout']
3049
);
3150
}
32-
51+
3352
public function setLayout(MvcEvent $event) : void
3453
{
35-
// Get route match object
54+
// Get and check the route match object
3655
$routeMatch = $event->getRouteMatch();
56+
if (! $routeMatch) {
57+
return;
58+
}
3759

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);
4471

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;
4775
}
76+
77+
// Get root view model
78+
$layoutViewModel = $event->getViewModel();
79+
80+
// Change template
81+
$layoutViewModel->setTemplate($name);
4882
}
4983
}
5084
```
@@ -59,16 +93,22 @@ namespace Admin;
5993

6094
use Application\Listener\LayoutListener;
6195
use Zend\Mvc\MvcEvent;
96+
use Zend\View\Resolver\TemplateMapResolver;
6297

6398
class Module
6499
{
65-
public function onBootstrap(MvcEvent $e) : void
100+
public function onBootstrap(MvcEvent $event) : void
66101
{
67-
$application = $e->getApplication();
102+
$application = $event->getApplication();
103+
104+
/** @var TemplateMapResolver $templateMapResolver */
105+
$templateMapResolver = $application->getServiceManager()->get(
106+
'ViewTemplateMapResolver'
107+
);
68108

69109
// Create and register layout listener
70-
$layoutAggregate = new LayoutListener();
71-
$layoutAggregate->attach($application->getEventManager());
110+
$listener = new LayoutListener($templateMapResolver);
111+
$listener->attach($application->getEventManager());
72112
}
73113

74114
// …

0 commit comments

Comments
 (0)