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