Blijkbaar valt het nog niet mee om vanuit code & xml een content type te provisionen dat een managed metadata veld bevat.  Aan de hand van een blogpost van Wictor Wilen en zelf wat puzzelwerk, is het toch gelukt.

Ik start met de volgende termstore:

Ik maak eerst even in Visual Studio, een nieuw empty SharePoint aan. Omdat we straks met managed metadata gaan werken hebben we een reference nodig naar Microsoft.SharePoint.Taxonomy. Ik voeg een  content type toe, dat erft van het item content type. De elements.xml zou er dan zo uit moeten zien:


<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<!-- Parent ContentType: Item (0x01) -->
<ContentType ID="0x0100dc4464e0afb04cf2af84fb67fb80cf7c"
Name="SPCNL Content Type"
Group="SPCNL Content types"
Description="SPCNL Content Type met managed metadata"
Inherits="TRUE"
Version="0">
<FieldRefs>
</FieldRefs>
</ContentType>
</Elements>

Er wordt nadat je dat hebt gedaan, automatisch een feature voor je aangemaakt met als scope Web. Omdat we een content type op site collectie niveau willen definiëren verander je die naar Site.

Op dit moment wordt er een leeg content type aangemaakt op de site collectie. Nu moet er nog een managed metadata veld aan gekoppeld worden. Dit kan in de event reciever van de feature. (rechtermuisklik op de feature -> add event reciever)

Maak gebruik van het event FeatureActivated, en gebruik de volgende code:


public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPSite site = properties.Feature.Parent as SPSite;
SPWeb web = site.RootWeb;
TaxonomySession session = new TaxonomySession(site);
TermStore termStore = session.TermStores["Metadata Service Application Proxy"];
Group group = termStore.Groups["Algemene termen"];
TermSet termSet = group.TermSets["Landen"];

TaxonomyField field =
web.Fields.CreateNewField("TaxonomyFieldType", "Land") as TaxonomyField;
field.SspId = termStore.Id;
field.TermSetId = termSet.Id;
field.TargetTemplate = string.Empty;
field.AllowMultipleValues = false;
//field.Update();
web.Fields.Add(field);
web.Update();

SPField land = web.AvailableFields["Land"];
SPContentType myContentType;
SPContentTypeId myContentTypeId =
new SPContentTypeId("0x0100dc4464e0afb04cf2af84fb67fb80cf7c");
myContentType = web.ContentTypes[myContentTypeId];
SPFieldLink myFieldLink = new SPFieldLink(land);
myContentType.FieldLinks.Add(myFieldLink);
myContentType.Update();
}

In deze code gebeuren drie belangrijke dingen. Eerst wordt er een refentie gemaakt naar de Landen termset. In het tweede blok wordt er een sitekolom aangemaakt van het type TaxonomyField. En in het laatste stuk wordt het content type opgehaald (dat net door de feature is aan gemaakt) en die sitekolom daar aan toegevoegd. In het onderstaande figuur zie je het resultaat:

Let op, valkuil:
field.Update() zorgt ervoor dat alle properties van het object null worden en daarom moet deze niet uitvoerd worden. Ook om precies die reden wordt in het derde deel het SPField “land” opnieuw opgehaald.


avatar

Dit artikel is geschreven door: Melvin Vermeer

Mijn naam is Melvin Vermeer en ik werk als SharePoint Developer bij Wortell.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*