From fe2fd9169763abcdfeada6bc70c64a9fb4362b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Mummert?= Date: Sat, 27 Dec 2025 21:50:27 +0100 Subject: [PATCH] Bugfix --- .../MeilisearchPageMarkerListener.php | 93 ++++++++++++++----- src/Resources/contao/dca/tl_search.php | 8 -- 2 files changed, 68 insertions(+), 33 deletions(-) diff --git a/src/EventListener/MeilisearchPageMarkerListener.php b/src/EventListener/MeilisearchPageMarkerListener.php index aa6c431..6ea5b97 100644 --- a/src/EventListener/MeilisearchPageMarkerListener.php +++ b/src/EventListener/MeilisearchPageMarkerListener.php @@ -21,7 +21,7 @@ class MeilisearchPageMarkerListener /* * ===================== - * PAGE + * PAGE (Basisdaten) * ===================== */ $pageImageUuid = null; @@ -40,15 +40,22 @@ class MeilisearchPageMarkerListener } if (!empty($page->searchimage)) { - try { - $pageImageUuid = StringUtil::binToUuid((string) $page->searchimage); - } catch (\Throwable) {} + $raw = (string) $page->searchimage; + + // UUID-String oder BINARY(16) + if (preg_match('/^[a-f0-9-]{36}$/i', $raw)) { + $pageImageUuid = $raw; + } else { + try { + $pageImageUuid = StringUtil::binToUuid($raw); + } catch (\Throwable) {} + } } } /* * ===================== - * JSON-LD (SAUBER!) + * JSON-LD AUSWERTEN (ohne Regex-Fallen) * ===================== */ preg_match_all( @@ -92,13 +99,10 @@ class MeilisearchPageMarkerListener $data['event']['searchimage'] = StringUtil::binToUuid($event->singleSRC); } + // ✅ STARTDATE (Unix Timestamp) if (!empty($event->startDate)) { $data['event']['startDate'] = (int) $event->startDate; } - - if (!empty($event->endDate)) { - $data['event']['endDate'] = (int) $event->endDate; - } } } } @@ -132,16 +136,26 @@ class MeilisearchPageMarkerListener /* * ===================== - * SEARCHIMAGE + * FINALE SEARCHIMAGE-ENTSCHEIDUNG * ===================== */ - $finalSearchImageUuid = - $data['event']['searchimage'] - ?? $data['news']['searchimage'] - ?? $pageImageUuid - ?? Config::get('meilisearch_fallback_image'); + $finalSearchImageUuid = null; - if ($finalSearchImageUuid) { + if (!empty($data['event']['searchimage'])) { + $finalSearchImageUuid = $data['event']['searchimage']; + } elseif (!empty($data['news']['searchimage'])) { + $finalSearchImageUuid = $data['news']['searchimage']; + } elseif ($pageImageUuid) { + $finalSearchImageUuid = $pageImageUuid; + } else { + $fallback = Config::get('meilisearch_fallback_image'); + if ($fallback) { + $finalSearchImageUuid = $fallback; + } + } + + if ($finalSearchImageUuid !== null) { + $data['page'] ??= []; $data['page']['searchimage'] = $finalSearchImageUuid; } @@ -151,28 +165,57 @@ class MeilisearchPageMarkerListener /* * ===================== - * META-SPAN (Checksum!) + * META-SPAN (ALLES REIN!) * ===================== */ - $meta = []; + $metaParts = []; + // PAGE + if (!empty($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']['priority'])) { + $metaParts[] = 'event_priority=' . (int) $data['event']['priority']; + } + if (!empty($data['event']['keywords'])) { + $metaParts[] = 'event_keywords=' . (string) $data['event']['keywords']; + } + if (!empty($data['event']['searchimage'])) { + $metaParts[] = 'event_searchimage=' . (string) $data['event']['searchimage']; + } if (!empty($data['event']['startDate'])) { - $meta[] = 'event_startDate=' . $data['event']['startDate']; - } - if (!empty($data['event']['endDate'])) { - $meta[] = 'event_endDate=' . $data['event']['endDate']; + $metaParts[] = 'event_startDate=' . (int) $data['event']['startDate']; } - $hidden = + $metaText = 'MEILISEARCH_META ' . implode(' | ', $metaParts); + + $hiddenMeta = "\n" . - 'MEILISEARCH_META ' . implode(' | ', $meta) . + htmlspecialchars($metaText, ENT_QUOTES) . "\n"; + /* + * ===================== + * JSON-MARKER + * ===================== + */ $marker = "\n\n"; - return str_replace('', $hidden . $marker . '', $buffer); + $injection = $hiddenMeta . $marker; + + return str_contains($buffer, '') + ? str_replace('', $injection . '', $buffer) + : $buffer . $injection; } } \ No newline at end of file diff --git a/src/Resources/contao/dca/tl_search.php b/src/Resources/contao/dca/tl_search.php index e3a4cad..0456b66 100644 --- a/src/Resources/contao/dca/tl_search.php +++ b/src/Resources/contao/dca/tl_search.php @@ -34,11 +34,3 @@ $GLOBALS['TL_DCA']['tl_search']['fields']['startDate'] = [ 'eval' => ['tl_class' => 'w50', 'rgxp' => 'digit'], 'sql' => "bigint(20) NOT NULL default '0'", ]; - -$GLOBALS['TL_DCA']['tl_search']['fields']['endDate'] = [ - 'label' => ['Enddatum', 'Enddatum für die Suchergebnisse (Unix-Timestamp)'], - 'exclude' => true, - 'inputType' => 'text', - 'eval' => ['tl_class' => 'w50', 'rgxp' => 'digit'], - 'sql' => "bigint(20) NOT NULL default '0'", -]; \ No newline at end of file