Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 230
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzSitemap
0.00% covered (danger)
0.00%
0 / 230
0.00% covered (danger)
0.00%
0 / 3
240
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
 searchSqlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getEntries
0.00% covered (danger)
0.00%
0 / 228
0.00% covered (danger)
0.00%
0 / 1
182
1<?php
2
3namespace Olz\Components\OlzSitemap;
4
5use Olz\Components\Common\OlzRootComponent;
6use Olz\Components\OlzHtmlSitemap\OlzHtmlSitemap;
7use Olz\Components\OtherPages\OlzDatenschutz\OlzDatenschutz;
8use Olz\Components\OtherPages\OlzFuerEinsteiger\OlzFuerEinsteiger;
9use Olz\Components\OtherPages\OlzMaterial\OlzMaterial;
10use Olz\Entity\Faq\Question;
11use Olz\Entity\Karten\Karte;
12use Olz\Entity\News\NewsEntry;
13use Olz\Entity\Roles\Role;
14use Olz\Entity\Termine\Termin;
15use Olz\Faq\Components\OlzFaqList\OlzFaqList;
16use Olz\Karten\Components\OlzKarten\OlzKarten;
17use Olz\News\Components\OlzAuthorBadge\OlzAuthorBadge;
18use Olz\News\Components\OlzNewsList\OlzNewsList;
19use Olz\Roles\Components\OlzVerein\OlzVerein;
20use Olz\Service\Components\OlzService\OlzService;
21use Olz\Startseite\Components\OlzStartseite\OlzStartseite;
22use Olz\Termine\Components\OlzTermineList\OlzTermineList;
23
24/** @extends OlzRootComponent<array<string, mixed>> */
25abstract class OlzSitemap extends OlzRootComponent {
26    public function hasAccess(): bool {
27        return true;
28    }
29
30    public function searchSqlWhenHasAccess(array $terms): string|array|null {
31        return null;
32    }
33
34    /** @return array<array{title: string, description: string, url: string, updates: string, importance: float, level: int}> */
35    protected function getEntries(): array {
36        $db = $this->dbUtils()->getDb();
37        $entityManager = $this->dbUtils()->getEntityManager();
38        $base_href = $this->envUtils()->getBaseHref();
39        $current_year = $this->dateUtils()->getCurrentDateInFormat('Y');
40
41        $entries = [];
42
43        $entries[] = [
44            'title' => OlzStartseite::$title,
45            'description' => OlzStartseite::$description,
46            'url' => "{$base_href}/",
47            'updates' => 'daily',
48            'importance' => 0.8,
49            'level' => 0,
50        ];
51        $entries[] = [
52            'title' => OlzFuerEinsteiger::$title,
53            'description' => OlzFuerEinsteiger::$description,
54            'url' => "{$base_href}/fuer_einsteiger",
55            'updates' => 'daily',
56            'importance' => 1.0,
57            'level' => 0,
58        ];
59        $entries[] = [
60            'title' => OlzFaqList::$title,
61            'description' => OlzFaqList::$description,
62            'url' => "{$base_href}/fragen_und_antworten",
63            'updates' => 'daily',
64            'importance' => 0.8,
65            'level' => 0,
66        ];
67
68        $questions = $entityManager->getRepository(Question::class)->findBy(['on_off' => 1]);
69        foreach ($questions as $question) {
70            $title = $question->getQuestion();
71            $entries[] = [
72                'title' => $title,
73                'description' => '',
74                'url' => "{$base_href}/fragen_und_antworten/{$question->getIdent()}",
75                'updates' => 'monthly',
76                'importance' => 0.8,
77                'level' => 1,
78            ];
79        }
80
81        $entries[] = [
82            'title' => OlzNewsList::$title,
83            'description' => OlzNewsList::$description,
84            'url' => "{$base_href}/news",
85            'updates' => 'daily',
86            'importance' => 0.6,
87            'level' => 0,
88        ];
89
90        $news_utils = $this->newsUtils();
91        $news_filters = $news_utils->getAllValidFiltersForSitemap();
92        foreach ($news_filters as $news_filter) {
93            $serialized_filter = $news_utils->serialize($news_filter);
94            $title = $news_utils->getTitleFromFilter($news_filter);
95
96            $filter_where = $news_utils->getSqlFromFilter($news_filter);
97            $sql = <<<ZZZZZZZZZZ
98                SELECT
99                    COUNT(n.id) as count
100                FROM news n
101                WHERE
102                    {$filter_where}
103                    AND n.on_off='1'
104                ORDER BY published_date DESC, published_time DESC
105                ZZZZZZZZZZ;
106            // @phpstan-ignore-next-line
107            $count = intval($db->query($sql)->fetch_assoc()['count']);
108            $num_pages = intval($count / OlzNewsList::$page_size) + 1;
109
110            for ($page = 1; $page <= $num_pages; $page++) {
111                $maybe_page_label = $page > 1 ? " (Seite {$page})" : '';
112                $description = "News-Liste \"{$title}\"{$maybe_page_label}";
113                $entries[] = [
114                    'title' => "{$title}{$maybe_page_label}",
115                    'description' => $description,
116                    'url' => "{$base_href}/news?filter={$serialized_filter}&seite={$page}",
117                    'updates' => 'weekly',
118                    'importance' => $page === 1 ? 0.4 : 0.2,
119                    'level' => 1,
120                ];
121            }
122        }
123
124        $news_entries = $entityManager->getRepository(NewsEntry::class)->getAllActive();
125        foreach ($news_entries as $news_entry) {
126            $title = $news_entry->getTitle();
127            $pretty_formats = [
128                'aktuell' => "Aktuell-Eintrag",
129                'kaderblog' => "Kaderblog-Eintrag",
130                'galerie' => "Foto-Galerie",
131                'video' => "Film",
132                'forum' => "Forumseintrag",
133            ];
134            $pretty_format = $pretty_formats[$news_entry->getFormat()] ?? 'News-Eintrag';
135            $pretty_author = OlzAuthorBadge::render([
136                'news_id' => $news_entry->getId() ?: 0,
137                'user' => $news_entry->getAuthorUser(),
138                'role' => $news_entry->getAuthorRole(),
139                'name' => $news_entry->getAuthorName(),
140                'email' => $news_entry->getAuthorEmail(),
141                'mode' => 'text',
142            ]);
143            $pretty_date = $this->dateUtils()->formatDateTimeRange(
144                $news_entry->getPublishedDate()->format('Y-m-d'),
145                $news_entry->getPublishedTime()?->format('H:i:s'),
146                null,
147                null,
148                $format = 'long',
149            );
150            $description = "{$pretty_format} von {$pretty_author} am {$pretty_date}";
151            $entries[] = [
152                'title' => $title,
153                'description' => $description,
154                'url' => "{$base_href}/news/{$news_entry->getId()}",
155                'updates' => 'monthly',
156                'importance' => 0.3,
157                'level' => 2,
158            ];
159        }
160
161        $entries[] = [
162            'title' => OlzTermineList::$title,
163            'description' => OlzTermineList::$description,
164            'url' => "{$base_href}/termine",
165            'updates' => 'daily',
166            'importance' => 0.7,
167            'level' => 0,
168        ];
169
170        $termine_utils = $this->termineUtils()->loadTypeOptions();
171        $termine_filters = $termine_utils->getAllValidFiltersForSitemap();
172        foreach ($termine_filters as $termine_filter) {
173            $serialized_filter = $termine_utils->serialize($termine_filter);
174            $title = $termine_utils->getTitleFromFilter($termine_filter);
175            $description = "Termine-Liste \"{$title}\"";
176            $entries[] = [
177                'title' => $title,
178                'description' => $description,
179                'url' => "{$base_href}/termine?filter={$serialized_filter}",
180                'updates' => 'monthly',
181                'importance' => 0.6,
182                'level' => 1,
183            ];
184        }
185
186        $termine = $entityManager->getRepository(Termin::class)->getAllActive();
187        foreach ($termine as $termin) {
188            $termin_year = $termin->getStartDate()->format('Y');
189            $title = $termin->getTitle().($termin_year === $current_year ? '' : " {$termin_year}");
190            $pretty_date = $this->dateUtils()->formatDateTimeRange(
191                $termin->getStartDate()->format('Y-m-d'),
192                $termin->getStartTime()?->format('H:i:s'),
193                $termin->getEndDate()?->format('Y-m-d'),
194                $termin->getEndTime()?->format('H:i:s'),
195                $format = 'long',
196            );
197            $pretty_location = $termin->getLocation()?->getName() ?? '&nbsp;';
198            $description = "{$pretty_date}{$pretty_location}";
199            $entries[] = [
200                'title' => $title,
201                'description' => $description,
202                'url' => "{$base_href}/termine/{$termin->getId()}",
203                'updates' => 'monthly',
204                'importance' => 0.5,
205                'level' => 2,
206            ];
207        }
208
209        $entries[] = [
210            'title' => OlzKarten::$title,
211            'description' => OlzKarten::$description,
212            'url' => "{$base_href}/karten",
213            'updates' => 'monthly',
214            'importance' => 0.5,
215            'level' => 0,
216        ];
217
218        $karten = $entityManager->getRepository(Karte::class)->findBy(['on_off' => 1]);
219        foreach ($karten as $karte) {
220            $title = $karte->getName();
221            $pretty_kind = [
222                'ol' => "🌳 Wald-OL-Karte",
223                'stadt' => "🏘️ Stadt-OL-Karte",
224                'scool' => "🏫 sCOOL-Schulhaus-Karte",
225            ][$karte->getKind()] ?? "Unbekannter Kartentyp";
226            $description = "{$pretty_kind} - Massstab: {$karte->getScale()} - Stand: {$karte->getYear()}";
227            $entries[] = [
228                'title' => $title,
229                'description' => $description,
230                'url' => "{$base_href}/karten/{$karte->getId()}",
231                'updates' => 'monthly',
232                'importance' => 0.5,
233                'level' => 1,
234            ];
235        }
236
237        $entries[] = [
238            'title' => OlzMaterial::$title,
239            'description' => OlzMaterial::$description,
240            'url' => "{$base_href}/material",
241            'updates' => 'monthly',
242            'importance' => 0.5,
243            'level' => 0,
244        ];
245        $entries[] = [
246            'title' => OlzService::$title,
247            'description' => OlzService::$description,
248            'url' => "{$base_href}/service",
249            'updates' => 'monthly',
250            'importance' => 0.3,
251            'level' => 0,
252        ];
253        $entries[] = [
254            'title' => OlzVerein::$title,
255            'description' => OlzVerein::$description,
256            'url' => "{$base_href}/verein",
257            'updates' => 'monthly',
258            'importance' => 0.8,
259            'level' => 0,
260        ];
261
262        $role_repo = $entityManager->getRepository(Role::class);
263        $verein_ressorts = $role_repo->getAllActive();
264        foreach ($verein_ressorts as $verein_ressort) {
265            $title = $verein_ressort->getName();
266            $description = "{$verein_ressort->getDescription()}"; // TODO: SEO description
267            $entries[] = [
268                'title' => $title,
269                'description' => $description,
270                'url' => "{$base_href}/verein/{$verein_ressort->getUsername()}",
271                'updates' => 'monthly',
272                'importance' => 0.8,
273                'level' => 1,
274            ];
275        }
276
277        $entries[] = [
278            'title' => OlzDatenschutz::$title,
279            'description' => OlzDatenschutz::$description,
280            'url' => "{$base_href}/datenschutz",
281            'updates' => 'monthly',
282            'importance' => 0.1,
283            'level' => 0,
284        ];
285        $entries[] = [
286            'title' => OlzHtmlSitemap::$title,
287            'description' => OlzHtmlSitemap::$description,
288            'url' => "{$base_href}/sitemap",
289            'updates' => 'daily',
290            'importance' => 0.5,
291            'level' => 0,
292        ];
293
294        return $entries;
295    }
296}