Completed
Push — master ( ea1904...7857ce )
by Alejandro
08:41
created

NavigationExtension   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 100%

Importance

Changes 8
Bugs 0 Features 3
Metric Value
wmc 11
c 8
b 0
f 3
lcom 1
cbo 5
dl 0
loc 86
ccs 33
cts 33
cp 1
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A getFunctions() 0 7 1
B renderMenu() 0 26 6
B renderLanguagesMenu() 0 25 3
1
<?php
2
namespace Acelaya\Website\Twig\Extension;
3
4
use Acelaya\Website\Service\RouteAssemblerInterface;
5
use Zend\I18n\Translator\TranslatorInterface;
6
7
class NavigationExtension extends AbstractExtension
8
{
9
    /**
10
     * @var TranslatorInterface
11
     */
12
    protected $translator;
13
    /**
14
     * @var RouteAssemblerInterface
15
     */
16
    protected $routeAssembler;
17
    /**
18
     * @var array
19
     */
20
    protected $config;
21
22 4
    public function __construct(
23
        TranslatorInterface $translator,
24
        RouteAssemblerInterface $routeAssembler,
25
        array $config = []
26
    ) {
27 4
        $this->translator = $translator;
28 4
        $this->routeAssembler = $routeAssembler;
29 4
        $this->config = $config;
30 4
    }
31
32 1
    public function getFunctions(): array
33
    {
34
        return [
35 1
            new \Twig_SimpleFunction('render_menu', [$this, 'renderMenu'], ['is_safe' => ['html']]),
36 1
            new \Twig_SimpleFunction('render_langs_menu', [$this, 'renderLanguagesMenu'], ['is_safe' => ['html']]),
37
        ];
38
    }
39
40 1
    public function renderMenu(): string
41
    {
42 1
        $pages = isset($this->config['menu']) ? $this->config['menu'] : [];
43 1
        $listElements = [];
44
        $elementPattern =
45
            '<li class="%s">' .
46
                '<a href="%s" %s><i class="fa %s"></i> %s</a>' .
47 1
            '</li>';
48 1
        $currentRoute = $this->routeAssembler->getCurrentRouteResult();
49 1
        foreach ($pages as $page) {
50 1
            $active = isset($page['route']) && $currentRoute->getMatchedRouteName() === $page['route'] ? 'active' : '';
51 1
            $target = isset($page['target']) ? 'target="_blank"' : '';
52 1
            $route = $page['uri'] ?? $this->routeAssembler->assembleUrl($page['route'], true);
53
54 1
            $listElements[] = sprintf(
55
                $elementPattern,
56
                $active,
57
                $route,
58
                $target,
59 1
                $page['icon'],
60 1
                $this->translator->translate($page['label'])
61
            );
62
        }
63
64 1
        return sprintf('<ul class="nav navbar-nav main-menu">%s</ul>', implode('', $listElements));
65
    }
66
67 1
    public function renderLanguagesMenu(): string
68
    {
69 1
        $pages = $this->config['lang_menu'] ?? [];
70 1
        $listElements = [];
71
        $elementPattern =
72
            '<li>' .
73
                '<a href="%s" class="%s">%s</a>' .
74 1
            '</li>';
75 1
        $pageResult = $this->routeAssembler->getCurrentRouteResult();
76
77 1
        foreach ($pages as $page) {
78
            // Inherit current route if it is not an error page
79 1
            $routeName = $pageResult->isSuccess() ? null : 'home';
80 1
            $route = $this->routeAssembler->assembleUrl($routeName, $page['params']);
81
82 1
            $listElements[] = sprintf(
83
                $elementPattern,
84
                $route,
85 1
                $page['class'],
86 1
                $page['label']
87
            );
88
        }
89
90 1
        return sprintf('<ul class="dropdown-menu langs-menu">%s</ul>', implode('', $listElements));
91
    }
92
}
93