Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 171
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzFuerEinsteigerParams
n/a
0 / 0
n/a
0 / 0
0
n/a
0 / 0
OlzFuerEinsteiger
0.00% covered (danger)
0.00%
0 / 171
0.00% covered (danger)
0.00%
0 / 6
72
0.00% covered (danger)
0.00%
0 / 1
 hasAccess
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 searchSqlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 getPageTitle
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getPageDescription
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getHtmlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 146
0.00% covered (danger)
0.00%
0 / 1
6
 getTile
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace Olz\Components\OtherPages\OlzFuerEinsteiger;
4
5use Olz\Components\Common\OlzRootComponent;
6use Olz\Components\Page\OlzFooter\OlzFooter;
7use Olz\Components\Page\OlzHeader\OlzHeader;
8use Olz\Entity\Roles\Role;
9use Olz\Entity\Termine\Termin;
10use Olz\Entity\Termine\TerminLabel;
11use Olz\Repository\Roles\PredefinedRole;
12use Olz\Users\Components\OlzUserInfoModal\OlzUserInfoModal;
13use Olz\Utils\HttpParams;
14
15/** @extends HttpParams<array{von?: ?string}> */
16class OlzFuerEinsteigerParams extends HttpParams {
17}
18
19/** @extends OlzRootComponent<array<string, mixed>> */
20class OlzFuerEinsteiger extends OlzRootComponent {
21    public function hasAccess(): bool {
22        return true;
23    }
24
25    public function searchSqlWhenHasAccess(array $terms): string|array|null {
26        $code_href = $this->envUtils()->getCodeHref();
27        return $this->searchUtils()->getStaticResultQuery([
28            'link' => "{$code_href}karten",
29            'icon' => "{$code_href}assets/icns/link_map_16.svg",
30            'title' => $this->getPageTitle(),
31            'text' => $this->getPageDescription(),
32        ], $terms);
33    }
34
35    public function getPageTitle(): string {
36        return "Für Einsteiger";
37    }
38
39    public function getPageDescription(): string {
40        return "Das Wichtigste für OL-Anfänger und Neulinge beim Orientierungslauf oder bei der OL Zimmerberg, unserem OL-Sportverein am linken Zürichseeufer.";
41    }
42
43    protected string $termin_class = Termin::class;
44
45    public function getHtmlWhenHasAccess(mixed $args): string {
46        $this->httpUtils()->validateGetParams(OlzFuerEinsteigerParams::class);
47        $env_utils = $this->envUtils();
48        $code_href = $env_utils->getCodeHref();
49
50        $out = OlzHeader::render([
51            'title' => $this->getPageTitle(),
52            'description' => $this->getPageDescription(),
53            'canonical_url' => "{$code_href}fuer_einsteiger",
54        ]);
55
56        $entityManager = $this->dbUtils()->getEntityManager();
57        $role_repo = $entityManager->getRepository(Role::class);
58        $nachwuchs_role = $role_repo->getPredefinedRole(PredefinedRole::Nachwuchs);
59
60        $contact_information = "<div style='padding:8px 16px;'>";
61        $nachwuchs_assignees = $nachwuchs_role?->getUsers() ?? [];
62        foreach ($nachwuchs_assignees as $nachwuchs_assignee) {
63            $contact_information .= OlzUserInfoModal::render([
64                'user' => $nachwuchs_assignee,
65                'mode' => 'name_picture',
66            ]);
67        }
68        $contact_information .= "</div>";
69
70        $termin_label_repo = $entityManager->getRepository(TerminLabel::class);
71        $trainings_label = $termin_label_repo->findOneBy(['ident' => 'training']);
72        $trainings_information = $this->htmlUtils()->renderMarkdown($trainings_label?->getDetails() ?? '');
73
74        $today_iso = $this->dateUtils()->getIsoToday();
75        // TODO: PredefinedTerminLabels?
76        $dql = <<<ZZZZZZZZZZ
77                SELECT t 
78                FROM {$this->termin_class} t
79                    JOIN t.labels l
80                WHERE
81                    t.start_date >= ?1
82                    AND l.ident = 'training'
83                ORDER BY t.start_date ASC, t.start_time ASC
84            ZZZZZZZZZZ;
85        $query = $this->entityManager()
86            ->createQuery($dql)
87            ->setParameter(1, $today_iso)
88            ->setMaxResults(5)
89        ;
90        $next_five_trainings = $query->getResult();
91        $next_five_trainings_out = implode('', array_map(
92            function ($training) use ($code_href) {
93                $id = $training->getId();
94                $date = $this->dateUtils()->compactDate($training->getStartDate());
95                $title = $training->getTitle();
96                return "<li><a href='{$code_href}termine/{$id}'>
97                    <b>{$date}</b> {$title}
98                </a></li>";
99            },
100            [...$next_five_trainings],
101        ));
102
103        $orientierungslauf_001 = $this->getTile('orientierungslauf_001');
104        $orientierungslauf_002 = $this->getTile('orientierungslauf_002');
105        $orientierungslauf_003 = $this->getTile('orientierungslauf_003');
106        $orientierungslauf_004 = $this->getTile('orientierungslauf_004');
107        $was_ist_ol_001 = $this->getTile('was_ist_ol_001', ['lightgallery' => 'off']);
108        $ol_zimmerberg_001 = $this->getTile('ol_zimmerberg_001');
109        $ol_zimmerberg_002 = $this->getTile('ol_zimmerberg_002');
110        $ol_zimmerberg_003 = $this->getTile('ol_zimmerberg_003');
111        $ol_zimmerberg_004 = $this->getTile('ol_zimmerberg_004');
112        $ol_zimmerberg_005 = $this->getTile('ol_zimmerberg_005');
113        $ol_zimmerberg_006 = $this->getTile('ol_zimmerberg_006');
114        $ol_zimmerberg_007 = $this->getTile('ol_zimmerberg_007');
115        $ol_zimmerberg_008 = $this->getTile('ol_zimmerberg_008');
116        $ol_zimmerberg_009 = $this->getTile('ol_zimmerberg_009');
117        $ol_zimmerberg_010 = $this->getTile('ol_zimmerberg_010');
118        $ol_zimmerberg_011 = $this->getTile('ol_zimmerberg_011');
119        $ol_zimmerberg_012 = $this->getTile('ol_zimmerberg_012');
120        $ol_zimmerberg_013 = $this->getTile('ol_zimmerberg_013');
121        $ol_zimmerberg_014 = $this->getTile('ol_zimmerberg_014');
122        $ol_zimmerberg_015 = $this->getTile('ol_zimmerberg_015');
123        $ol_zimmerberg_016 = $this->getTile('ol_zimmerberg_016');
124        $wie_anfangen_001 = $this->getTile('wie_anfangen_001');
125        $wie_anfangen_002 = $this->getTile('wie_anfangen_002');
126        $wie_anfangen_003 = $this->getTile('wie_anfangen_003');
127        $wie_anfangen_004 = $this->getTile('wie_anfangen_004');
128        $trainings_001 = $this->getTile('trainings_001');
129        $trainings_002 = $this->getTile('trainings_002');
130        $trainings_003 = $this->getTile('trainings_003');
131        $trainings_004 = $this->getTile('trainings_004');
132        $trainings_005 = $this->getTile('trainings_005');
133        $trainings_006 = $this->getTile('trainings_006');
134        $trainings_007 = $this->getTile('trainings_007');
135        $trainings_008 = $this->getTile('trainings_008');
136        $trainings_009 = $this->getTile('trainings_009');
137        $trainings_010 = $this->getTile('trainings_010');
138        $trainings_011 = $this->getTile('trainings_011');
139        $trainings_012 = $this->getTile('trainings_012');
140        $trainings_013 = $this->getTile('trainings_013');
141        $trainings_014 = $this->getTile('trainings_014');
142        $trainings_015 = $this->getTile('trainings_015');
143        $trainings_016 = $this->getTile('trainings_016');
144        $pack_die_chance_001 = $this->getTile('pack_die_chance_001');
145        $ansprechperson_001 = $this->getTile('ansprechperson_001');
146        $ansprechperson_002 = $this->getTile('ansprechperson_002');
147        $ansprechperson_003 = $this->getTile('ansprechperson_003');
148        $ansprechperson_004 = $this->getTile('ansprechperson_004');
149
150        $out .= <<<ZZZZZZZZZZ
151            <div class='content-full'>
152            <div class='fuer-einsteiger'>
153
154            <div class='intro'>
155                <p class='slogan'>Du bist neu beim Orientierungslauf oder bei unserem Verein?</p>
156                <p class='important'>Dann ist diese Seite genau für dich!</p>
157            </div>
158
159            <div class='clear-both'></div>
160            <table class='left pics grid-2'>
161                <tr>
162                    <td>{$orientierungslauf_001}</td>
163                    <td>{$orientierungslauf_002}</td>
164                </tr>
165                <tr>
166                    <td>{$orientierungslauf_003}</td>
167                    <td>{$orientierungslauf_004}</td>
168                </tr>
169            </table>
170            <div class='text'>
171                <h1>Orientierungslauf (OL)</h1>
172                <p class='slogan'>Wird dir das Joggen zu langweilig, die Strassenläufe zu eintönig, die Finnenbahn zu öde?</p>
173                <p class='slogan'>Möchtest du die Wälder deiner Region besser kennenlernen, als das vielleicht beim Wandern oder auf dem Vita-Parcours der Fall ist?</p>
174                <p class='slogan'>Suchst du eine Outdoor-Sportart, die dich technisch und läuferisch herausfordert?</p>
175                <p class='important'>Dann ist OL vielleicht ein Sport für dich!</p>
176            </div>
177
178            <div class='clear-both'></div>
179            <div class='right pics'>
180                <span class='lightgallery'>
181                    <a
182                        href='https://www.youtube.com/watch?v=JVL0vgcnM6c'
183                        rel='noopener noreferrer'
184                        data-src='https://www.youtube.com/watch?v=JVL0vgcnM6c'
185                    >
186                        {$was_ist_ol_001}
187                    </a>
188                </span>
189            </div>
190            <div class='text'>
191                <h1>Was ist OL?</h1>
192                <p class='slogan'>OL ist Spass und Abenteuer in der Natur für alle Altersgruppen!</p>
193                <p class='description'>Ausgerüstet mit Karte und Kompass hast du die Mission, möglichst schnell alle Posten (Kontrollpunkte) im Laufgebiet (Wald oder Stadt) zu finden.</p>
194                <p class='description'>Wir haben dazu auch ein <a href='https://www.youtube.com/watch?v=JVL0vgcnM6c' rel='noopener noreferrer' target='_blank' class='linkext'>kurzes YouTube-Video</a> erstellt.</p>
195                <p class='description'><a href='https://de.m.wikipedia.org/wiki/Orientierungslauf' rel='noopener noreferrer' target='_blank'>Orientierungslauf</a> ist ähnlich wie:</p>
196                <ul class='description'>
197                    <li><a href='https://de.m.wikipedia.org/wiki/Traillauf' rel='noopener noreferrer' target='_blank'>Trailrunning</a>, aber mit Karte und Kompass</li>
198                    <li><a href='https://de.m.wikipedia.org/wiki/Geocaching' rel='noopener noreferrer' target='_blank'>Geocaching</a>, aber als Sportart</li>
199                    <li><a href='https://de.m.wikipedia.org/wiki/Foxtrail' rel='noopener noreferrer' target='_blank'>Foxtrail</a> und <a href='https://de.m.wikipedia.org/wiki/Schnitzeljagd' rel='noopener noreferrer' target='_blank'>Schnitzeljagd</a>, aber mit Zeitmessung und nur der Karte als Problemstellung</li>
200                </ul>
201            </div>
202
203            <div class='clear-both'></div>
204            <table class='left pics grid-4'>
205                <tr>
206                    <td>{$ol_zimmerberg_001}</td>
207                    <td>{$ol_zimmerberg_002}</td>
208                    <td>{$ol_zimmerberg_003}</td>
209                    <td>{$ol_zimmerberg_004}</td>
210                </tr>
211                <tr>
212                    <td>{$ol_zimmerberg_005}</td>
213                    <td>{$ol_zimmerberg_006}</td>
214                    <td>{$ol_zimmerberg_007}</td>
215                    <td>{$ol_zimmerberg_008}</td>
216                </tr>
217                <tr>
218                    <td>{$ol_zimmerberg_009}</td>
219                    <td>{$ol_zimmerberg_010}</td>
220                    <td>{$ol_zimmerberg_011}</td>
221                    <td>{$ol_zimmerberg_012}</td>
222                </tr>
223                <tr>
224                    <td>{$ol_zimmerberg_013}</td>
225                    <td>{$ol_zimmerberg_014}</td>
226                    <td>{$ol_zimmerberg_015}</td>
227                    <td>{$ol_zimmerberg_016}</td>
228                </tr>
229            </table>
230            <div class='text'>
231                <h1>OL Zimmerberg</h1>
232                <p class='description'>Wir sind ein <b>Orientierungslauf-Sportverein</b> in der Region um den Zimmerberg am <b>linken Zürichseeufer</b> und im Sihltal.</p>
233                <p class='description'>Unsere <b>Mitglieder</b> kommen aus Kilchberg, Rüschlikon, Thalwil, Oberrieden, Horgen, Au ZH, Wädenswil, Richterswil, Schönenberg, Hirzel, Langnau am Albis, Gattikon, Adliswil und nahe gelegenen Teilen der Stadt Zürich (Wollishofen, Enge, Leimbach, Friesenberg).</p>
234            </div>
235
236            <div class='clear-both'></div>
237            <table class='right pics grid-2'>
238                <tr>
239                    <td>{$wie_anfangen_001}</td>
240                    <td>{$wie_anfangen_002}</td>
241                </tr>
242                <tr>
243                    <td>{$wie_anfangen_003}</td>
244                    <td>{$wie_anfangen_004}</td>
245                </tr>
246            </table>
247            <div class='text'>
248                <h1>Wie anfangen?</h1>
249                <p class='slogan'>Du möchtest mal OL-Luft schnuppern?</p>
250                <p class='description'>Am besten kommst du in eines unserer <b>Trainings</b> (zur Vorbereitung haben wir ein <a href='https://youtu.be/PjsDAQM1kxA' rel='noopener noreferrer' target='_blank' class='linkext'>Youtube Video</a> erstellt).</p>
251                <p class='description'>Jährlich organisieren wir ein <b>OL-Lager</b> und ein <b>Tageslager</b> für Kinder und Jugendliche.</p>
252                <p class='description'>Weitere Anlässe findest du bei den <a href='{$code_href}termine' onmouseover='olz.highlight_menu(event)' onmouseout='olz.unhighlight_menu(event)' class='linkint'>Terminen</a>.</p>
253            </div>
254
255            <div class='clear-both'></div>
256            <table class='left pics grid-4'>
257                <tr>
258                    <td>{$trainings_001}</td>
259                    <td>{$trainings_002}</td>
260                    <td>{$trainings_003}</td>
261                    <td>{$trainings_004}</td>
262                </tr>
263                <tr>
264                    <td>{$trainings_005}</td>
265                    <td>{$trainings_006}</td>
266                    <td>{$trainings_007}</td>
267                    <td>{$trainings_008}</td>
268                </tr>
269                <tr>
270                    <td>{$trainings_009}</td>
271                    <td>{$trainings_010}</td>
272                    <td>{$trainings_011}</td>
273                    <td>{$trainings_012}</td>
274                </tr>
275                <tr>
276                    <td>{$trainings_013}</td>
277                    <td>{$trainings_014}</td>
278                    <td>{$trainings_015}</td>
279                    <td>{$trainings_016}</td>
280                </tr>
281            </table>
282            <div class='text'>
283                <h1>Trainings</h1>
284                <p class='description'>{$trainings_information}</p>
285            </div>
286
287            <div class='clear-both'></div>
288            <div class='right pics'>
289                {$pack_die_chance_001}
290            </div>
291            <div class='text'>
292                <h1>Pack die Chance!</h1>
293                <p class='slogan'>Komm doch einfach an eines unserer nächsten Trainings:</p>
294                <ul>{$next_five_trainings_out}</ul>
295            </div>
296
297            <div class='clear-both'></div>
298            <table class='left pics grid-2'>
299                <tr>
300                    <td>{$ansprechperson_001}</td>
301                    <td>{$ansprechperson_002}</td>
302                </tr>
303                <tr>
304                    <td>{$ansprechperson_003}</td>
305                    <td>{$ansprechperson_004}</td>
306                </tr>
307            </table>
308            <div class='text'>
309                <h1>Ansprechperson</h1>
310                <p class='slogan'>Hast du Fragen zum Training oder zu unserem OL-Klub?</p>
311                {$contact_information}
312                <p class='important'>Wir freuen uns, von dir zu hören!</p>
313                <p class='description'>Tipp: Vielleicht findest du auch bei den <a href='{$code_href}fragen_und_antworten'>FAQs</a> eine Antwort auf deine Frage.</p>
314            </div>
315
316            </div>
317            </div>
318            ZZZZZZZZZZ;
319
320        $out .= OlzFooter::render();
321
322        return $out;
323    }
324
325    /** @param array{lightgallery?: string} $options */
326    protected function getTile(string $img_name, array $options = []): string {
327        $data_href = $this->envUtils()->getDataHref();
328        $img = <<<ZZZZZZZZZZ
329            <picture>
330                <source
331                    srcset='
332                        {$data_href}img/fuer_einsteiger/thumb/{$img_name}@2x.jpg 2x,
333                        {$data_href}img/fuer_einsteiger/thumb/{$img_name}.jpg 1x
334                    '
335                    type='image/jpeg'
336                >
337                <img
338                    src='{$data_href}img/fuer_einsteiger/thumb/{$img_name}.jpg'
339                    alt=''
340                    class='tile'
341                />
342            </picture>
343            ZZZZZZZZZZ;
344        if (($options['lightgallery'] ?? '') === 'off') {
345            return $img;
346        }
347        return <<<ZZZZZZZZZZ
348            <span class='lightgallery'>
349                <a 
350                    href='{$data_href}img/fuer_einsteiger/img/{$img_name}.jpg'
351                    data-src='{$data_href}img/fuer_einsteiger/img/{$img_name}.jpg'
352                    aria-label='Bild vergrössern'
353                >
354                    {$img}
355                </a>
356            </span>
357            ZZZZZZZZZZ;
358    }
359}