Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 161 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 1 |
OlzFuerEinsteigerParams | n/a |
0 / 0 |
n/a |
0 / 0 |
0 | n/a |
0 / 0 |
|||
OlzFuerEinsteiger | |
0.00% |
0 / 161 |
|
0.00% |
0 / 2 |
20 | |
0.00% |
0 / 1 |
getHtml | |
0.00% |
0 / 146 |
|
0.00% |
0 / 1 |
6 | |||
getTile | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
6 |
1 | <?php |
2 | |
3 | namespace Olz\Components\OtherPages\OlzFuerEinsteiger; |
4 | |
5 | use Olz\Components\Common\OlzComponent; |
6 | use Olz\Components\Page\OlzFooter\OlzFooter; |
7 | use Olz\Components\Page\OlzHeader\OlzHeader; |
8 | use Olz\Entity\Roles\Role; |
9 | use Olz\Entity\Termine\Termin; |
10 | use Olz\Entity\Termine\TerminLabel; |
11 | use Olz\Repository\Roles\PredefinedRole; |
12 | use Olz\Users\Components\OlzUserInfoModal\OlzUserInfoModal; |
13 | use Olz\Utils\HttpParams; |
14 | |
15 | /** @extends HttpParams<array{von?: ?string}> */ |
16 | class OlzFuerEinsteigerParams extends HttpParams { |
17 | } |
18 | |
19 | /** @extends OlzComponent<array<string, mixed>> */ |
20 | class 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 | } |