Erstellen von Inhaltstypen
Letzte Änderung: Montag, 1. November 2010
Gilt für: SharePoint Foundation 2010
Inhalt dieses Artikels
Inhaltstypvererbung
Entwerfen von Inhaltstypen
Erstellen eines Inhaltstyps mithilfe von deklarativem XML-Code
Erstellen eines Inhaltstyps mithilfe von Code
Verfügbar in SharePoint Online
Als Entwickler erstellen Sie einen Inhaltstyp durch Schreiben von deklarativem XML-Code oder ggf. Servercode. Dies ist eine Aufgabe, die in der Regel beim Erstellen eines Features anfällt, das von einer anderen Person installiert und wiederum von einer anderen Person aktiviert wird. Deshalb erstellen Sie im Grunde keinen Inhaltstyp, sondern definieren ihn.
Nachdem das Feature installiert wurde, wird es von jemandem aktiviert. Microsoft SharePoint Foundation führt Ihren Code aus oder liest Ihren deklarativen XML-Code und stellt den Inhaltstyp zur Verfügung. Ein Benutzer mit Administratorrechten und der Berechtigung zum Verwalten von Listen ordnet den neuen Inhaltstyp einer Liste oder Dokumentbibliothek zu, woraufhin er zur Verfügung steht. Benutzer, die der Liste Elemente hinzufügen dürfen, können mithilfe dieses Inhaltstyps Inhalte erstellen. Benutzer mit Administratorrechten können den Inhaltstyp an ihre Anforderungen anpassen, Spalten hinzufügen oder entfernen und andere Attribute ändern, wofür Sie nun nicht mehr verantwortlich sind.
Der Kernpunkt ist, dass das "Erstellen" eines Inhaltstyps eigentlich dessen Definition bedeutet. Eine gute Inhaltstypdefinition antizipiert, wie der Inhaltstyp letztlich verwendet wird.
Inhaltstypvererbung
Inhaltstypen werden nicht von Grund auf neu erstellt. Stattdessen wählen Sie stets einen vorhandenen Inhaltstyp als Basis für alle neuen Inhaltstypen, die Sie erstellen. Genau diese Aufgabe erledigt Microsoft SharePoint Foundation für seine vordefinierten Inhaltstypen. Informationen zur Hierarchie der Inhaltstypen, die mit SharePoint Foundation bereitgestellt werden, finden Sie unter Hierarchie der Basisinhaltstypen.
Die Website, auf der ein neuer Inhaltstyp erstellt wird, muss sich im Gültigkeitsbereich des Inhaltstyps befinden, von dem dieser abgeleitet ist. Dies sollten Sie berücksichtigen, wenn Sie die Definition des Inhaltstyps schreiben. Weitere Informationen finden Sie unter Inhaltstypbereich.
SharePoint Foundation unterstützt eine eingeschränkte Form der Inhaltstypvererbung. Wenn das Feature aktiviert wird, das einen neuen Inhaltstyp definiert, werden die für den übergeordneten Inhaltstyp definierten Spalten und anderen Metadaten an den untergeordneten Inhaltstyp übergeben. Dies ist der einzige Teil der Vererbung, der automatisch erfolgt.
Hinweis |
---|
In früheren Versionen von SharePoint Foundation wurden Spalten und Metadaten, die einem Inhaltstyp nach seiner Bereitstellung hinzugefügt wurden, nicht von untergeordneten Inhaltstypen geerbt. In SharePoint Foundation 2010 wurde dieses Verhalten geändert. Sie haben nun die Möglichkeit, Spalten und Metadaten einzubeziehen, die Benutzer dem übergeordneten Inhaltstyp hinzugefügt haben. Weitere Informationen finden Sie in der Beschreibung des Inherits-Attributs für das ContentType-Element. |
Nachdem ein Inhaltstyp zur Verfügung gestellt wurde und verwendet wird, können Sie oder ein anderer Benutzer die Definition des übergeordneten Inhaltstyps ändern, doch die Änderung wird nicht automatisch von abgeleiteten Inhaltstypen übernommen. Dieser Aspekt der Vererbung muss manuell auf der Benutzeroberfläche oder in benutzerdefiniertem Code ausgelöst werden. Weitere Informationen finden Sie unter Aktualisieren untergeordneter Inhaltstypen.
Die Inhaltstypvererbung lässt jedoch zu, dass Sie mit Inhaltstypen ähnlich wie mit abgeleiteten Klassen arbeiten können. So wie Sie z. B. die Eigenschaften einer Basisklasse außer Kraft setzen können, können Sie Attribute ändern, die Ihr Inhaltstyp von seinem übergeordneten Inhaltstyp geerbt hat. Sie können Spalten hinzufügen, ändern oder entfernen, verschiedene Formulare vom Typ Neu, Bearbeiten oder Anzeigen angeben, eine andere Dokumentvorlage bestimmen usw. Dies bedeutet, dass Sie bei der Entwicklung eines Anwendungsframeworks Basisinhaltstypen ebenso wie Basisklassen erstellen können. Sie können beispielsweise einen Inhaltstyp mit dem Namen Financial Document mit Eigenschaften erstellen, die alle Finanzdokumente in Ihrer Organisation gemeinsam haben. Anschließend können Sie Financial Document als Basis für neue Inhaltstypen wie Invoice und Purchase Order verwenden. Die neuen Inhaltstypen übernehmen Spalten und andere Metadaten von Financial Document, sodass Sie gemeinsame Elemente nur einmal (für den übergeordneten Inhaltstyp) definieren müssen.
Sie finden Anregungen zum Erstellen Ihrer eigenen Inhaltstyphierarchie, indem Sie untersuchen, wie SharePoint Foundation von Basisinhaltstypen geerbte Attribute verwendet und diese ändert. Ein guter Ausgangspunkt ist der Inhaltstypkatalog auf der Benutzeroberfläche. Klicken Sie im Menü Websiteaktionen auf Websiteeinstellungen. Klicken Sie auf der Seite Websiteeinstellungen unter Galerien auf Websiteinhaltstypen. Klicken Sie auf der Seite Websiteinhaltstypen auf den Link des gewünschten Inhaltstyps.
Eine weitere gute Informationsquelle ist die Datei ctypewss.xml im Ordner %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\ctype, die die Definitionen vieler vordefinierter Inhaltstypen enthält. Weiterführende Informationen zu den Definitionen finden Sie unter Inhaltstypdefinitionen.
Entwerfen von Inhaltstypen
Eine umfassende Anleitung zur Planung von Inhaltstypen finden Sie unter Planen von Inhaltstypen und Workflows. Es folgen einige allgemeine Aspekte:
Gültigkeitsbereich. An welcher Stelle in der Websitehierarchie soll der Inhaltstyp zur Verfügung gestellt werden?
Wenn der Inhaltstyp in einer gesamten Websitesammlung verfügbar sein soll, sollten Sie ihn in einem Feature mit dem Gültigkeitsbereich "Websitesammlung" bereitstellen und Code in der FeatureActivated-Methode einer Featureempfängerklasse schreiben, die den Inhaltstyp der Inhaltstypsammlung der Stammwebsite hinzufügt.
Übergeordneter Inhaltstyp. Von welchem vorhandenen Inhaltstyp im Gültigkeitsbereich soll Ihr Inhaltstyp abgeleitet werden?
Ihr Inhaltstyp wird nicht korrekt aktiviert, wenn der übergeordnete Inhaltstyp nicht in der Website verfügbar ist, in der der Inhaltstyp erstellt wird.
Spalten. Welche vorhandenen Websitespalten stehen Ihnen zur Verfügung?
Spalten, die nicht vom übergeordneten Inhaltstyp geerbt werden, müssen hinzugefügt werden. Spalten, die nicht vorhanden sind, müssen erstellt werden.
Weitere Ressourcen. Benötigt der Inhaltstyp Sprachressourcen, Dokumentvorlagen oder Formulare?
Wenn der Inhaltstyp beliebige dieser Ressourcen benötigt, müssen Sie wissen, wie diese bereitgestellt werden und wie der Inhaltstyp darauf zugreift.
Erstellen eines Inhaltstyps mithilfe von deklarativem XML-Code
Eine Möglichkeit zum Erstellen eines Inhaltstyps ist das Definieren des Inhaltstyps in der Elementmanifestdatei eines Features mithilfe von deklarativem XML-Code. Sobald das Feature aktiviert ist, wird der Inhaltstyp erstellt. Weitere Informationen finden Sie unter Inhaltstypdefinitionen und Verwenden von Features.
Sie können mehrere Inhaltstypen in derselben Elementmanifestdatei definieren. Schließen Sie ein ContentType-Element für jeden Inhaltstyp ein, den Sie definieren. Das ID-Attribut ist erforderlich, und der von Ihnen angegebene Wert muss ein sehr spezifisches Format einhalten. Eine ordnungsgemäß formatierte Inhaltstyp-ID bestimmt nicht nur den neuen Inhaltstyp, sondern auch seinen übergeordneten Inhaltstyp. Weitere Informationen finden Sie unter Inhaltstyp-IDs.
Zum Erstellen einer ID für einen Inhaltstyp, der von einem vordefinierten Inhaltstyp abgeleitet ist, beginnen Sie mit der hexadezimalen Zeichenfolge, die den vordefinierten Inhaltstyp bestimmt. Fügen Sie zwei Nullen an und dann eine GUID hinzu, aus der sämtliche Interpunktion entfernt wurde. Beispielsweise lautet die hexadezimale Zeichenfolge, die den Inhaltstyp Item bestimmt, "0x01". Die ID eines Inhaltstyps, der von Item abgeleitet ist, sollte ungefähr wie folgt aussehen:
0x0100A33D9AD9805788419BDAAC2CCB37509F
Zum Erstellen von IDs für zusätzliche Inhaltstypen, die Informationen von Ihrem Inhaltstyp erben, fügen Sie "01", "02" usw. an.
Ein weiteres erforderliches Attribut des ContentType-Elements ist Name, das einen Anzeigenamen angibt. Der Wert kann ein Verweis auf eine Ressource im Format $Resources:String sein. Weitere Informationen finden Sie unter Lokalisieren von SharePoint-Lösungen. Der Name selbst darf nicht länger als 128 Zeichen sein und nicht die Zeichen \ / : * ? " # % < > { } | ~ &, zwei aufeinander folgende Punkte (..) oder Sonderzeichen wie Tabulatoren enthalten.
Wenn Sie einem Inhaltstyp Spalten hinzufügen, dürfen diese nicht in der Inhaltstypdefinition erstellt werden. Stattdessen verweisen Sie auf Spalten, die an anderer Stelle erstellt wurden. Zum Hinzufügen eines Spaltenverweises fügen Sie ein FieldRef-Element als untergeordnetes Element des ContentType-Elements hinzu. Die Spalte, auf die verwiesen wird, kann eine sein, die bereits als Websitespalte vorhanden ist, oder eine neue Spalte sein, die mithilfe desselben Features erstellt wurde, mit dem der Inhaltstyp erstellt wurde. Weitere Informationen zum Erstellen von Websitespalten finden Sie unter Felddefinitionen.
Sie können auch das FieldRef-Element zum Verweisen auf eine Spalte verwenden, die der Inhaltstyp von seinem übergeordneten Inhaltstyp erbt. In diesem Fall ist der Grund für das Verweisen auf die Spalte nicht das Hinzufügen der Spalte, sondern das Ändern einiger ihrer Merkmale, wenn sie im Inhaltstyp verwendet wird.
Das ID-Attribut des FieldRef-Elements identifiziert die Spalte, auf die Sie verweisen. Der Wert, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, muss die Zeichenfolgendarstellung einer GUID einschließlich geschweifter Klammern sein.
Tipp |
---|
Sie finden die IDs vordefinierter Felder in der Datei fieldswss.xml, die sich im folgenden Pfad befindet: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields. |
Wenn Ihr Inhaltstyp eine Dokumentvorlage für neue Inhalte verwendet, können Sie diese in einem DocumentTemplate-Element innerhalb des ContentType-Elements identifizieren. Die Datei muss separat bereitgestellt werden. Eine Möglichkeit hierzu ist das Hinzufügen eines Module-Elements zum Manifest und das Einbeziehen der Datei in das Feature. Weitere Informationen finden Sie unter Gewusst wie: Bereitstellen einer Datei.
Die Inhaltstypdefinition kann auch über ein XMLDocuments-Element Definitionen benutzerdefinierter Formulare enthalten. Weitere Informationen finden Sie unter Benutzerdefinierte Informationen in Inhaltstypen.
Beispiel
Das folgende Beispiel zeigt das Elementmanifest eines Features, das vier Websitespalten und drei Websiteinhaltstypen erstellt. Der erste Inhaltstyp, Financial Document, ist ein untergeordnetes Element des vordefinierten Inhaltstyps Document. Die beiden anderen neuen Inhaltstypen, Invoice und Purchase Order, sind beide von Financial Document abgeleitet.
Die Definition von Financial Document verweist auf zwei der neuen Websitespalten, DateOpened und Amount. Das FieldRef-Element, das auf die Spalte DateOpened verweist, legt das DisplayName-Attribut so fest, dass der Spaltenname als Date anstelle von DateOpened, wie in der Websitespalte definiert, gerendert wird.
Invoice ist der erste von zwei neuen Inhaltstypen, die von Financial Document abgeleitet sind. Die Definition des Inhaltstyp verweist auf eine dritte neue Websitespalte, Client, und legt das Required-Attribut auf TRUE fest, sodass ein Eintrag für dieses Feld erforderlich ist, wenn ein neues Element erstellt wird. Der Typ Invoice enthält das FieldRef-Element für die Spalte Title, obwohl es vererbt ist, um den Wert des DisplayName-Attributs von Title in Service zu ändern.
Der zweite Inhaltstyp, der von Financial Document abgeleitet ist, heißt Purchase Order. Die Definition des Inhaltstyps verweist auf eine vierte neue Websitespalte, CostCenter, und legt das DisplayName-Attribut so fest, dass der Spaltenname als Department anstelle von Cost Center gerendert wird, wie in der Websitespalte definiert.
Purchase Order erbt die Spaltenverweise vom übergeordneten Inhaltstyp Financial Document, sodass kein erneuter Verweis erfolgen muss. Der Inhaltstyp erbt auch einen Verweis auf die Spalte Title von Financial Document, der die Spalte vom übergeordneten Inhaltstyp Document erbt. Der Typ Purchase Order enthält ein FieldRef-Element für die Spalte Title, um das geerbte DisplayName-Attribut mit einem eigenen Wert zu überschreiben.
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
<!-- Document Templates -->
<Module Name="InvoiceDocumentTemplate"
Path="FinancialDocuments"
Url="_cts/Invoice" RootWebOnly="TRUE">
<File Url="Invoice.docx" Type="Ghostable" />
</Module>
<Module Name="PurchaseOrderDocumentTemplate"
Path="FinancialDocuments"
Url="_cts/PurchaseOrder" RootWebOnly="TRUE">
<File Url="PurchaseOrder.docx" Type="Ghostable" />
</Module>
<!-- Site Columns -->
<Field ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}"
Name="Amount"
DisplayName="Amount"
Type="Currency"
Decimals="2"
Min="0"
Required="FALSE"
Group="Financial Columns" />
<Field ID="{86811853-7E52-4515-A88D-A8FA9D450905}"
Name="Client"
DisplayName="Client Name"
Type="Text"
Required="FALSE"
Group="Financial Columns"/>
<Field ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}"
Name="DateOpened"
DisplayName="Date Opened"
Type="DateTime"
Format="DateOnly"
Required="FALSE"
Group="Financial Columns">
<Default>[today]</Default>
</Field>
<Field ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}"
Name="CostCenter"
DisplayName="Department"
Type="Choice"
Required="FALSE"
Group="Financial Columns">
<CHOICES>
<CHOICE>Administration</CHOICE>
<CHOICE>Information</CHOICE>
<CHOICE>Facilities</CHOICE>
<CHOICE>Operations</CHOICE>
<CHOICE>Sales</CHOICE>
<CHOICE>Marketing</CHOICE>
</CHOICES>
</Field>
<!-- Site Content Types -->
<!-- Parent ContentType: Document (0x0101) -->
<ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e"
Name="Financial Document"
Group="Financial Content Types"
Description="Base financial content type"
Version="0">
<FieldRefs>
<FieldRef ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}" Name="DateOpened" DisplayName="Date" Required="TRUE"/>
<FieldRef ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}" Name="Amount" DisplayName="Amount" Required="FALSE"/>
</FieldRefs>
</ContentType>
<!-- Parent ContentType: Financial Document -->
<ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e01"
Name="Invoice"
Group="Financial Content Types"
Description="Used for creating customer invoices"
Inherits="TRUE"
Version="0">
<FieldRefs>
<FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Service" Required="TRUE" Sealed="TRUE"/>
<FieldRef ID="{86811853-7E52-4515-A88D-A8FA9D450905}" Name="Client" DisplayName="Client Name" Required="TRUE"/>
</FieldRefs>
<DocumentTemplate TargetName="Invoice.docx" />
</ContentType>
<!-- Parent ContentType: Financial Document -->
<ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e02"
Name="PurchaseOrder"
Group="Financial Content Types"
Description="Used for creating purchase orders"
Inherits="TRUE"
Version="0">
<FieldRefs>
<FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Item" Required="TRUE" Sealed="TRUE"/>
<FieldRef ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}" Name="CostCenter" DisplayName="Department" Required="TRUE"/>
</FieldRefs>
<DocumentTemplate TargetName="PurchaseOrder.docx"/>
</ContentType>
</Elements>
Erstellen eines Inhaltstyps mithilfe von Code
Als Alternative zur Verwendung von deklarativem XML-Code zum Erstellen eines Inhaltstyps können Sie das SharePoint Foundation-Objektmodell verwenden. Deklarativer XML-Code ist in der Regel einfacher zu schreiben, bietet jedoch im Allgemeinen weniger Flexibilität als das Objektmodell, das Zugriff auf die Funktionen des gesamten Microsoft .NET Framework hat und ein Debugging zur Laufzeit ermöglicht. Beide Ansätze werden mithilfe von Vorlagen unterstützt, die SharePoint-Entwicklungstools in Microsoft Visual Studio 2010 bereitstellt.
Fügen Sie den Code, der Ihren Inhaltstyp definiert, der FeatureActivated-Methode einer Unterklasse der SPFeatureReceiver-Klasse hinzu.
Sie erstellen einen Inhaltstyps durch Aufrufen des Konstruktors der SPContentType-Klasse. Vor Aufruf des Konstruktors müssen Sie drei als Argumente zu übergebende Elemente zusammenstellen:
Ein SPContentType-Objekt, das den übergeordneten Inhaltstyp darstellt.
Sie können dieses Objekt aus der Auflistung abrufen, die in der AvailableContentTypes-Eigenschaft des SPWeb-Objekts zurückgegeben wurde, das die Website darstellt, in der Sie Ihren Inhaltstyp erstellen.
Ein SPContentTypeCollection-Objekt, das die Auflistung für die Website darstellt, in der Sie Ihren Inhaltstyp erstellen.
Sie können dieses Objekt abrufen, indem Sie auf die ContentTypes-Eigenschaft des SPWeb-Objekts zugreifen, das die Website darstellt, in der Sie Ihren Inhaltstyp erstellen.
Eine Zeichenfolge, die den Namen enthält, den Sie dem Inhaltstyp zuweisen möchten.
Der Name, den Sie bereitstellen, wird als Anzeigename für den Inhaltstyp verwendet. Einige Zeichen sind in Inhaltstypnamen nicht zulässig. Sie können den vorgeschlagenen Namen durch Aufrufen der statischen ValidateName(String)-Methode überprüfen. Diese Methode prüft auf unzulässige Zeichen, jedoch nicht auf Namensduplikate.
Nach Aufruf des Konstruktors zum Erstellen eines neuen SPContentType-Objekts müssen Sie es der Inhaltstypauflistung der Website in einem gesonderten Aufruf der Add(SPContentType)-Methode des SPContentTypeCollection-Objekts hinzufügen, das die Auflistung der Website darstellt. Mit diesem Schritt ist die Initialisierung des Inhaltstyps abgeschlossen.
Vorsicht |
---|
Die Add(SPContentType)-Methode löst eine SPException-Ausnahme aus, wenn der Inhaltstyp bereits in der Auflistung vorhanden ist. |
Wenn Sie beabsichtigen, Eigenschaften des Inhaltstyps festlegen, müssen Sie das SPContentType-Objekt speichern, das von der Add-Methode zurückgegeben wird.
Sie können dem Inhaltstyp Spalten hinzufügen, indem Sie auf jede Spalte in einem SPFieldLink-Objekt verweisen. Rufen Sie dann die Add(SPFieldLink)-Methode des SPFieldLinkCollectionObjekts auf, das von der FieldLinks-Eigenschaft des Inhaltstyps zurückgegeben wird.
Wenn Sie die Konfiguration des Inhaltstyps abgeschlossen haben, rufen Sie die Update()-Methode auf, um für die Änderungen in der Datenbank einen Commit auszuführen.
Beispiel
Im folgenden Beispiel werden exakt dieselbe Websitespalten und Inhaltstypen wie im vorherigen Beispiel erstellt. Der einzige Unterschied ist, dass anstelle von deklarativer XML in diesem Beispiel Code in der FeatureActivated-Methode eines Featureempfängers verwendet wird.
Der properties-Parameter der FeatureActivated-Methode ist ein SPFeatureReceiverProperties-Objekt. Die Feature-Eigenschaft dieses Objekts gibt ein SPFeature-Objekt mit einer Parent-Eigenschaft zurück, die ein verschachteltes SPSite-Objekt oder ein verschachteltes SPWeb-Objekt enthält. Sie sollten diese Objekte nicht verwerfen. Sie sollten jedoch alle neuen SPWeb- oder SPSite-Objekte verwerfen, die von Ihrem Code erstellt werden. Weitere Informationen finden Sie unter Verwerfen von Objekten.
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb web = null;
if (properties.Feature.Parent is SPSite)
{
SPSite sites = (SPSite)properties.Feature.Parent;
web = sites.RootWeb;
}
else
{
web = (SPWeb)properties.Feature.Parent;
}
if (web == null)
return;
/* CREATE SITE COLUMNS */
string columnGroup = "Financial Columns";
// Amount
string amountFieldName = web.Fields.Add("Amount", SPFieldType.Currency, false);
SPFieldCurrency amountField = (SPFieldCurrency)web.Fields.GetFieldByInternalName(amountFieldName);
amountField.Group = columnGroup;
amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals;
amountField.MinimumValue = 0;
amountField.Update();
// Client Name
string clientFieldName = web.Fields.Add("Client Name", SPFieldType.Text, false);
SPFieldText clientField = (SPFieldText)web.Fields.GetFieldByInternalName(clientFieldName);
clientField.Group = columnGroup;
clientField.Update();
// Date Opened
string dateOpenedFieldName = web.Fields.Add("Date Opened", SPFieldType.DateTime, false);
SPFieldDateTime dateOpenedField = (SPFieldDateTime)web.Fields.GetFieldByInternalName(dateOpenedFieldName);
dateOpenedField.Group = columnGroup;
dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;
dateOpenedField.DefaultValue = "[today]";
dateOpenedField.Update();
// Cost Center Name
string costCenterFieldName = web.Fields.Add("Cost Center", SPFieldType.Choice, false);
SPFieldChoice costCenterField = (SPFieldChoice)web.Fields.GetFieldByInternalName(costCenterFieldName);
costCenterField.Choices.Add("Administration");
costCenterField.Choices.Add("Information Services");
costCenterField.Choices.Add("Facilities");
costCenterField.Choices.Add("Operations");
costCenterField.Choices.Add("Sales");
costCenterField.Choices.Add("Marketing");
costCenterField.Group = columnGroup;
costCenterField.Update();
/* CREATE SITE CONTENT TYPES */
string contentTypeGroup = "Financial Content Types";
// Get a content type to be the parent of a new Financial Document content type.
SPContentType documentCType = web.AvailableContentTypes[SPBuiltInContentTypeId.Document];
// Create the Financial Document content type.
SPContentType financialDocumentCType = new SPContentType(documentCType, web.ContentTypes, "Financial Document");
// Note: A content type is not initialized until after it is added.
financialDocumentCType = web.ContentTypes.Add(financialDocumentCType);
financialDocumentCType.Group = contentTypeGroup;
// Add the Date Opened column. Child content types inherit the column.
SPFieldLink dateOpenedFieldRef = new SPFieldLink(dateOpenedField);
dateOpenedFieldRef.Required = true;
financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef);
// Add the Amount column. Child content types inherit the column.
SPFieldLink amountFieldRef = new SPFieldLink(amountField);
financialDocumentCType.FieldLinks.Add(amountFieldRef);
// Commit changes.
financialDocumentCType.Update();
// Create the Invoice content type.
SPContentType invoiceCType = new SPContentType(financialDocumentCType, web.ContentTypes, "Invoice");
invoiceCType = web.ContentTypes.Add(invoiceCType);
invoiceCType.Group = contentTypeGroup;
// Modify the Title column inherited from the parent.
SPFieldLink serviceFieldRef = invoiceCType.FieldLinks[SPBuiltInFieldId.Title];
serviceFieldRef.DisplayName = "Service";
serviceFieldRef.Required = true;
// Add the Client column.
SPFieldLink clientFieldRef = new SPFieldLink(clientField);
clientFieldRef.Required = true;
invoiceCType.FieldLinks.Add(clientFieldRef);
// Specify a document template.
invoiceCType.DocumentTemplate = "Invoice.docx";
// Commit changes.
invoiceCType.Update();
// Create the Purchase Order content type.
SPContentType purchaseOrderCType = new SPContentType(financialDocumentCType, web.ContentTypes, "Purchase Order");
purchaseOrderCType = web.ContentTypes.Add(purchaseOrderCType);
purchaseOrderCType.Group = contentTypeGroup;
// Modify the Title column inherited from the parent.
SPFieldLink itemFieldRef = purchaseOrderCType.FieldLinks[SPBuiltInFieldId.Title];
itemFieldRef.DisplayName = "Item";
itemFieldRef.Required = true;
// Add the Department column.
SPFieldLink departmentFieldRef = new SPFieldLink(costCenterField);
departmentFieldRef.DisplayName = "Department";
departmentFieldRef.Required = true;
purchaseOrderCType.FieldLinks.Add(departmentFieldRef);
// Specify a document template.
purchaseOrderCType.DocumentTemplate = "PurchaseOrder.docx";
// Commit changes.
purchaseOrderCType.Update();
}
Public Overrides Sub FeatureActivated(ByVal properties As Microsoft.SharePoint.SPFeatureReceiverProperties)
Dim web As SPWeb = Nothing
If TypeOf properties.Feature.Parent Is SPSite Then
Dim sites As SPSite = DirectCast(properties.Feature.Parent, SPSite)
web = sites.RootWeb
Else
web = DirectCast(properties.Feature.Parent, SPWeb)
End If
If web Is Nothing Then
Return
End If
' CREATE SITE COLUMNS
Dim columnGroup As String = "Financial Columns"
' Amount
Dim amountFieldName As String = web.Fields.Add("Amount", SPFieldType.Currency, False)
Dim amountField As SPFieldCurrency = DirectCast(web.Fields.GetFieldByInternalName(amountFieldName), SPFieldCurrency)
amountField.Group = columnGroup
amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals
amountField.MinimumValue = 0
amountField.Update()
' Client Name
Dim clientFieldName As String = web.Fields.Add("Client Name", SPFieldType.Text, False)
Dim clientField As SPFieldText = DirectCast(web.Fields.GetFieldByInternalName(clientFieldName), SPFieldText)
clientField.Group = columnGroup
clientField.Update()
' Date Opened
Dim dateOpenedFieldName As String = web.Fields.Add("Date Opened", SPFieldType.DateTime, False)
Dim dateOpenedField As SPFieldDateTime = DirectCast(web.Fields.GetFieldByInternalName(dateOpenedFieldName), SPFieldDateTime)
dateOpenedField.Group = columnGroup
dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly
dateOpenedField.DefaultValue = "[today]"
dateOpenedField.Update()
' Cost Center Name
Dim costCenterFieldName As String = web.Fields.Add("Cost Center", SPFieldType.Choice, False)
Dim costCenterField As SPFieldChoice = DirectCast(web.Fields.GetFieldByInternalName(costCenterFieldName), SPFieldChoice)
costCenterField.Choices.Add("Administration")
costCenterField.Choices.Add("Information Services")
costCenterField.Choices.Add("Facilities")
costCenterField.Choices.Add("Operations")
costCenterField.Choices.Add("Sales")
costCenterField.Choices.Add("Marketing")
costCenterField.Group = columnGroup
costCenterField.Update()
' CREATE SITE CONTENT TYPES
Dim contentTypeGroup As String = "Financial Content Types"
' Get a content type to be the parent of a new Financial Document content type.
Dim documentCType As SPContentType = web.AvailableContentTypes(SPBuiltInContentTypeId.Document)
' Create the Financial Document content type.
Dim financialDocumentCType As New SPContentType(documentCType, web.ContentTypes, "Financial Document")
' Note: A content type is not initialized until after it is added.
financialDocumentCType = web.ContentTypes.Add(financialDocumentCType)
financialDocumentCType.Group = contentTypeGroup
' Add the Date Opened column. Child content types inherit the column.
Dim dateOpenedFieldRef As New SPFieldLink(dateOpenedField)
dateOpenedFieldRef.Required = True
financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef)
' Add the Amount column. Child content types inherit the column.
Dim amountFieldRef As New SPFieldLink(amountField)
financialDocumentCType.FieldLinks.Add(amountFieldRef)
' Commit changes.
financialDocumentCType.Update()
' Create the Invoice content type.
Dim invoiceCType As New SPContentType(financialDocumentCType, web.ContentTypes, "Invoice")
invoiceCType = web.ContentTypes.Add(invoiceCType)
invoiceCType.Group = contentTypeGroup
' Modify the Title column inherited from the parent.
Dim serviceFieldRef As SPFieldLink = invoiceCType.FieldLinks(SPBuiltInFieldId.Title)
serviceFieldRef.DisplayName = "Service"
serviceFieldRef.Required = True
' Add the Client column.
Dim clientFieldRef As New SPFieldLink(clientField)
clientFieldRef.Required = True
invoiceCType.FieldLinks.Add(clientFieldRef)
' Specify a document template.
invoiceCType.DocumentTemplate = "Invoice.docx"
' Commit changes.
invoiceCType.Update()
' Create the Purchase Order content type.
Dim purchaseOrderCType As New SPContentType(financialDocumentCType, web.ContentTypes, "Purchase Order")
purchaseOrderCType = web.ContentTypes.Add(purchaseOrderCType)
purchaseOrderCType.Group = contentTypeGroup
' Modify the Title column inherited from the parent.
Dim itemFieldRef As SPFieldLink = purchaseOrderCType.FieldLinks(SPBuiltInFieldId.Title)
itemFieldRef.DisplayName = "Item"
itemFieldRef.Required = True
' Add the Department column.
Dim departmentFieldRef As New SPFieldLink(costCenterField)
departmentFieldRef.DisplayName = "Department"
departmentFieldRef.Required = True
purchaseOrderCType.FieldLinks.Add(departmentFieldRef)
' Specify a document template.
purchaseOrderCType.DocumentTemplate = "PurchaseOrder.docx"
' Commit changes.
purchaseOrderCType.Update()
End Sub
Siehe auch
Aufgaben
Gewusst wie: Verweisen auf eine Spalte in einem Inhaltstyp
Gewusst wie: Hinzufügen eines Inhaltstyps zu einer Website
Vorgehensweise: Hinzufügen eines Inhaltstyps zu einer Liste
Konzepte
Website- und Listeninhaltstypen
Weitere Ressourcen
Planen von Inhaltstypen und Workflows (SharePoint Server 2010)
Erstellen benutzerdefinierter Inhaltstypen in SharePoint 2010
Vorgehensweise: Programmgesteuertes Erstellen von Inhaltstypen