From 952f2472c47d56c2c8592356c600e033d6e4930f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Mummert?= Date: Sat, 27 Dec 2025 21:44:00 +0100 Subject: [PATCH] Bugfix --- .../MeilisearchPageMarkerListener.php | 198 +++++++----------- 1 file changed, 73 insertions(+), 125 deletions(-) diff --git a/src/EventListener/MeilisearchPageMarkerListener.php b/src/EventListener/MeilisearchPageMarkerListener.php index 226a460..aa6c431 100644 --- a/src/EventListener/MeilisearchPageMarkerListener.php +++ b/src/EventListener/MeilisearchPageMarkerListener.php @@ -21,7 +21,7 @@ class MeilisearchPageMarkerListener /* * ===================== - * PAGE (Basisdaten) + * PAGE * ===================== */ $pageImageUuid = null; @@ -40,87 +40,90 @@ class MeilisearchPageMarkerListener } if (!empty($page->searchimage)) { - $raw = (string) $page->searchimage; - - if (preg_match('/^[a-f0-9-]{36}$/i', $raw)) { - $pageImageUuid = $raw; - } else { - try { - $pageImageUuid = StringUtil::binToUuid($raw); - } catch (\Throwable) { - // ignorieren - } - } + try { + $pageImageUuid = StringUtil::binToUuid((string) $page->searchimage); + } catch (\Throwable) {} } } /* * ===================== - * SCHEMA.ORG JSON-LD + * JSON-LD (SAUBER!) * ===================== */ preg_match_all( - '##s', + '##s', $buffer, - $jsonBlocks + $matches ); - foreach ($jsonBlocks[1] as $json) { + foreach ($matches[1] as $jsonRaw) { + $json = json_decode($jsonRaw, true); + if (!is_array($json)) { + continue; + } - /* - * EVENT - */ - if (preg_match('#"@type"\s*:\s*"Event"#', $json)) { - if (preg_match('#\\/schema\\/events\\/(\\d+)#', $json, $m)) { - $event = CalendarEventsModel::findByPk((int) $m[1]); + $graph = $json['@graph'] ?? []; + if (!is_array($graph)) { + continue; + } - if ($event !== null) { - $data['event'] = []; + foreach ($graph as $entry) { - if (!empty($event->priority)) { - $data['event']['priority'] = (int) $event->priority; - } + /* + * EVENT + */ + if (($entry['@type'] ?? null) === 'Event' && !empty($entry['@id'])) { + if (preg_match('#/schema/events/(\d+)#', $entry['@id'], $m)) { + $event = CalendarEventsModel::findByPk((int) $m[1]); - if (!empty($event->keywords)) { - $data['event']['keywords'] = trim((string) $event->keywords); - } + if ($event !== null) { + $data['event'] = []; - if ($event->addImage && !empty($event->singleSRC)) { - $data['event']['searchimage'] = StringUtil::binToUuid($event->singleSRC); - } + if (!empty($event->priority)) { + $data['event']['priority'] = (int) $event->priority; + } - // ✅ START / END DATE (Unix Timestamp) - if (!empty($event->startDate)) { - $data['event']['startDate'] = (int) $event->startDate; - } + if (!empty($event->keywords)) { + $data['event']['keywords'] = trim((string) $event->keywords); + } - if (!empty($event->endDate)) { - $data['event']['endDate'] = (int) $event->endDate; + if ($event->addImage && !empty($event->singleSRC)) { + $data['event']['searchimage'] = StringUtil::binToUuid($event->singleSRC); + } + + if (!empty($event->startDate)) { + $data['event']['startDate'] = (int) $event->startDate; + } + + if (!empty($event->endDate)) { + $data['event']['endDate'] = (int) $event->endDate; + } } } } - } - /* - * NEWS - */ - if (preg_match('#"@type"\s*:\s*"NewsArticle"#', $json)) { - if (preg_match('#\\/schema\\/news\\/(\\d+)#', $json, $m)) { - $news = NewsModel::findByPk((int) $m[1]); + /* + * NEWS + */ + if (($entry['@type'] ?? null) === 'NewsArticle' && !empty($entry['@id'])) { + if (preg_match('#/schema/news/(\d+)#', $entry['@id'], $m)) { + $news = NewsModel::findByPk((int) $m[1]); - if ($news !== null) { - $data['news'] = []; + if ($news !== null) { + $data['news'] = []; - if (!empty($news->priority)) { - $data['news']['priority'] = (int) $news->priority; - } + if (!empty($news->priority)) { + $data['news']['priority'] = (int) $news->priority; + } - if (!empty($news->keywords)) { - $data['news']['keywords'] = trim((string) $news->keywords); - } + if (!empty($news->keywords)) { + $data['news']['keywords'] = trim((string) $news->keywords); + } - if ($news->addImage && !empty($news->singleSRC)) { - $data['news']['searchimage'] = StringUtil::binToUuid($news->singleSRC); + if ($news->addImage && !empty($news->singleSRC)) { + $data['news']['searchimage'] = StringUtil::binToUuid($news->singleSRC); + } } } } @@ -129,42 +132,16 @@ class MeilisearchPageMarkerListener /* * ===================== - * FINALE SEARCHIMAGE-ENTSCHEIDUNG + * SEARCHIMAGE * ===================== */ - $finalSearchImageUuid = null; + $finalSearchImageUuid = + $data['event']['searchimage'] + ?? $data['news']['searchimage'] + ?? $pageImageUuid + ?? Config::get('meilisearch_fallback_image'); - // 1) EVENT > NEWS - if (!empty($data['event']['searchimage'])) { - $finalSearchImageUuid = $data['event']['searchimage']; - } elseif (!empty($data['news']['searchimage'])) { - $finalSearchImageUuid = $data['news']['searchimage']; - } - - // 2) CUSTOM SEARCHIMAGE (Markup) - if ( - $finalSearchImageUuid === null - && preg_match('#data-searchimage-uuid="([a-f0-9\-]{36})"#i', $buffer, $m) - && FilesModel::findByUuid($m[1]) !== null - ) { - $finalSearchImageUuid = $m[1]; - } - - // 3) PAGE SEARCHIMAGE - if ($finalSearchImageUuid === null && $pageImageUuid) { - $finalSearchImageUuid = $pageImageUuid; - } - - // 4) FALLBACK (tl_settings) - if ($finalSearchImageUuid === null) { - $fallback = Config::get('meilisearch_fallback_image'); - if ($fallback) { - $finalSearchImageUuid = $fallback; - } - } - - if ($finalSearchImageUuid !== null) { - $data['page'] ??= []; + if ($finalSearchImageUuid) { $data['page']['searchimage'] = $finalSearchImageUuid; } @@ -174,57 +151,28 @@ class MeilisearchPageMarkerListener /* * ===================== - * META-SPAN (Checksum-relevant!) + * META-SPAN (Checksum!) * ===================== */ - $metaParts = []; + $meta = []; - // PAGE - if (isset($data['page']['priority'])) { - $metaParts[] = 'page_priority=' . (int) $data['page']['priority']; - } - if (!empty($data['page']['keywords'])) { - $metaParts[] = 'page_keywords=' . (string) $data['page']['keywords']; - } - if (!empty($data['page']['searchimage'])) { - $metaParts[] = 'page_searchimage=' . (string) $data['page']['searchimage']; - } - - // EVENT if (!empty($data['event']['startDate'])) { - $metaParts[] = 'event_startDate=' . (int) $data['event']['startDate']; + $meta[] = 'event_startDate=' . $data['event']['startDate']; } if (!empty($data['event']['endDate'])) { - $metaParts[] = 'event_endDate=' . (int) $data['event']['endDate']; - } - if (!empty($data['event']['priority'])) { - $metaParts[] = 'event_priority=' . (int) $data['event']['priority']; - } - if (!empty($data['event']['keywords'])) { - $metaParts[] = 'event_keywords=' . (string) $data['event']['keywords']; + $meta[] = 'event_endDate=' . $data['event']['endDate']; } - $metaText = 'MEILISEARCH_META ' . ($metaParts ? implode(' | ', $metaParts) : 'present'); - - $hiddenMeta = + $hidden = "\n" . - htmlspecialchars($metaText, ENT_QUOTES) . + 'MEILISEARCH_META ' . implode(' | ', $meta) . "\n"; - /* - * ===================== - * JSON-MARKER - * ===================== - */ $marker = "\n\n"; - $injection = $hiddenMeta . $marker; - - return str_contains($buffer, '') - ? str_replace('', $injection . '', $buffer) - : $buffer . $injection; + return str_replace('', $hidden . $marker . '', $buffer); } } \ No newline at end of file