Search Documentation

Search for pages and headings in the documentation

Suchfunktion in Templates

Mit CrispyCMS können Sie eine dynamische Suchfunktion direkt in Ihre Twig-Templates integrieren, ohne komplexe Backend-Logik schreiben zu müssen. Dies ermöglicht es Ihnen, Inhalte basierend auf Benutzereingaben flexibel darzustellen und die Benutzererfahrung durch relevante Ergebnisse zu verbessern.

Hierfür steht Ihnen die zentrale Twig-Funktion performSearchQuery zur Verfügung. Diese Funktion agiert als Schnittstelle zwischen Ihrem Frontend und dem Suchindex von CrispyCMS.

Implementierung

Die Funktion performSearchQuery akzeptiert einen Suchbegriff als String und liefert eine Liste von ScoredSearchEntry-Objekten zurück. Um die Übersichtlichkeit zu wahren, können wir die Logik und die Datenstruktur getrennt betrachten.


Datenfelder im Detail

Jedes Element im Rückgabe-Array enthält detaillierte Informationen, die Sie zur Gestaltung der Suchergebnisse nutzen können. Hier ist eine Aufschlüsselung der verfügbaren Felder:

FeldTypBeschreibung
titleStringDer Titel des gefundenen Dokuments oder der Seite.
snippetStringEin automatisch generierter Auszug oder eine Kurzbeschreibung des Inhalts, ideal für Vorschauen.
urlStringDer relative Pfad zum Suchergebnis.
scoreFloatEin numerischer Wert, der die Relevanz des Ergebnisses angibt. Je höher der Wert, desto relevanter ist das Ergebnis bezüglich der Suchanfrage.
sourceStringGibt die Quelle des Ergebnisses an (z.B. “Blog”, “Page”).
createdAtTimestampZeitstempel der Erstellung.
updatedAtTimestampZeitstempel der letzten Aktualisierung.

Vollständiges Beispiel: Suchformular mit Ergebnissen

Für eine vollständige Integration benötigen Sie oft sowohl das Eingabeformular als auch die Ergebnisanzeige auf derselben Seite. Das folgende Muster prüft, ob ein Suchparameter (q) in der URL vorhanden ist, und führt erst dann die Suche aus.

{# 1. Das Suchformular #}
<form method="get" action="" class="search-form">
    <input type="text" name="q" value="{{ GET.q }}" placeholder="Suchbegriff eingeben...">
    <button type="submit">Suchen</button>
</form>

{# 2. Die Verarbeitung der Ergebnisse #}
{% if GET.q is not empty %}
    {% set results = performSearchQuery(GET.q) %}
    
    <div class="search-header">
        <h2>Suchergebnisse für "{{ GET.q }}"</h2>
        <Badge variant="secondary">{{ results|length }} Treffer</Badge>
    </div>

    <ul class="results-list">
        {% for entry in results %}
            <li class="result-item">
                <a href="{{ entry.url }}" class="result-title">{{ entry.title }}</a>
                {# Anzeige des Relevanz-Scores für Debugging oder Transparenz #}
                <small class="text-muted">Score: {{ entry.score|number_format(2) }}</small>
                <p>{{ entry.snippet }}</p>
            </li>
        {% endfor %}
    </ul>
{% endif %}