diff --git a/src/EventListener/MeilisearchPageMarkerListener.php b/src/EventListener/MeilisearchPageMarkerListener.php index 9c5fdb1..cbc53a5 100644 --- a/src/EventListener/MeilisearchPageMarkerListener.php +++ b/src/EventListener/MeilisearchPageMarkerListener.php @@ -2,12 +2,12 @@ namespace MummertMedia\ContaoMeilisearchBundle\EventListener; -use Contao\PageModel; use Contao\CalendarEventsModel; -use Contao\NewsModel; -use Contao\StringUtil; use Contao\Config; use Contao\FilesModel; +use Contao\NewsModel; +use Contao\PageModel; +use Contao\StringUtil; class MeilisearchPageMarkerListener { @@ -39,9 +39,22 @@ class MeilisearchPageMarkerListener $data['page']['keywords'] = trim((string) $page->keywords); } - // tl_page.searchimage ist BINARY → UUID + // Achtung: je nach Felddefinition kann searchimage BINARY(16) oder UUID-String sein. + // Wir versuchen beides robust zu behandeln. if (!empty($page->searchimage)) { - $pageImageUuid = StringUtil::binToUuid($page->searchimage); + $raw = (string) $page->searchimage; + + // UUID-String? + if (preg_match('/^[a-f0-9-]{36}$/i', $raw)) { + $pageImageUuid = $raw; + } else { + // vermutlich BINARY(16) + try { + $pageImageUuid = StringUtil::binToUuid($raw); + } catch (\Throwable) { + // ignorieren + } + } } } @@ -57,7 +70,6 @@ class MeilisearchPageMarkerListener ); foreach ($jsonBlocks[1] as $json) { - /* * EVENT */ @@ -116,14 +128,14 @@ class MeilisearchPageMarkerListener */ $finalSearchImageUuid = null; - // 1. EVENT > NEWS + // 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) + // 2) CUSTOM SEARCHIMAGE (Markup) if ( $finalSearchImageUuid === null && preg_match('#data-searchimage-uuid="([a-f0-9\-]{36})"#i', $buffer, $m) @@ -132,12 +144,12 @@ class MeilisearchPageMarkerListener $finalSearchImageUuid = $m[1]; } - // 3. PAGE SEARCHIMAGE + // 3) PAGE SEARCHIMAGE if ($finalSearchImageUuid === null && $pageImageUuid) { $finalSearchImageUuid = $pageImageUuid; } - // 4. FALLBACK (tl_settings) + // 4) FALLBACK (tl_settings) if ($finalSearchImageUuid === null) { $fallback = Config::get('meilisearch_fallback_image'); if ($fallback) { @@ -146,6 +158,7 @@ class MeilisearchPageMarkerListener } if ($finalSearchImageUuid !== null) { + $data['page'] ??= []; $data['page']['searchimage'] = $finalSearchImageUuid; } @@ -153,19 +166,47 @@ class MeilisearchPageMarkerListener return $buffer; } + /* + * ===================== + * WICHTIG: META-TEXT, damit sich die Contao-Checksum ändert + * ===================== + * Kommentar allein zählt oft nicht in die Checksum rein. + * Darum zusätzlich ein unsichtbares Text-Fragment in den Body schreiben. + */ + $metaParts = []; + + if (isset($data['page']['priority'])) { + $metaParts[] = 'priority=' . (int) $data['page']['priority']; + } + if (!empty($data['page']['keywords'])) { + $metaParts[] = 'keywords=' . (string) $data['page']['keywords']; + } + if (!empty($data['page']['searchimage'])) { + $metaParts[] = 'searchimage=' . (string) $data['page']['searchimage']; + } + + // Wenn gar nichts da ist, trotzdem stabiler Marker (damit du später erweitern kannst) + $metaText = 'MEILISEARCH_META ' . ($metaParts ? implode(' | ', $metaParts) : 'present'); + + $hiddenMeta = + "\n" . + htmlspecialchars($metaText, ENT_QUOTES) . + "\n"; + /* * ===================== * MARKER AUSGEBEN * ===================== */ $marker = - "\n\n"; + $injection = $hiddenMeta . $marker; + return str_contains($buffer, '') - ? str_replace('', $marker . '', $buffer) - : $buffer . $marker; + ? str_replace('', $injection . '', $buffer) + : $buffer . $injection; } } \ No newline at end of file