Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 163 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 1 |
OlzFuerEinsteigerParams | n/a |
0 / 0 |
n/a |
0 / 0 |
0 | n/a |
0 / 0 |
|||
OlzFuerEinsteiger | |
0.00% |
0 / 163 |
|
0.00% |
0 / 4 |
42 | |
0.00% |
0 / 1 |
getSearchTitle | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
getSearchResults | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
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\OlzRootComponent; |
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 OlzRootComponent<array<string, mixed>> */ |
20 | class 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 | } |