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