Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
79.73% covered (warning)
79.73%
59 / 74
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzMenu
79.73% covered (warning)
79.73%
59 / 74
66.67% covered (warning)
66.67%
2 / 3
19.41
0.00% covered (danger)
0.00%
0 / 1
 getHtml
72.22% covered (warning)
72.22%
39 / 54
0.00% covered (danger)
0.00%
0 / 1
10.74
 getMenu
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 getMenuItem
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2
3// =============================================================================
4// Das Navigationsmenu der Website.
5// =============================================================================
6
7namespace Olz\Components\Page\OlzMenu;
8
9use Olz\Components\Common\OlzComponent;
10use Olz\Entity\Roles\Role;
11use Olz\Repository\Roles\PredefinedRole;
12
13/**
14 * @phpstan-type MenuItem array{name: string, ident: string, href: string}
15 *
16 * @extends OlzComponent<array<string, mixed>>
17 */
18class OlzMenu extends OlzComponent {
19    public function getHtml(mixed $args): string {
20        $out = '';
21
22        $code_href = $this->envUtils()->getCodeHref();
23        $data_path = $this->envUtils()->getDataPath();
24
25        $news_utils = $this->newsUtils();
26        $enc_news_filter = $news_utils->serialize($news_utils->getDefaultFilter());
27        $termine_utils = $this->termineUtils();
28        $enc_termine_filter = $termine_utils->serialize($termine_utils->getDefaultFilter());
29
30        $main_menu = [
31            ['name' => "Startseite", 'ident' => 'startseite', 'href' => '?von=menu'],
32            null,
33            ['name' => "News", 'ident' => 'news', 'href' => "news?filter={$enc_news_filter}&seite=1&von=menu"],
34            ['name' => "Termine", 'ident' => 'termine', 'href' => "termine?filter={$enc_termine_filter}&von=menu"],
35            null,
36            ['name' => "Angebot", 'ident' => 'angebot', 'href' => 'angebot?von=menu'],
37            ['name' => "Karten", 'ident' => 'karten', 'href' => 'karten?von=menu'],
38            null,
39            ['name' => "Service", 'ident' => 'service', 'href' => 'service?von=menu'],
40            ['name' => "Verein", 'ident' => 'verein', 'href' => 'verein?von=menu'],
41        ];
42
43        // BACK-BUTTON
44        $back_menu_out = '';
45        $back_link = $args['back_link'] ?? null;
46        if ($back_link !== null) {
47            $back_menu_out = <<<ZZZZZZZZZZ
48                <a href='{$back_link}' class='menu-link' id='back-link'>
49                    <div class='menutag'>
50                        <img src='{$code_href}assets/icns/back_16.svg' alt='&lt;' class='back-icon'>
51                        Zurück
52                    </div>
53                </a>
54                ZZZZZZZZZZ;
55        }
56
57        // LIVE-RESULTATE
58        $live_menu_out = '';
59        $live_json_path = "{$data_path}results/_live.json";
60        if (is_file($live_json_path)) {
61            $content = file_get_contents($live_json_path);
62            if ($content) {
63                $live = json_decode($content, true);
64                $last_updated_at = strtotime($live['last_updated_at']) ?: 0;
65                $now = strtotime($this->dateUtils()->getIsoNow()) ?: 0;
66                if ($live && $last_updated_at > $now - 3600) {
67                    $live_file = $live['file'];
68                    $style = preg_match('/test/', $live_file) ? " style='display:none;'" : "";
69                    $live_menu_out = <<<ZZZZZZZZZZ
70                        <a href='{$code_href}apps/resultate/?file={$live_file}'{$style} class='menu-link' id='live-results-link'>
71                            <div class='menutag'>
72                                Live-Resultate
73                            </div>
74                        </a>
75                        ZZZZZZZZZZ;
76                }
77            }
78        }
79
80        $main_menu_out = $this->getMenu($main_menu);
81
82        $role_repo = $this->entityManager()->getRepository(Role::class);
83        $sysadmin_role = $role_repo->getPredefinedRole(PredefinedRole::Sysadmin);
84        $out .= <<<ZZZZZZZZZZ
85            <div id='menu' class='menu'>
86                <div class='back-menu'>{$back_menu_out}</div>
87                <div class='live-menu'>{$live_menu_out}</div>
88                <div class='main-menu'>{$main_menu_out}</div>
89                <div class='feedback-mail'>
90                    <a
91                        href='#'
92                        onclick='return olz.initOlzRoleInfoModal({$sysadmin_role?->getId()})'
93                        class='linkmail'
94                    >
95                        Feedback geben
96                    </a>
97                </div>
98                <div class='platform-links'>
99                    <a
100                        href='https://github.com/olzimmerberg/olz-website'
101                        target='_blank'
102                        rel='noreferrer noopener'
103                        title='OL Zimmerberg auf GitHub'
104                        class='platform-link'
105                    >
106                        <img src='{$code_href}assets/icns/github_16.svg' alt='g' class='noborder' />
107                    </a>
108                    <a
109                        href='https://www.youtube.com/channel/UCMhMdPRJOqdXHlmB9kEpmXQ'
110                        target='_blank'
111                        rel='noreferrer noopener'
112                        title='OL Zimmerberg auf YouTube'
113                        class='platform-link'
114                    >
115                        <img src='{$code_href}assets/icns/youtube_16.svg' alt='Y' class='noborder' />
116                    </a>
117                    <a
118                        href='https://www.strava.com/clubs/olzimmerberg'
119                        target='_blank'
120                        rel='noreferrer noopener'
121                        title='OL Zimmerberg auf Strava'
122                        class='platform-link'
123                    >
124                        <img src='{$code_href}assets/icns/strava_16.svg' alt='s' class='noborder' />
125                    </a>
126                </div>
127            </div>
128            ZZZZZZZZZZ;
129
130        return $out;
131    }
132
133    /** @param array<?MenuItem> $menu */
134    protected function getMenu(array $menu): string {
135        $out = '';
136        for ($i = 0; $i < count($menu); $i++) {
137            $menupunkt = $menu[$i];
138            $out .= $this->getMenuItem($menupunkt);
139        }
140        return $out;
141    }
142
143    /**
144     * @param ?MenuItem $menu_item
145     */
146    protected function getMenuItem(?array $menu_item): string {
147        if ($menu_item === null) {
148            return <<<'ZZZZZZZZZZ'
149                <div class='separator'></div>
150                ZZZZZZZZZZ;
151        }
152        $code_href = $this->envUtils()->getCodeHref();
153        $href = $menu_item['href'];
154        $href_path = substr($href, 0, strpos($href, '?') === false ? strlen($href) : strpos($href, '?'));
155        $request_uri = $_SERVER['REQUEST_URI'] ?? '';
156        $is_active = (
157            preg_match("/^\\/{$href_path}(\\/|\\?|#|$)/", $request_uri)
158            || ($href_path === '' && $request_uri === '')
159        );
160        $active_class = $is_active ? ' active' : '';
161        return <<<ZZZZZZZZZZ
162            <a href='{$code_href}{$href}' id='menu_a_page_{$menu_item['ident']}' class='menu-link'>
163                <div class='menutag{$active_class}'>
164                    {$menu_item['name']}
165                </div>
166            </a>
167            ZZZZZZZZZZ;
168    }
169}