Wal-Sitecore-Such-Token.jpg

Sitecore SXA – Custom Search Query Token zum Filtern eines gemeinsamen Suchbereichs nach dem Context Home Item

04.06.2020
Lesezeit: 4 Min

Ich weiß, das klingt sehr kompliziert. Aber die Lösung ist erstaunlich einfach, also lesen Sie weiter!

Und lassen Sie uns das auf die richtige Weise tun: Warum sollte ich (oder Sie) ein benutzerdefiniertes Suchabfrage-Token benötigen , um einen gemeinsamen Suchbereich nach dem Context Home Item zu filtern?

In letzter Zeit hatte ich einige Anforderungen, bei denen ich in Konflikt mit den Suchkriterien-Einstellungen der Websites innerhalb eines Mandanten geriet.

Eine Aufgabe bestand darin, eine Volltextsuche für jeden EINZELNEN Standort innerhalb des Mieters zu erstellen.

Ich dachte, dass dies in SXA eine einfache Aufgabe sein sollte:

Es funktionierte innerhalb von Minuten!

Eine weitere Aufgabe bestand darin, auf einer Nachrichtenübersichtsseite alle Nachrichten von ALLEN Standorten des Mieters zu erfassen. Es gab auch einen separaten Suchbereich, um diese Nachrichten abzufragen.

Was ist jetzt zu tun? Die Änderung des Feldes „Zugehöriger Inhalt“ in das Feld „Mieter“ funktioniert problemlos. Ich habe alle Nachrichten von allen Websites erhalten, aber meine Volltextsuche hat auch Seiten von anderen Websites angezeigt, was nicht der Fall sein sollte.

Es gibt mehrere Möglichkeiten, dies zu beheben, aber zunächst habe ich das Feld „Zugehöriger Inhalt“ für das Element „Mieter“ eingerichtet. Und genau hier setzt dieses Thema an, denn es gibt keine Standardlösung, die meinen Bedürfnissen entspricht (bitte korrigieren Sie mich, wenn ich falsch liege!).

Drei Wege führen nach Rom

Ich musste hier eine Entscheidung treffen, wie es weitergehen sollte. Ich habe 3 Optionen in Betracht gezogen:

  1. Erstellen Sie einen Suchbereich für jeden einzelnen Standort innerhalb des Mieters … Oje! Das kann viel Arbeit sein, wenn es sehr viele Websites gibt.
  2. Sehen Sie sich die Funktionsweise der „resolveSearchQueryTokens“ -Pipeline genauer an. Die SXA-Abfrage-Tokens sind ebenfalls Teil dieser Pipeline.
  3. Erkundigen Sie sich im SXA Slack Channel nach einer besseren Lösung.

Weitere Optionen sind sehr willkommen – falls es welche gibt -, da wir uns in einer Multisite-Umgebung befinden und die Suchbereiche in einer gemeinsamen Site leben.

Nach etwas mehr Recherche und sorgfältiger Prüfung habe ich mich für das benutzerdefinierte Suchabfrage-Token entschieden.

Oh, ich habe Ihnen eine einfache Lösung versprochen, aber schon so viel geschrieben. Manchmal möchte ich auch einfach nur den Hintergrund oder die Herausforderung einer Aufgabe mitteilen! Habt Geduld mit mir, wir kommen jetzt zum spannenden Teil!

Wie man ein benutzerdefiniertes Suchabfrage-Token mit Sitecore SXA erstellt

1. Erstellen Sie ein neues Visual Studio-Projekt

Nennen Sie es zum Beispiel „My.Foundation.Search“.

2. Kopieren Sie den „CurrentLocation“-Prozessor

Der Prozessor befindet sich im „Sitecore.XA.Foundation.Search.Pipelines.ResolveSearchQueryTokens“-Namensraum, wie es aussieht:

using Sitecore.ContentSearch.Utilities;
using Sitecore.XA.Foundation.Search.Attributes;

