Navigation and service panel


Content

This text is fallbacked from the German Version. If you need use Google Translate


In der Desktop-Suche immer die letzte Version eines Items ausgeben

By Martin Haas on 3. April 2013, No comments

In der Desktop-Suche von Sitecore erscheint immer diejenige Item-Version, welche dem Suchbegriff am besten entspricht. Dieses Verhalten ist grundsätzlich völlig korrekt, jedoch besteht dadurch die Gefahr, dass eine alte Item-Version angepasst wird. Hier wird eine Möglichkeit gezeigt, wie in der Desktop-Suche immer die letzte Item-Version angezeigt wird.

Für die Kategorisierung ist der Prozessor Sitecore.Pipelines.Search.CategorizeResults zuständig, welcher sich in der search-Pipeline befindet. Also muss diese Klasse ersetzt werden. Leider ist die für die Priorisierung zuständige Methode GetMostSuitableResult als private deklariert und somit kann von CategorizeResults nicht geerbt werden. Es muss also eine komplett neue Klasse CustomCategorizeResults implementiert werden.

Zuerst wird die Methode Process implementiert. Grundsätzlich ist die neue Methode gleich, wie die der ursprünglichen Klasse. Zu beachten ist, dass die verschachtelten Klassen des original CategorizeResults weiterhin verwendet werden, da an diesen keine Anpassungen notwendig sind.

public void Process(SearchArgs args)
{
    Assert.IsNotNull(args, "args");
    Sitecore.Pipelines.Search.CategorizeResults.Categorizer categorizer;
                     categorizer = Factory.CreateObject("/sitecore/search/categorizer", true) as Sitecore.Pipelines.Search.CategorizeResults.Categorizer;
    Assert.IsNotNull(categorizer, "categorizer");

    if ((args.Root != null) && (args.Type == SearchType.ContentEditor) &&
                          (categorizer != null))
    {
        categorizer.AddCategory(new Sitecore.Pipelines.Search.CategorizeResults.PathCategory(args.Root, Translate.Text("Subitems")), 0);
    }
    foreach (SearchResult result in args.Result)
    {
        Item item = result.GetObject();
        if (item == null)
        {
            args.Result.AddResultToCategory(GetMostSuitableResult(result, args.ContentLanguage), Translate.Text("Other"));
        }
        else if (categorizer != null)
        {
            args.Result.AddResultToCategory(GetMostSuitableResult(result, args.ContentLanguage), categorizer.GetCategory(item));
        }
    }
}

Nun kommt der Teil, in dem die Methode GetMostSuitableResult implementiert wird. Auch diese ist der ursprünglichen ziemlich ähnlich. Der einzige Unterschied besteht darin, dass die neuste Version des Items zu einem SearchResult umgewandelt wird (Zeilen 10-11 und 21-22).

private SearchResult GetMostSuitableResult(SearchResult result, Language language)
{
    Assert.ArgumentNotNull(result, "result");
    if (language != null)
    {
        Item item = result.GetObject();
        if ((item != null) && (item.Language == language))
        {
            // get latest version
            item = item.Versions.GetLatestVersion(language);
            SearchResult newResult = SearchResult.FromItem(item);
            return newResult;
        }
        foreach (SearchResult result2 in result.Subresults)
        {
            SearchResult mostSuitableResult = GetMostSuitableResult(result2, language);
            Item item2 = mostSuitableResult.GetObject();
            if ((item2 != null) && (item2.Language == language))
            {
                // get latest version
                item2 = item2.Versions.GetLatestVersion(language);
                SearchResult newResult = SearchResult.FromItem(item2);
                return newResult;
            }
        }
    }
    return result;
}

Nun gilt es nur noch den Prozessor im Web.config auszuwechseln und schon kommen in der Desktop-Suche immer die neuesten Item-Versionen.

Categories  Best Practice Tags  Desktop-search  Code  Pipeline  Beispiel

No comments

Add your comment

Your email address will not be published. Required fields are marked *

*