Wenn man Websitespalten einsetzen möchte, welche vom Typ Managed Metadata sind und mehrere Werte zulassen, bekommt man standardmässig in SharePoint 2013 ein Problem mit den Einschränkungen (Refinements) in der SharePoint Suche. Mit dieser Anleitung können Sie die Refinements entsprechend anpassen.
Problem:
In unserem Beispiel ist eine Spalte „Sprache“ definiert vom Typ Managed Metadata. Die Spalte Sprache kann die Werte DE, FR oder IT annehmen und lässt mehrere Werte zu.
Wir laden also Dokumente nach SharePoint, welche als Dokumenteneigenschaft eine oder mehrere Sprache zugeteilt bekommen, wie in diesem Beispiel Deutsch DE und Französisch FR.
Wird das Dokument von SharePoint indexiert und wir suchen dieses über die zentrale Suche, erscheinen im Refinement-Panel bei Sprache auf der linken Seite nicht die einzelnen Refinements DE, FR und IT wie erwartet, sondern es erscheinen die Werte mit mehreren Attributen.
Wie man auf dem Bild erkennen kann, ergeben sich so neue Refinements für jede Kombination von Werten in der Spalte Sprache.
Lösung:
Mittels eines neuen Display Templates „Filter_Contains_MultiValue.html“ kann man dieses Refinement anpassen.
Hinweis: Das Display Template kann auf Anfrage bei uns bezogen oder mit Code (zu finden am Ende dieses Beitrages) generiert werden.
Dazu müssen nachfolgende Schritte ausgeführt werden.
1) Display Template in die Gestaltungsvorlage hochladen unter Display Templates – Filter.
2) Hier kann das neue Display Template hochgeladen werden.
3) Anschliessend kann die Suchresultatseite geöffnet werden, in der das Refinement angewendet wird. Das Refinement „Sprache“ selektieren und bei „Anzeigevorlage“ das neue Display Template „contains Multi-value Refinement items“ anwählen.
4) Anschliessend die Refinement Konfiguration speichern und die Suchresultatseite wieder einchecken und veröffentlichen.
5) Abschliessend können die Refinements für Sprache einzeln verwendet werden und die Suchresultate werden korrekt gefiltert.
Code für das Display Template:
<html xmlns_mso="urn:schemas-microsoft-com:office:office" xmlns_msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
<head>
<title>Contains Multi-value Refinement Item</title>
<!--[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:CompatibleManagedProperties msdt_dt="string"></mso:CompatibleManagedProperties>
<mso:TemplateHidden msdt_dt="string">0</mso:TemplateHidden>
<mso:CompatibleSearchDataTypes msdt_dt="string"></mso:CompatibleSearchDataTypes>
<mso:MasterPageDescription msdt_dt="string"></mso:MasterPageDescription>
<mso:ContentTypeId msdt_dt="string">0x0101002039C03B61C64EC4A04F5361F385106604</mso:ContentTypeId>
<mso:TargetControlType msdt_dt="string">;#Refinement;#</mso:TargetControlType>
<mso:HtmlDesignAssociated msdt_dt="string">1</mso:HtmlDesignAssociated>
</mso:CustomDocumentProperties></xml><![endif]-->
</head>
<body>
<script>
$includeScript("", "~sitecollection/_catalogs/masterpage/Display Templates/Filters/Filter_MultiValue_Body.js");
</script>
<div id="Filter_Contains_MultiValue">
<!--#_
var Options = {
ShowCounts: false
};
var listData = ctx.ListData;
var hasControl = !$isNull(ctx.RefinementControl) && !$isNull(ctx.ClientControl);
if(hasControl) {
var hasNoListData = ($isEmptyArray(listData));
var delimiter = 'nn';
var propertyName = ctx.RefinementControl.propertyName;
var displayTitle = Srch.Refinement.getRefinementTitle(ctx.RefinementControl);
var isExpanded = Srch.Refinement.getExpanded(ctx.RefinementControl.propertyName);
var useContains = true;
var useKQL = false;
var refiners = [];
var currentRefinementCategory = ctx.ClientControl.getCurrentRefinementCategory(ctx.RefinementControl.propertyName);
var hasAnyFilterTokens = (!$isNull(currentRefinementCategory) && currentRefinementCategory.get_tokenCount() > 0);
var renderEmptyContainer = hasControl && (hasNoListData && !hasAnyFilterTokens);
if(!renderEmptyContainer) {
var listDataTokenToDisplayMap = {};
var listDataTokenToCountMap = {};
if(!hasNoListData) {
for (var i = 0; i < listData.length; i++) {
var filter = listData[i];
if(!$isNull(filter)) {
var originalRefinementName = filter.RefinementName.split(delimiter);
for (var j = 0; j < originalRefinementName.length; j++){
var refinementToken = (originalRefinementName[j].indexOf('') > -1) ? originalRefinementName[j] : '"' + originalRefinementName[j] + '"';
if (typeof listDataTokenToDisplayMap[refinementToken] == 'undefined') {
listDataTokenToDisplayMap[refinementToken] = originalRefinementName[j];
listDataTokenToCountMap[refinementToken] = filter.RefinementCount;
if(!hasAnyFilterTokens && !$isEmptyString(originalRefinementName[j]) && !$isEmptyString(refinementToken)) {
refiners.push(
{
RefinementName: originalRefinementName[j],
RefinementToken: refinementToken,
RefinementCount: filter.RefinementCount,
IsSelected: false
});
}
}
}
}
}
}
if(hasAnyFilterTokens) {
for(var j = 0; j < currentRefinementCategory.get_tokenCount(); j++) {
var token = currentRefinementCategory.t[j];
var displayValue = listDataTokenToDisplayMap[token];
if($isEmptyString(displayValue) && !$isNull(currentRefinementCategory.m)) {
displayValue = currentRefinementCategory.m[token];
}
if(!$isEmptyString(displayValue) && !$isEmptyString(token))
{
refiners.push(
{
RefinementName: displayValue,
RefinementToken: token,
RefinementCount: !$isNull(listDataTokenToCountMap[token]) ? listDataTokenToCountMap[token] : 0,
IsSelected: true
});
}
}
}
}
ctx["DisplayTemplateData"]["BodyTemplateId"] = "~sitecollection/_catalogs/masterpage/Display Templates/Filters/Filter_MultiValue_Body.js";
ctx.RefinementControl["csr_propertyName"] = propertyName;
ctx.RefinementControl["csr_displayTitle"] = displayTitle;
ctx.RefinementControl["csr_filters"] = refiners;
ctx.RefinementControl["csr_isExpanded"] = isExpanded;
ctx.RefinementControl["csr_renderEmptyContainer"] = renderEmptyContainer;
ctx.RefinementControl["csr_useContains"] = useContains;
ctx.RefinementControl["csr_useKQL"] = useKQL;
ctx.RefinementControl["csr_showCounts"] = Options.ShowCounts;
_#-->
_#= ctx.RenderBody(ctx) =#_
<!--#_
}
_#-->
</div>
</body>
</html>
Beitrag teilen