namespace Sitecore.XA.Foundation.Search.Pipelines.ResolveSearchQueryTokens
{
    public class CurrentLocation : ResolveBasicSearchQueryTokens
    {
        [SxaTokenKey]
        protected override string TokenKey
        {
            get
            {
                return "UnderCurrentPage";
            }
        }

        protected override void ProcessModel(
            SearchStringModel model,
            ResolveSearchQueryTokensEventArgs args)
        {
            model.Type = "location";
            model.Value = args.ContextItem.ID.ToString();
        }
    }
}

Es war nicht einfach, den richtigen Prozessor zu finden, denn das Token heißt „UnderCurrentPage“, die Klasse aber „CurrentLocation“.

Aber wie Sie sehen können, ist dies meiner Anforderung sehr ähnlich. Es gibt ein Kontextelement, aber ich brauche das „Home Item“ dieses Kontextelements, also muss ich einige Anpassungen vornehmen.

3. Erstellen Sie eine Klasse in Ihrem Projekt

Fügen Sie den Code des ursprünglichen Prozessors ein und benennen Sie ihn „CurrentHomeItem“, passen Sie Ihren Namensraum an, zum Beispiel „My.Foundation.Search.Pipelines.ResolveSearchQueryTokens“.

4. Ändern Sie den TokenKey

Ändern Sie zunächst den Wert des TokenKey. In meinem Fall habe ich „UnderCurrentHomeItem“genommen.

5. Die „Magie“ anwenden

Welche Art von Magie soll nun geschehen? DotPeek-Magie für sicher!
Auch schwierig zu finden, wenn man nicht an die Arbeit in einer Multisite-Umgebung gewöhnt ist. Wenn ja, haben Sie sicher schon die Schnittstelle „IMultisiteContext“ gesehen, ein wahres Juwel!

Injizieren Sie die Schnittstelle in Ihre Klasse:

private readonly IMultisiteContext _multiSiteContext;

public CurrentHomeItem(IMultisiteContext multiSiteContext)
{
    _multiSiteContext = multiSiteContext ?? throw new ArgumentNullException(nameof(multiSiteContext));
}

Die Magie ist vollbracht! ????????♂️

Setzen Sie nun den Modellwert auf:

model.Value = _multiSiteContext.GetHomeItem(args.ContextItem).ID.ToString();

Und das war’s!

6. Fügen Sie Ihren Nachfolger zur Pipeline hinzu

Erstellen Sie zum Beispiel eine neue Konfigurationsdatei: „AppConfig/Include/Foundation/My.Foundation.Search.config“ und fügen Sie Ihre Klasse der „resolveSearchQueryTokens“-Pipeline hinzu:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <pipelines>
            <resolveSearchQueryTokens>
                <processor type="My.Foundation.Search.Pipelines.ResolveSearchQueryTokens.CurrentHomeItem, My.Foundation.Search" resolve="true" />
            </resolveSearchQueryTokens>
        </pipelines>
    </sitecore>
</configuration>

7. Legen Sie das Token in Ihrer Abfrage fest, etwa so:

QueryBuilder

8. Legen Sie den Suchbereich in den Suchergebnissen und / oder im Suchfeld fest

Suchergebnis Umfang

Ihre Suchergebnisse werden nun auf der Grundlage des „Context Home Item“ angezeigt, auch wenn das Feld „Associated Content“ auf den „Mieter“ verweist.

Denken Sie daran, dass Ihr Query Builder auf einer gemeinsam genutzten Website keine Ergebnisse mehr anzeigen wird! Aber auf den anderen Websites wird die Abfrage genau das Ergebnis liefern, das Sie erwartet haben. ????

Glückliches Tokening
Dirk

Der Autor

Dirk Schäfauer
Dirk Schäfauer
Dirk Schäfauer

Die Autorin
Redakteurin & Texterin
Huyen
Tran
Huyen gestaltet mit ihrem Gespür für Sprache Texte lebendig, ansprechend und wirkungsvoll.
Kontakt
MicrosoftTeams-image (110)