20 februari 2015

Display Templates - Tips & Tricks

In mijn vorige blogpost heb ik al een introductie geschreven over Display Templates. Deze blogpost is meer een verzameling van kleine dingetjes waar ik tegenaan ben gelopen tijdens het werken met de Display Templates.

Soorten Display Templates

Er zijn verschillende soorten display templates en voor iedere soort zijn er al standaard een aantal verschillende aangemaakt in SharePoint. Het loont dus de moeite om eerst even te checken of er niet al een geschikt template bestaat voor wat je wilt bereiken (Zelf heb ik altijd wel wat te zeuren, dus ik maak toch wel weer eigen templates ☺). Als je ook maar iets afwijkt van de standaard, wijzig dan niet het standaard Template, maar kopieer hem en maak een nieuwe aan.

Je vindt hier een overzicht van soorten en standaard Display Templates.

Managed Properties

Managed Properties zijn de SharePoint velden die je uit kan lezen in de Display Templates. Deze zijn er in alle soorten en maten en daarmee zijn er allerlei verschillende methoden om ze weer te geven. Daarover later in deze blogpost meer.

Er zijn in SharePoint veel meer properties dan alleen de Managed properties, deze heten Crawled Properties. Je kunt die echter niet direct uitlezen in een Display Template. Je moet ze eerst mappen naar een (bestaande of zelf aangemaakte) Managed Property. Hoe je dat doet lees je hier.

Omdat ik in SharePoint Online werk en dus geen Central Admin heb, hier nog even de link naar de Managed Properties lijst:
https://[JouwDomein].sharepoint.com/_layouts/15/listmanagedproperties.aspx?level=sitecol

Managed Properties uitlezen

In de <head> sectie van het Item Display Template Staat een tag <mso:ManagedPropertyMapping msdt:dt="string">. In deze tag moet je de Managed Properties definiëren die je uit wilt lezen. Dit ziet er ongeveer zo uit:
<mso:ManagedPropertyMapping msdt:dt="string">'Link URL'{Link URL}:'Path','Line 1 code'{Line 1}:'Title','Line 2 code'{Line 2}:'Description'</mso:ManagedPropertyMapping>

De definitie van een Managed Property is als volgt:
'Property Display Name'{Property Name}:'Managed Property Name'

  1. Property Display Name is volgens Microsoft de naam van de Property die te zien is in het Web Part bewerkingsmenu wanneer het Display Template is geselecteerd. Persoonlijk snap ik niet wat ze hiermee bedoelen. Ik zie het nergens terug. Als iemand hier meer van weet, hoor ik het heel graag!
    Voor zover ik weet is dit de waarde waarmee je de property aanroept in het script in je Display Template.
  2. Property Name is een identifier die gekoppeld is aan de Managed Property. Deze is zichtbaar als veld in het Web Part bewerkingsmenu onder 'Property Mappings'. Hier kan je ook een andere Manged Property aan datzelfde veld koppelen (dat zie je overigens niet terug in het Display Template, daarin stel je alleen de default waarde in).

    Deze Property Name is dus alleen van waarde als het Web Part de bewerkingsoptie 'Property Mappings' bevat. Is dat niet zo, dan kan je dit ook weglaten en de syntax als volgt gebruiken:
    'Property Display Name':'Managed Property Name'
  3. Managed Property Name is de werkelijke Managed Property, zoals het SharePoint systeem hem herkend. Het kunnen één of meer Managed Properties zijn, gescheiden door een puntkomma (;). Tijdens runtime wordt de lijst (die dus één of meerdere items kan bevatten) van links naar rechts uitgelezen en het eerste item dat een waarde van een Managed Property ophaalt, wordt toegepast.

Nadat je een Managed Property hebt gemapped, kan je het uitlezen door in de <body> van het Display Template een variabele (javascript) aan te maken:
<!--#_
var title = $getItemValue(ctx, "Line 1 code");
_#-->
Ik heb hier even deels de standaard TwoLine Item Display Template van SharePoint gekopieerd (en een beetje aangepast), omdat hierin het verschil goed duidelijk is.

