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:

[sourcecode language=’xml’]








[/sourcecode]

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:

[sourcecode language=’csharp’]

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();
}

[/sourcecode]

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.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.