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