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