NavigationExtension::renderMenu()   B
last analyzed

Complexity

Conditions 6
Paths 18

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 8.5906
c 0
b 0
f 0
cc 6
eloc 16
nc 18
nop 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Acelaya\Website\Template\Extension;
5
6
use Acelaya\Website\Service\RouteAssemblerInterface;
7
use League\Plates\Engine;
8
use League\Plates\Extension\ExtensionInterface;
9
use Zend\I18n\Translator\TranslatorInterface;
10
11
class NavigationExtension implements ExtensionInterface
12
{
13
    /**
14
     * @var TranslatorInterface
15
     */
16
    protected $translator;
17
    /**
18
     * @var RouteAssemblerInterface
19
     */
20
    protected $routeAssembler;
21
    /**
22
     * @var array
23
     */
24
    protected $config;
25
26
    public function __construct(
27
        TranslatorInterface $translator,
28
        RouteAssemblerInterface $routeAssembler,
29
        array $config = []
30
    ) {
31
        $this->translator = $translator;
32
        $this->routeAssembler = $routeAssembler;
33
        $this->config = $config;
34
    }
35
36
    public function register(Engine $engine)
37
    {
38
        $engine->registerFunction('render_menu', [$this, 'renderMenu']);
39
        $engine->registerFunction('render_langs_menu', [$this, 'renderLanguagesMenu']);
40
        $engine->registerFunction('render_social_menu', [$this, 'renderSocialMenu']);
41
    }
42
43
    public function renderMenu($class = 'pull-left left-menu'): string
44
    {
45
        $pages = isset($this->config['menu']) ? $this->config['menu'] : [];
46
        $listElements = [];
47
        $elementPattern = '<li class="%s"><a href="%s" %s>%s</a></li>';
48
        $currentRoute = $this->routeAssembler->getCurrentRouteResult();
49
50
        foreach ($pages as $page) {
51
            $active = isset($page['route']) && $currentRoute->getMatchedRouteName() === $page['route'] ? 'active' : '';
52
            $target = isset($page['target']) ? 'target="_blank"' : '';
53
            $route = $page['uri'] ?? $this->routeAssembler->assembleUrl($page['route'], true);
54
55
            $listElements[] = sprintf(
56
                $elementPattern,
57
                $active,
58
                $route,
59
                $target,
60
                $this->translator->translate($page['label'])
61
            );
62
        }
63
64
        return sprintf('<ul class="%s">%s</ul>', $class, implode('', $listElements));
65
    }
66
67
    public function renderLanguagesMenu(): string
68
    {
69
        $pages = $this->config['lang_menu'] ?? [];
70
        $listElements = [];
71
        $elementPattern = '<li><a href="%s">%s</a></li>';
72
        $pageResult = $this->routeAssembler->getCurrentRouteResult();
73
74
        foreach ($pages as $page) {
75
            // Inherit current route if it is not an error page
76
            $routeName = $pageResult->isSuccess() ? null : 'home';
77
            $route = $this->routeAssembler->assembleUrl($routeName, $page['params']);
78
79
            $listElements[] = sprintf($elementPattern, $route, $page['label']);
80
        }
81
82
        return sprintf('<ul class="pull-right right-menu">%s</ul>', implode('', $listElements));
83
    }
84
85
    public function renderSocialMenu()
86
    {
87
        $pages = $this->config['social_menu'] ?? [];
88
        $listElements = [];
89
        $elementPattern = '<li><a target="_blank" href="%s"><i class="%s"></i></a></li>';
90
91
        foreach ($pages as $page) {
92
            $listElements[] = sprintf($elementPattern, $page['uri'], $page['icon']);
93
        }
94
95
        return sprintf('<ul class="fh5co-social">%s</ul>', implode('', $listElements));
96
    }
97
}
98