Suchfunktion und Suchergebnis mit Teaser aus Nachrichten
Hallo,
ich wäre auf der Suche nach folgender Möglichkeit:
• die Suchfunktion soll ausschliesslich in den Nachrichtenarchiven greifen
• als Such-Ergebnis sollen die Teaser der jeweiligen Nachrichten aufgelistet werden und nicht die Texte des Inhaltes
• Im Such-Ergebnis soll eine mögliche Nachricht dann nur 1x aufgelistet sein
Ich könnte das z.B. über [codefog/contao-news_categories] lösen. Hat jedoch den Nachteil, dass ich immer Kategorien vergeben müsste. Und Nutzer::innen dann auch aus Kategorien auswählen müssten. Und genau das möchte ich vermeiden.
Die Inhalte der einzelnen Nachrichten sind immer mit ausreichend Text befüllt, sodass die Suchfunktion gute Ergebnisse liefern sollte. Sprich, die Standard-Suchfunktion sollte im Idealfall nutzbar sein.
Bloss die Ausgabe dazu bereitet mir Kopfschmerzen :D
Kann ich hierfür auf „Standards“ zurückgreifen?
Gibt es ggf. eine Erweiterung dazu?
Oder ist dies schon so spezifisch, dass ich das programmieren lassen muss?
JSON Meta-Daten in Suchergebnissen
Kleine Debugging-Hilfe, um die JSON-Metadaten der Suchergebnisse zur Weiterverarbeitung auszulesen (getestet mit Contao 5.4.12):
Im Template search_default.html5:
Die Meta-Daten des (einzelnen) Suchergebnisses in eine Variable speichern:
PHP-Code:
$result_meta = json_decode($this->meta);
Den kompletten Meta-Array zum Debuggen formatiert ausgeben:
PHP-Code:
echo '<pre>';
print_r($result_meta);
echo '</pre>';
IDs ermitteln:
// EDIT: Die Reihenfolge und Anzahl der Einträge innerhalb des Meta-JSON-Objektes kann variieren.
Die IDs der Seiten, News und Events können z.B. mit einer foreach-Schleife ausgelesen und in Variablen gespeichert werden:
PHP-Code:
foreach ( $result_meta as $meta_node ) {
if ( isset($meta_node->{'@type'}) ) {
// Bei regulären Seiten:
// (kann auch die ID der Seite mit dem Event-/News-Reader sein)
if ( $meta_node->{'@type'} == 'https://schema.contao.org/Page' ) {
if ( isset($meta_node->{'https://schema.contao.org/pageId'}) ) {
$page_id = $meta_node->{'https://schema.contao.org/pageId'};
// Weitere bereits verfügbare Meta-Angaben:
// $meta_node->{'https://schema.contao.org/title'};
}
}
// Bei Nachrichten:
else if ( $meta_node->{'@type'} == 'https://schema.org/NewsArticle' ) {
if ( isset($meta_node->{'@id'}) ) {
// News-ID-String hat Format '#/schema/news/123'; Anfang entfernen:
$news_id = substr($meta_node->{'@id'}, 14);
// Weitere bereits verfügbare Meta-Angaben:
// $meta_node->{'https://schema.org/datePublished'};
// $meta_node->{'https://schema.org/description'};
// $meta_node->{'https://schema.org/headline'};
// $meta_node->{'https://schema.org/url'};
// sowie der Autor als Array in $meta_node->{'https://schema.org/author'}
// News-Artikeldetails abrufen:
$news = \Contao\NewsModel::findById($news_id);
}
}
// Bei Events:
else if ( $meta_node->{'@type'} == 'https://schema.org/Event' ) {
if ( isset($meta_node->{'@id'}) ) {
// Event-ID-String hat Format '#/schema/events/123'; Anfang entfernen:
$event_id = substr($meta_node->{'@id'}, 16);
// Weitere bereits verfügbare Meta-Angaben:
// $meta_node->{'https://schema.org/description'};
// $meta_node->{'https://schema.org/startDate'};
// $meta_node->{'https://schema.org/endDate'};
// $meta_node->{'https://schema.org/url'};
// sowie ggf. weitere, siehe print_r($meta_node);
// Event-Artikeldetails abrufen:
$event = \Contao\CalendarEventsModel::findById($event_id);
}
}
// Breadcrumb zur jeweiligen Seite, falls benötigt
// (nur vorhanden, wenn das Breadcrumb-Modul auf der jeweiligen Seite eingebunden ist):
else if ( $meta_node->{'@type'} == 'https://schema.org/BreadcrumbList' ) {
if ( isset($meta_node->{'https://schema.org/itemListElement'}) ) {
$breadcrumb = $meta_node->{'https://schema.org/itemListElement'};
// Falls Anzahl der Breadcrumb-Elemente benötigt:
$breadcrumb_count = count((array)$breadcrumb);
}
}
}
}
Danach kann geprüft werden, ob die Variablen $news_id oder $event_id vorhanden/gesetzt sind und Infos von $news oder $event können weiterverarbeitet/ausgegeben werden.
Falls $news_id und $event_id nicht gesetzt/vorhanden sind, handelt es sich ggf. um eine reguläre Seite.
Die Breadcrumb-Info sind nur vorhanden, wenn das Breadcrumb-Modul auf der jeweiligen Seite eingebunden ist.