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