Om de waarde van de Managed Property vervolgens weer te geven in je HTML, roep je de variabele aan op deze manier:
_#= variabele =#_
In het geval van Tekst waarden is het verstandig om de volgende syntax aan te houden:
_#= $htmlEncode(variabele) =#_
De htmlEncode zorgt ervoor dat alle special tekens die een script kunnen laten klappen, gecodeerd worden. Zo wordt een quote (') bijvoorbeeld omgezet naar &#39;.

Neem een kijkje in de standaard Display Templates van SharePoint om te zien wat er allemaal mogelijk is. Ook op deze website staat een hoop waardevolle informatie over scripten in Display Templates.

Afbeeldingen weergeven

De Managed Properties van afbeeldingen en iconen bestaan eigenlijk gewoon uit tekst, namelijk een url. Om dit om te zetten naar een afbeelding moet je de Managed Property dus aanroepen in de src van een <img> tag. De syntax zou er zo uit kunnen zien:
<img src="_#= variabele =#_" alt="" />
Er zit wel een valkuil in: SharePoint vindt urls die zijn onderbroken met een spatie niet zo leuk… Normaal worden die spaties opgevuld met een %20, maar hier dus niet. Zorg er dus voor dat je de Picture Library waar je de afbeeldingen uit wilt halen, GEEN spaties in de naam bevatten, of knutsel wat met JavaScript om de spatie te vervangen voor een %20 (geen idee hoe, niet geprobeerd).

Datums weergeven

Dit is ook een leuke, want je hebt hierin de vrijheid om het door jou gewenst format te gebruiken. Dit zou er bijvoorbeeld zo uit kunnen zien: _#= variabele.format("d MMMM yyyy") =#_ Maar je kan de datum ook splitsen. Zo heb ik bijvoorbeeld eens een gekleurd vakje gemaakt, met de datum daarin opgeknipt in twee stukken. Zo staan de dag en maand onder elkaar ipv naast elkaar: <div class="date-formats">
<span>_#= variabele.format("d") =#_</span> <!-- dag in cijfers -->
<small>_#= variabele.format("MMMM") =#_</small> <!-- maand in woorden -->
</div>

Een overzicht van alle beschikbare formats vind je hier.

File Type Icon uitlezen

Een gevalletje apart, want dit werkt, in ieder geval bij Search Result Display Templates, niet zoals je zou verwachten (mij een raadsel waarom niet, maar het is zo). Het file type icon is het icoontje dat je in bijvoorbeeld document libraries ziet staan als eerste kolom van ieder document. Het kan bijvoorbeeld een MS Word-icoontje zijn, of Excel, PDF, etc.

Om het toch voor elkaar te krijgen, stelen we hem gewoon even van een ContentBySearch Display Template. Dat doe je zo:

  1. In de Control Display Template voeg je het volgende script in: <script>
    $includeScript(this.url, "/_layouts/15/search.cbs.js");
    </script>
  2. In het Item Display Template voeg je de volgende regel code toe: var iconUrl = Srch.ContentBySearch.getIconSourceFromItem(ctx.CurrentItem);
  3. Roep de variabele aan in een <img> tag: <img src="_#= $urlHtmlEncodeString(iconURL) =#_" />

En klaar is Kees! Ik heb hierbij overigens geen styling meegenomen, dus het kan zijn dat je dat nog moet fixen. Binnenkort post ik een gedetailleerde tutorial over het maken van een 'Mijn Documenten' Display Template, waarin ik ook het file type icon meeneem.

Dit was het weer even voor nu, hopelijk heb je er wat aan ☺

Prefer to read this in English?

SharePoint 2013 - Display Templates

Display Templates zijn op zichzelf staande bestanden waarin Managed Properties (SharePoint velden, zoals Title, Description, etc) worden uitgelezen en HTML, CSS en JavaScript kan worden verwerkt. Deze bestandjes worden vervolgens gerenderd in een of meerdere pagina's van je SharePoint site. Je gebruikt ze om de weergave van Web Parts te bepalen. Ze bestaan uit twee HTML-bestanden en bij ieder van deze bestanden wordt automatisch een JS-bestand gegenereerd en gekoppeld. Met deze JS-bestanden doe je zelf niets, dat gaat allemaal automatisch.

Het eerste HTML bestand is de Control Display Template en de tweede is het Item Display Template. De Control Display Template bepaalt de algemene structuur van hoe de resultaten worden gepresenteerd in het Web Part (zoals lijsten, lijsten met paginering, sliders, etc). Bijvoorbeeld een <ul> waar je <li>'s in wilt gaan renderen. Daarnaast wordt het gebruikt om JavaScript en CSS bestanden in te laden.

Het Item Display Template bepaalt hoe elk resultaat in de set wordt weergegeven (zoals lijst items, afbeeldingen, tekst, etc). Dat zou dan dus een <li> (inc inhoud) zijn als we het bovenstaande voorbeeld aanhouden. Één <li>? Ja, het is een template, dus er gaat straks een lus doorheen die steeds diezelfde <li> gebruikt om het geheel op te bouwen. De Web Part instellingen bepalen hoeveel items dat zijn, Display Templates gaan daar niet over.

De reden dat er twee losse (Control en Item) bestanden zijn in plaats van alles in één, is dat je Control- en Item templates willekeurig kan combineren. Het zijn dus niet persé vaste setjes. Het kan heel goed zijn dat je voor dezelfde Control Display Template, meerdere Item Display Templates maakt, die bijvoorbeeld weer steeds andere SharePoint velden (Managed Properties) aanroepen, maar wel dezelfde JS/CSS en (container)markup gebruiken.

Leuk verhaal, maar hoe werkt dit nou in de praktijk?
Laten we beginnen bij het begin. Omdat ik zelf gebruik heb gemaakt van een SharePoint Online omgeving (waar je dus niet wilt deployen vanuit Visual Studio), ga ik daar in deze blogpost ook even vanuit. We gaan zodoende gebruik maken van de SharePoint Design Manager en Notepad++.

Persoonlijk vind ik de 'Search Results' methode het makkelijkst werken. Dat is slechts één en hetzelfde Web Part (namelijk het Search Results Web Part), waar je letterlijk en figuurlijk alle kanten mee op kan. Je plaatst dan dus voor ieder Web Part dat je wilt hebben op je pagina, een Search Results Web Part met een eigen query en laat de Display Templates bepalen hoe en wat er zichtbaar is. Zo kan hetzelfde Web Part er telkens compleet anders uitzien en andere data weergeven.
Nou moet ik toegeven dat ik nog niet van alle soorten Display Templates heb bekeken hoe en waar ze worden toegepast en of er in sommige gevallen dus betere alternatieven zijn dan Search Results. Wat ik wel zeker weet is dat Search Results in ieder geval goed werkt voor wat ik wilde bereiken.

Start

Je vindt de Search Results Display Templates hier:
https://[JouwDomein].sharepoint.com/_catalogs/masterpage/Display%20Templates/Search/

Dit gaat op SiteCollection niveau, dus als je een onderliggende SiteCollection hebt, zou het pad er zo uitzien:
https://[JouwDomein].sharepoint.com/sites/[JouwSiteCollection]/_catalogs/masterpage/Display%20Templates/Search/

Map Network Drive

Het werkt t makkelijkst om de Masterpage Gallery te mappen naar je computer, zodat je deze vanuit de verkenner kan openen. Lees hier hoe.
Let op dat: Je IE moet gebruiken, je bij het inloggen het 'ingelogd blijven' vinkje AAN moet zetten, je SharePoint domein/site aan je trusted sites toe moet voegen en je een willekeurige library moet openen dmv de 'Open in Explorer' optie in de ribbon (alleen mogelijk met IE). Na die stappen zou je moeten kunnen mappen. Zo lang als dat je ingelogd bent op de site, kan je via de verkenner de MP Gallery benaderen. Log je uit, dan kan je er niet meer bij. In de MP Gallery navigeer je naar Display Templates -> Search voor de juiste locatie.

Starter Display Templates

Via de links hieronder kan je 'kale' Starter Templates downloaden om mee te beginnen. De Control bevat een heading en een container voor de items, de Item Template toont de Title en Description.


Inderdaad, de JS files ontbreken. Klopt, die maakte SharePoint namelijk zelf aan, als je bovenstaande bestanden upload naar de Display Template Gallery. Je moet dit dan wel via de SharePoint user interface doen (dus via de browser).

Hoe nu verder?

Omdat het een heeeeel erg lange lap tekst wordt als ik de verschillende uitwerkingen allemaal in deze blogpost ga beschrijven, heb ik losse blogposts gemaakt voor een aantal individuele uitwerkingen:

Dan heb ik nog een blogpost met tips & tricks. Natuurlijk ben ik zelf tegen issues aangelopen waarmee ik heb geworsteld om het op te lossen. Om jullie dit leed te besparen staan in deze blogpost de oplossingen van deze issues en best practices om problemen te voorkomen.

Wat ook heel interessant is, is deze pagina. Je leest hier uitgebreid over het hoe en waarom en de opbouw van Display Templates.

Want to read this in English?