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