This commit is contained in:
Jürgen Mummert
2025-12-27 15:32:44 +01:00
parent 542a8fc1a3
commit e7e8917d92
@@ -2,12 +2,12 @@
namespace MummertMedia\ContaoMeilisearchBundle\EventListener; namespace MummertMedia\ContaoMeilisearchBundle\EventListener;
use Contao\PageModel;
use Contao\CalendarEventsModel; use Contao\CalendarEventsModel;
use Contao\NewsModel;
use Contao\StringUtil;
use Contao\Config; use Contao\Config;
use Contao\FilesModel; use Contao\FilesModel;
use Contao\NewsModel;
use Contao\PageModel;
use Contao\StringUtil;
class MeilisearchPageMarkerListener class MeilisearchPageMarkerListener
{ {
@@ -39,9 +39,22 @@ class MeilisearchPageMarkerListener
$data['page']['keywords'] = trim((string) $page->keywords); $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)) { 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) { foreach ($jsonBlocks[1] as $json) {
/* /*
* EVENT * EVENT
*/ */
@@ -116,14 +128,14 @@ class MeilisearchPageMarkerListener
*/ */
$finalSearchImageUuid = null; $finalSearchImageUuid = null;
// 1. EVENT > NEWS // 1) EVENT > NEWS
if (!empty($data['event']['searchimage'])) { if (!empty($data['event']['searchimage'])) {
$finalSearchImageUuid = $data['event']['searchimage']; $finalSearchImageUuid = $data['event']['searchimage'];
} elseif (!empty($data['news']['searchimage'])) { } elseif (!empty($data['news']['searchimage'])) {
$finalSearchImageUuid = $data['news']['searchimage']; $finalSearchImageUuid = $data['news']['searchimage'];
} }
// 2. CUSTOM SEARCHIMAGE (Markup) // 2) CUSTOM SEARCHIMAGE (Markup)
if ( if (
$finalSearchImageUuid === null $finalSearchImageUuid === null
&& preg_match('#data-searchimage-uuid="([a-f0-9\-]{36})"#i', $buffer, $m) && preg_match('#data-searchimage-uuid="([a-f0-9\-]{36})"#i', $buffer, $m)
@@ -132,12 +144,12 @@ class MeilisearchPageMarkerListener
$finalSearchImageUuid = $m[1]; $finalSearchImageUuid = $m[1];
} }
// 3. PAGE SEARCHIMAGE // 3) PAGE SEARCHIMAGE
if ($finalSearchImageUuid === null && $pageImageUuid) { if ($finalSearchImageUuid === null && $pageImageUuid) {
$finalSearchImageUuid = $pageImageUuid; $finalSearchImageUuid = $pageImageUuid;
} }
// 4. FALLBACK (tl_settings) // 4) FALLBACK (tl_settings)
if ($finalSearchImageUuid === null) { if ($finalSearchImageUuid === null) {
$fallback = Config::get('meilisearch_fallback_image'); $fallback = Config::get('meilisearch_fallback_image');
if ($fallback) { if ($fallback) {
@@ -146,6 +158,7 @@ class MeilisearchPageMarkerListener
} }
if ($finalSearchImageUuid !== null) { if ($finalSearchImageUuid !== null) {
$data['page'] ??= [];
$data['page']['searchimage'] = $finalSearchImageUuid; $data['page']['searchimage'] = $finalSearchImageUuid;
} }
@@ -153,19 +166,47 @@ class MeilisearchPageMarkerListener
return $buffer; 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<span class=\"meilisearch-meta\" style=\"display:none !important\">" .
htmlspecialchars($metaText, ENT_QUOTES) .
"</span>\n";
/* /*
* ===================== * =====================
* MARKER AUSGEBEN * MARKER AUSGEBEN
* ===================== * =====================
*/ */
$marker = $marker =
"\n<!--\n" . "\n<!--\nMEILISEARCH_JSON\n" .
"MEILISEARCH_JSON\n" .
json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) .
"\n-->\n"; "\n-->\n";
$injection = $hiddenMeta . $marker;
return str_contains($buffer, '</body>') return str_contains($buffer, '</body>')
? str_replace('</body>', $marker . '</body>', $buffer) ? str_replace('</body>', $injection . '</body>', $buffer)
: $buffer . $marker; : $buffer . $injection;
} }
} }