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;
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<span class=\"meilisearch-meta\" style=\"display:none !important\">" .
htmlspecialchars($metaText, ENT_QUOTES) .
"</span>\n";
/*
* =====================
* MARKER AUSGEBEN
* =====================
*/
$marker =
"\n<!--\n" .
"MEILISEARCH_JSON\n" .
"\n<!--\nMEILISEARCH_JSON\n" .
json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) .
"\n-->\n";
$injection = $hiddenMeta . $marker;
return str_contains($buffer, '</body>')
? str_replace('</body>', $marker . '</body>', $buffer)
: $buffer . $marker;
? str_replace('</body>', $injection . '</body>', $buffer)
: $buffer . $injection;
}
}