Der Managed Metadata Service (ab SharePoint 2010) bietet mit der Bereitstellung und Verwaltung einer unternehmensweiten Taxonomie auf jeden Fall eine sehr nützliche Funktion und in vielen Fällen einen eindeutigen Mehrwert. Die zentrale Verwaltung von Begriffen und Namen erleichtert z.B. die Umsetzung von vordefinierten Auswahlen, Namenskonventionen und Sucherweiterungen und macht die Begriffe im System zusätzlich eindeutig identifizierbar. Auch moderne Anwendungsfelder wie die Markierung von Inhalten mit Schlüsselworten (“Tagging”) können über den Managed Metadata Service abgebildet werden.
Verwendung von Taxonomie-Feldern in Custom Solutions
Allerdings gibt es bei der Verwendung von Taxonomie-Feldern in benutzerdefinierten Elementen wie Content-Types und Listendefinitionen, welche über Custom Solutions definiert und deployed werden, auch einige Fallstricke zu beachten!
Die Taxonomie-Felder werden konkret dazu benötigt die im Managed Metadata Service verwalteten Begriffe für die Benutzer unter SharePoint z.B. in Listen zugänglich zu machen. Sie werden dabei ähnlich wie andere Standardfelder aus SharePoint in einem Element einer Custom Solution definiert:
<Field Name="CustomTaxonomyField" DisplayName="Custom Taxonomy Field" ID="{ADD461AE-F00F-434D-B78D-17FC373A2A45}" Type="TaxonomyFieldType" ShowField="Term1033" > <Customization> <ArrayOfProperty> <Property> <Name>TextField</Name> <Value xmlns:q6="http://www.w3.org/2001/XMLSchema" p4:type="q6:string" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">{C050BBDA-AFE4-42E5-B514-A4E924D5FCCA}</Value> </Property> </ArrayOfProperty> </Customization> </Field>
Wichtig zu beachten ist hierbei:
- Type=”TaxonomyFieldType”
- Feldtyp für Taxonomiefelder mit Einfachauswahl
- ShowField=”Term1033″
- Verknüpft das Taxonomiefeld mit der Standardsprache des Systems (in diesem Fall Englisch durch den Language-Code 1033)
- <Customization>-Element und “TextField”-Property
- Definiert das zum Taxonomiefeld zugehörige versteckte Note-Feld
Zu jedem Taxonomiefeld muss ein zugehöriges Feld vom Typ “Note” (Notiz) erstellt werden welches anhand des “TextField”-Properties des Taxonomiefeldes mit diesem verknüpft ist. Das Notizfeld wird intern für die Verwaltung und Speicherung der Begriffe pro Feld verwendet.
<Field Name="CustomTaxonomyFieldTaxHTField0" DisplayName="CustomTaxonomyField_0" ID="{C050BBDA-AFE4-42E5-B514-A4E924D5FCCA}" Type="Note" ShowInViewForms="FALSE" Required="FALSE" Hidden="TRUE" CanToggleHidden="TRUE" RowOrdinal="0" />
Die so definierten Felder können dann wie gewöhnlich z.B. in einem Content-Type verwendet werden:
<ContentType ID="0x0100c715556c5e5345138073e77af846940a" Name="Custom Content-Type" Inherits="TRUE" Version="0"> <FieldRefs> <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="TRUE" /> <FieldRef ID="{ADD461AE-F00F-434D-B78D-17FC373A2A45}" Name="CustomTaxonomyField" /> <FieldRef ID="{C050BBDA-AFE4-42E5-B514-A4E924D5FCCA}" Name="CustomTaxonomyFieldTaxHTField0" /> </FieldRefs> </ContentType>
Verknüpfung von Taxonomiefeldern und Termsets
Sämtliche Begriffe und Schlüsselwörter im Managed Metadata Service werden innerhalb von Termgruppen und Termsets angelegt und verwaltet. Ein Taxonomiefeld kann sich dabei immer nur auf ein Termset beziehen, was konkret bedeutet das nur Begriffe die innerhalb eines Termsets definiert sind pro Taxonomiefeld zur Auswahl stehen. Und dementsprechend muss ein Taxonomiefeld auch erst mit einem Termset verknüpft werden bevor es richtig verwendet werden kann, das ist allerdings nur über Code und die Verwendung der SharePoint-API möglich. Dieser Code muss bei Aktivierung des Features ausgeführt werden welches die Taxonomiefelder definiert:
public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPSite site = properties.Feature.Parent as SPSite; if (site == null) return; string termGroupName = "My Term-Group"; string termSetName = " My Term-Set"; Guid termFieldId = new Guid("{ADD461AE-F00F-434D-B78D-17FC373A2A45}"); // get site-specific default term store TaxonomySession session = new TaxonomySession(site); TermStore termStore = session.DefaultKeywordsTermStore; if (termStore == null) throw new Exception(string.Format("DefaultKeywordsTermStore not found in site {0}", site.Url)); // get site-specific term group Group group = termStore.Groups.FirstOrDefault(tg => tg.Name.Equals(termGroupName)); if (group == null) throw new ArgumentOutOfRangeException("A Term Group with the name '" + termGroupName + " does not exist."); // get term set TermSet termSet = group.TermSets.FirstOrDefault(ts => ts.Name.Equals(termSetName)); if (termSet == null) throw new ArgumentOutOfRangeException("A Term Set with name '" + termSetName + "' does not exist in Term Group '" + termGroupName + "'."); // get taxonomy field object TaxonomyField field = site.RootWeb.Fields[termFieldId] as TaxonomyField; // connect the field to the specified term set field.SspId = termSet.TermStore.Id; field.TermSetId = termSet.Id; field.TargetTemplate = string.Empty; // no target page for term links field.AnchorId = Guid.Empty; // no parent term = user can select any term in set field.Update(); }
Es ist immens wichtig das der Code zur Verknüpfung VOR dem Deployment von Listendefinitionen und deren –instanzen geschieht welche die Taxonomiefelder verwenden, d.h. die Felddefinitionen (samt Content-Types) und Code zur Verknüpfung befinden sich im Idealfall in einem eigenen Feature welches primär und vor anderen Features aktiviert wird. Ansonsten kommt es bei der Erstellung der Listen zu Fehlern falls die referenzierten Felder noch mit Termsets verknüpft sind.
Taxonomiefelder in Listdefinitionen
Wenn Taxonomiefelder in benutzerdefinierten Listendefinitionen verwendet werden sollen gibt es grundsätzlich zwei Dinge zu beachten:
- Es muss ein spezieller Listen-Event-Receiver für die Listen registriert werden (dieser dient zur Synchronisation von Taxonomiedaten der Felder)
- Je nach “Einsatzort” der Listendefinition, also Root-Web einer Site-Collection oder Subweb, müssen die Taxonomiefelder im Schema der Liste unterschiedlich definiert werden
Das Feature-Element für die Registrierung des Listen-Event-Receiver sieht folgendermaßen aus (die ListTemplateId muss natürlich angepasst werden):
<Receivers ListTemplateId="10001"> <!-- ProjectList --> <Receiver> <Name>TaxonomyItemSynchronousAddedEventReceiver</Name> <Type>ItemAdding</Type> <Assembly>Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly> <Class>Microsoft.SharePoint.Taxonomy.TaxonomyItemEventReceiver</Class> <SequenceNumber>10000</SequenceNumber> </Receiver> <Receiver> <Type>ItemUpdating</Type> <Name>TaxonomyItemUpdatingEventReceiver</Name> <Assembly>Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly> <Class>Microsoft.SharePoint.Taxonomy.TaxonomyItemEventReceiver</Class> <SequenceNumber>10000</SequenceNumber> </Receiver> </Receivers>
Dieser Event-Receiver wird für alle Listendefinitionen welche Taxonomiefelder verwenden benötigt!
Soll die Liste in einem Subweb instanziert werden müssen zur eigentlichen Felddefinition im Listenschema noch zwei zusätzliche Argumente zum XML-Element hinzugefügt werden:
<Field Name="AS_M03" DisplayName="$Resources:Column_M03;" Group="$Resources:ColumnsGroup_Project_Name;" ID="{A77A8AC1-7948-4DB9-B33C-6F708CF039FA}" Type="TaxonomyFieldType" ShowField="Term1033" WebId="00000000-0000-0000-0000-000000000000" List="Lists/TaxonomyHiddenList">
Durch diese Maßnahme funktioniert die Listendefinition nun zwar einwandfrei für Subwebs, allerdings führt diese Änderung nun zu Fehlern in einem Root-Web!
Das heißt man muss sich bei Erstellen einer Listendefinition mit Taxonomiefeldern im Vorfeld überlegen wo die Liste eingesetzt werden soll und im ungünstigsten Fall müssen zwei gleichartige Listendefinitionen für jeweils Root- und Subwebs bereitgestellt werden.
Erweiterte Konfiguration von Taxonomiefeldern
Die Taxonomiefelder unter SharePoint können natürlich noch mehr als das Auswählen eines einzelnen Begriffes aus einem vordefinierten Set. Weitere Funktionen wie Mehrfachauswahl und das Anlegen neuer Begriffe durch Benutzer über das Taxonomiefeld müssen mit einer erweiterten Konfiguration des Taxonomiefeldes aktiviert werden.
Mehrfachauswahl in einem Taxonomiefeld
<Field Name="CustomTaxonomyFieldMulti" DisplayName="Custom Taxonomy Field" ID="{ADD461AE-F00F-434D-B78D-17FC373A2A45}" Type="TaxonomyFieldTypeMulti" Mult="TRUE" ShowField="Term1033" > <Customization> <ArrayOfProperty> <Property> <Name>TextField</Name> <Value xmlns:q6="http://www.w3.org/2001/XMLSchema" p4:type="q6:string" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">{C050BBDA-AFE4-42E5-B514-A4E924D5FCCA}</Value> </Property> </ArrayOfProperty> </Customization> </Field>
Das Attribut “Type” muss auf “TaxonomyFieldTypeMulti” angepasst und das Attribut “Mult=TRUE” hinzugefügt werden um die Mehrfachauswahl in einem Feld zuzulassen.
Hinzufügen von Begriffen durch Benutzer erlauben
Soll es Benutzern von SharePoint ermöglicht werden neue Begriffe und Schlüsselwörter in die Taxonomiefelder bzw. ihre verknüpften Termsets einzutragen muss das Customization-Element der Felddefinition erweitert werden:
<Field ID="{3424A369-02B4-4646-AA5A-74EA8662BF2C}" Type="TaxonomyFieldTypeMulti" ShowField="Term1033" Mult="TRUE" DisplayName="Custom Taxonomy Field Open" StaticName="CustomTaxonomy FieldOpen"> <Customization> <ArrayOfProperty> <Property> <Name>Open</Name> <Value xmlns:q5="http://www.w3.org/2001/XMLSchema" p4:type="q5:boolean" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">true</Value> </Property> <Property> <Name>TextField</Name> <Value xmlns:q6="http://www.w3.org/2001/XMLSchema" p4:type="q6:string" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">{D0093511-4B17-403B-99BB-B7C2F3C04965}</Value> </Property> </ArrayOfProperty> </Customization> </Field>
Das Property mit dem Namen “Open” und dem Wert “true” sorgt dafür das Benutzer selbst Begriffe hinzufügen können, dazu muss aber auch das entsprechende Termset noch konfiguriert werden:
Tags / Schlüsselwörter in Taxonomiefelder verwenden
Um Tags bzw. Schlüsselwörter in einem Taxonomiefeld verwenden zu können muss wie schon dargestellt wieder das Customization-Element erweitert werden:
<Field ID="{3424A369-02B4-4646-AA5A-74EA8662BF2C}" Type="TaxonomyFieldTypeMulti" ShowField="Term1033" Mult="TRUE" DisplayName="Custom Taxonomy Field Keywords" Name="CustomTaxonomyFieldKeywords"> <Customization> <ArrayOfProperty> <Property> <Name>UserCreated</Name> <Value xmlns:q4="http://www.w3.org/2001/XMLSchema" p4:type="q4:boolean" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">true</Value> </Property> <Property> <Name>Open</Name> <Value xmlns:q5="http://www.w3.org/2001/XMLSchema" p4:type="q5:boolean" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">true</Value> </Property> <Property> <Name>TextField</Name> <Value xmlns:q6="http://www.w3.org/2001/XMLSchema" p4:type="q6:string" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">{D0093511-4B17-403B-99BB-B7C2F3C04965}</Value> </Property> </ArrayOfProperty> </Customization> </Field>
Das Property mit dem Namen “UserCreated” und dem Wert “true” sorgt dafür das Benutzer zusätzlich zu den eigentlichen Begriffen des Termsets auch schon vorhandene Schlüsselwörter (welche in sich einem speziellen System-Termset befinden) auswählen können, dazu muss aber auch der Managed Metadata Service noch entsprechend konfiguriert werden:
Im Properties-Dialog des Service Application Proxy des Managed Metadata Service müssen spezielle Optionen aktiviert werden um die Verwendung von Schlüsselwörtern über einen Managed Metadata Service zu aktivieren. Diese Optionen findet man in der Zentraladministration im Bereich “Manage Service Applications” und dort dann unter den Eigenschaften des Managed Metadata Service Application Proxy (!):
In Kombination mit dem “Open”-Property können Benutzer dann die Schlüsselwörter/Tags des Systems vollständig in allen Bereichen nutzen und das System auch selbst um neue Schlüsselwörter ergänzen.
Quellen:
http://office.microsoft.com/en-us/office365-sharepoint-online-enterprise-help/introduction-to-managed-metadata-HA101974326.aspx – Introduction to managed metadata
http://www.cmswire.com/cms/document-management/overview-sharepoint-2010-metadata-and-taxonomy-management-006015.php – Overview: SharePoint 2010 Metadata and Taxonomy Management