I forbindelse med at få omstruktureret Mariba.dk, skal jeg have
lavet en masse ny funktionalitet. Til visse visninger har jeg
valgt, at lave det via XSLT med mine egne custom made Umbraco XSLT
extensions.
Jeg vil her vise, hvordan man opsætter umbraco med sine egne
XSLT extensions.
I et Visual Studio projekt (.NET 3,5) laver jeg en klasse og
kalder den Cars. Klassen er meget simpel med tre attributter.
-
public class Car
-
{
-
public string Brand { get; set; }
-
public string TopSpeed { get; set; }
-
public string Color { get; set; }
-
}
Det er denne struktur, som jeg gerne vil have vist i en oversigt
i Umbraco. Jeg vil eks. gerne vise en komplet liste over alle
bilerne i eks. min database.
Extensions renderes via en XPathNodeIterator. Derfor skal jeg
have lavet en extensionmetode, der tager en liste bestående af alle
mine biler, oversætter den til XML og navigerer gennem denne med en
XPathNodeIterator.
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Web;
-
using System.Xml.XPath;
-
using System.Text;
-
using System.Xml.Serialization;
-
using System.Xml;
-
namespace Example.Extensions
-
{
-
public class ExampleExt
-
{
-
public static XPathNodeIterator GetCars()
-
{
-
List myCars = new List();
-
Car car1 = new Car();
-
car1.Brand = "Car 1";
-
car1.TopSpeed = "Slow";
-
car1.Color = "Red";
-
Car car2 = new Car();
-
car2.Brand = "Car 2";
-
car2.TopSpeed = "Fast";
-
car2.Color = "Green";
-
Car car3 = new Car();
-
car3.Brand = "Car 3";
-
car3.TopSpeed = "Very fast";
-
car3.Color = "Yellow";
-
myCars.Add(car1);
-
myCars.Add(car2);
-
myCars.Add(car3);
-
return GetXPathNodeIterator(myCars);
-
}
-
internal static XPathNodeIterator GetXPathNodeIterator(T t)
-
{
-
XmlSerializer reader = new XmlSerializer(typeof(T));
-
XmlDocument doc = new XmlDocument();
-
using (System.IO.StringWriter sw = new System.IO.StringWriter())
-
{
-
reader.Serialize(sw, t);
-
doc.LoadXml(sw.ToString());
-
}
-
return doc.CreateNavigator().Select(".");
-
}
-
}
-
}
Her laver jeg to metoder - en intern metode
(GetXPathNodeIterator<T>(T t)), der tager en Generic liste
som input parameter og returnerer en XPathNodeIterator baseret på
listen. Denne metode fodre jeg med en liste af Car-objekter i min
public metoder (GetCars()). Dette er denne public metode, som jeg
anvender i en XSLT fil i Umbraco.
Nu er min nye extension klar til at blive lagt over i Umbraco.
For at gøre dette, skal man tage assembly'en og lægge over i
umbraco's bin bibliotek.

Når dette er gjort, skal man registrere extension'en i Umbraco.
Dette gøres i "xsltExtensions.config", som findes i umbraco
bibliotektet under "config". I denne fil laver man en ny entry som
vist på nedenstående screen dump.

Når dette er gjort, er man klar til at anvende sin nye extension
i umbraco i en XSLT fil. Klik på knappen " insert
xsl:value-of".

Jeg ændre den indsatte "xsl:value-of" metode til en
"xsl:copy-of". Denne metode skriver hele det XML dokument, man får
fra sin extension, til skærmen. På denne måde kan jeg se, hvad de
forskellige elementer og attributter i XML dokumentet hedder, når
jeg senere skal referere til dem.
Klik "Get Extension".

Vælg dine nye metode.

Nu er vores nye extensionmetode sat ind i en XSLT fil. Så nu
skal XSLT filen læses fra en template via en macro.

Nu kan man se sit resultat i Umbraco.

Man kan så modellere sit data som man vil. Nedenfor er vist en
gennemgang af alle objekter af biler via en foreach-statement i
XSLT'en.

Og her er det endelige resultat, hvor alle objekterne bliver
skrevet ud til skærmen.

Metoden med at lave sin egen extension til rendering af data fra
sin back-end, synes jeg især har sine styrker i forbindelse med
visninger uden særlig brugerinteraktion. Derimod finder jeg det
nemmere at implementere en ASP.NET UserControl og importere den i
Umbraco, hvis man har brugerinteraktion.