Практическое руководство: ссылка на столбец в типе контента
Дата последнего изменения: 13 января 2015 г.
Применимо к: SharePoint Foundation 2010
Столбцы никогда не определяются непосредственно в типе контента. Они определяются в другом месте, а в типе контента используется ссылка на них. Это объясняется двумя причинами.
Требуется добавить столбец в тип контента.
Требуется изменить характеристики столбца, которые тип контента наследует от родительского типа контента.
Дополнительные сведения о наследовании см. в описании атрибута Inherits элемента ContentType в схеме определения типа контента.
В декларативном XML-коде ссылка на столбец указывается с помощью элемента FieldRef. В коде то же самое делается посредством создания объекта SPFieldLink.
Примечание |
---|
В Microsoft SharePoint Foundation поля — это синоним столбцов. Часто слово "столбец" используется при описании того, как поле представляется пользовательским интерфейсом. |
Дополнительные сведения об отличиях столбцов и ссылках на столбцы см. в статье Поля и ссылки на поля.
Ссылки на столбцы в декларативном XML-коде
Один из способов создания типа контента — использование декларативного XML-кода для определения типа контента в файле манифеста элемента для компонента. При активации компонента создается тип контента. Дополнительные сведения см. в статье Определения типов контента.
В определение типа контента можно включить столбец, сославшись на него в элементе FieldRef. Столбец, на который указывает ссылка, может быть уже используемым столбцом сайта или новым столбцом, созданным тем же компонентом, который создает тип контента. Элемент FieldRef также можно использовать для ссылки на столбец, который тип контента наследует от родительского типа контента. В этом случае причина применения ссылки на столбец заключается не в необходимости добавить столбец, а в необходимости изменить некоторые из его характеристик при его использовании в типе контента.
Чтобы создать ссылку на столбец с помощью декларативного XML-кода, выполните следующие действия:
В определении типа контента добавьте элемент FieldRef в узел FieldRefs.
Создайте ссылку на столбец, указав значение атрибута ID элемента FieldRef равным идентификатору столбца.
Значение должно быть строковым представлением GUID-идентификатора, заключенным в скобки, как в следующем примере:
ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}"
В атрибуте ID учитывается регистр, поэтому убедитесь, что значение атрибута в точности совпадает со значением атрибута ID элемента Field.
Идентификаторы встроенных столбцов можно найти в файле fieldswss.xml, расположенном в папке %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.
Присвойте значению атрибута Name элемента FieldRef значение атрибута Name элемента Field, представляющего столбец.
Чтобы определить столбец, задайте атрибуты элемента FieldRef.
Например, чтобы изменить текст, который отображается в столбце, задайте значение атрибута DisplayName.
Многие атрибуты элемента FieldRef имеют одинаковые имена и назначение, что и атрибуты элемента Field, на который указывает ссылка. Только значения атрибута ID и атрибутов Name обязательно должны быть одинаковыми. Для других атрибутов при использовании другого значения в элементе FieldRef могут измениться характеристики столбца, если он применяется в типе контента без изменения самого столбца, на который имеется ссылка.
Важно! |
---|
Атрибуты ID, Name, DisplayName и Required в элементеFieldRef всегда обязательны, даже если элемент FieldRef ссылается на поле, которое определено в том же манифесте элемента. |
Пример
В следующем примере показан манифест элементов для компонента, создающего три столбца сайта и два типа контента сайта. Первый тип контента, Financial Document (Финансовый документ), является потомком встроенного типа контента Document (Документ).
Определение типа Financial Document (Финансовый документ) ссылается на два новых столбца сайта, DateOpened (ДатаОткрытия) и Amount (Количество). Элемент FieldRef, ссылающийся на столбец DateOpened, задает значение атрибута DisplayName таким образом, что имя столбца будет отображаться как Date (Дата), а не DateOpened, как задано в определении столбца сайта.
Определение типа Purchase Order (Заказ на покупку) ссылается на третий новый столбец сайта, CostCenter (ЦентрЗатрат), и задает атрибут DisplayName таким образом, чтобы имя столбца отображалось как "Department" (Подразделение), а не "Cost Center", как указано в столбце сайта.
Тип Purchase Order (Заказ на покупку) наследует ссылки на столбцы от родительского типа Financial Document, поэтому нет необходимости ссылаться на них снова. Тип контента также наследует ссылку на столбец Title (Заголовок) типа Financial Document, который, в свою очередь, наследует этот столбец от своего родительского типа Document. Тип Purchase Order включает элемент FieldRef для столбца Title с целью переопределения унаследованного атрибута DisplayName.
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
<!-- New Site 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="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}"
Name="Amount"
DisplayName="Amount"
Type="Currency"
Decimals="2"
Min="0"
Required="FALSE"
Group="Financial Columns" />
<Field ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}"
Name="CostCenter"
DisplayName="Cost Center"
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="Purchase Order"
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>
</ContentType>
</Elements>
Создание ссылок на столбцы в коде
В качестве альтернативы использованию декларативного XML-кода для создания типа контента можно создать тип контента в методе FeatureActivated подкласса класса SPFeatureReceiver. В код, создающий тип контента, можно включить существующий столбец сайта или списка или же новый столбец, созданный тем же кодом, который создает тип контента, сославшись на столбец с помощью объекта SPFieldLink. Как и в случае с декларативным XML-кодом, также можно создать ссылку на столбец, который наследуется типом контента, чтобы изменить его характеристики в типе контента.
Также есть ситуации, в которых можно использовать код для создания ссылки на столбец в типе контента. Например, может понадобиться обновить существующий тип контента, добавив или удалив ссылки на столбец. Или же может потребоваться создать список из определения списка и затем изменить тип контента в списке, добавив или удалив столбцы. Независимо от причины способ использования объектной модели SharePoint Foundation для создания ссылки на столбец является практически одинаковым.
Создание ссылки на столбец в коде
Получите ссылку на объект SPField, представляющий поле, для которого требуется создать ссылку.
Объект SPField можно извлечь из коллекции, которая хранится в свойстве Fields объекта SPWeb, который представляет сайт.
Создайте объект SPFieldLink, представляющий ссылку на столбец, передав объект SPField конструктору SPFieldLink.
Получите ссылку на объект SPContentType.
При создании нового типа контента можно использовать объект, который возвращается конструктором класса SPContentType. Если изменяется существующий тип контента, можно получить объект SPContentType из коллекции, которая хранится в свойстве ContentTypes объекта SPWeb или SPList.
Используйте свойство FieldLinks для доступа к коллекции ссылок на столбцы в объекте SPContentType. Это свойство возвращает объект SPFieldLinkCollection.
Примечание Объект SPContentType также имеет свойство Fields, которое возвращает объект SPFieldCollection. Нельзя добавлять столбцы непосредственно в эту коллекцию. При добавлении объекта SPFieldLink в коллекцию FieldLinks соответствующий объект SPField автоматически добавляется в коллекцию Fields. Каждый объект SPField в этой коллекции представляет "объединенное представление" базового определения столбца и перезаписанных свойств, указанных в ссылке на столбец.
Добавьте ссылку на столбец в тип контента, передав объект SPFieldLink в метод Add объекта SPFieldLinkCollection.
Пример
В следующем примере показан метод FeatureActivated класса, производного от класса SPFeatureReceiver. При включении компонента код в методе FeatureActivated создает три столбца сайта и добавляет их в коллекцию столбцов текущего сайта. Затем код создает тип контента, Financial Document, и добавляет его в коллекцию типов контента на текущем сайте. Тип контента Financial Document ссылается на два новых столбца сайта, DateOpened и Amount. Затем код создает второй тип контента, Purchase Order, который наследуется от типа Financial Document. Тип контента Purchase Order ссылается на унаследованный столбец сайта Title, чтобы изменить некоторые свойства типа контента. Кроме того, в типе контента Purchase Order используется ссылка на один из новых столбцов сайта, CostCenter.
Этот пример написан так, как если бы приемник компонента был частью компонента с областью определения на уровне семейства веб-сайтов. Это значит, что свойство Feature возвращает объект SPFeature, который содержит свойство Parent с объектом SPSite. Не следует удалять этот объект в методе FeatureActivated. Однако любой объект SPWeb, создаваемый в коде, необходимо правильно удалить, как это сделано в примере.
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPSite siteCollection = (SPSite)properties.Feature.Parent;
SPWeb site = siteCollection.RootWeb;
/* CREATE SITE COLUMNS */
string columnGroup = "Financial Columns";
// Amount
string amountFieldName = site.Fields.Add("Amount", SPFieldType.Currency, false);
SPFieldCurrency amountField = (SPFieldCurrency)site.Fields.GetFieldByInternalName(amountFieldName);
amountField.Group = columnGroup;
amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals;
amountField.MinimumValue = 0;
amountField.Update();
// Date Opened
string dateOpenedFieldName = site.Fields.Add("Date Opened", SPFieldType.DateTime, false);
SPFieldDateTime dateOpenedField = (SPFieldDateTime)site.Fields.GetFieldByInternalName(dateOpenedFieldName);
dateOpenedField.Group = columnGroup;
dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;
dateOpenedField.DefaultValue = "[today]";
dateOpenedField.Update();
// Cost Center Name
string costCenterFieldName = site.Fields.Add("Cost Center", SPFieldType.Choice, false);
SPFieldChoice costCenterField = (SPFieldChoice)site.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 = site.AvailableContentTypes[SPBuiltInContentTypeId.Document];
// Create the Financial Document content type.
SPContentType financialDocumentCType = new SPContentType(documentCType, site.ContentTypes, "Financial Document");
site.ContentTypes.Add(financialDocumentCType);
// Note: A content type is not initialized until after it is added.
financialDocumentCType = site.ContentTypes[financialDocumentCType.Id];
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 Purchase Order content type.
SPContentType purchaseOrderCType = new SPContentType(financialDocumentCType, site.ContentTypes, "Purchase Order");
site.ContentTypes.Add(purchaseOrderCType);
purchaseOrderCType = site.ContentTypes[purchaseOrderCType.Id];
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);
// Commit changes.
purchaseOrderCType.Update();
site.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)
Dim siteCollection As SPSite = DirectCast(properties.Feature.Parent, SPSite)
Dim site As SPWeb = siteCollection.RootWeb
' CREATE SITE COLUMNS
Dim columnGroup As String = "Financial Columns"
' Amount
Dim amountFieldName As String = site.Fields.Add("Amount", SPFieldType.Currency, False)
Dim amountField As SPFieldCurrency = DirectCast(site.Fields.GetFieldByInternalName(amountFieldName), SPFieldCurrency)
amountField.Group = columnGroup
amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals
amountField.MinimumValue = 0
amountField.Update()
' Date Opened
Dim dateOpenedFieldName As String = site.Fields.Add("Date Opened", SPFieldType.DateTime, False)
Dim dateOpenedField As SPFieldDateTime = DirectCast(site.Fields.GetFieldByInternalName(dateOpenedFieldName), SPFieldDateTime)
dateOpenedField.Group = columnGroup
dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly
dateOpenedField.DefaultValue = "[today]"
dateOpenedField.Update()
' Cost Center Name
Dim costCenterFieldName As String = site.Fields.Add("Cost Center", SPFieldType.Choice, False)
Dim costCenterField As SPFieldChoice = DirectCast(site.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 = site.AvailableContentTypes(SPBuiltInContentTypeId.Document)
' Create the Financial Document content type.
Dim financialDocumentCType As New SPContentType(documentCType, site.ContentTypes, "Financial Document")
site.ContentTypes.Add(financialDocumentCType)
' Note: A content type is not initialized until after it is added.
financialDocumentCType = site.ContentTypes(financialDocumentCType.Id)
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 Purchase Order content type.
Dim purchaseOrderCType As New SPContentType(financialDocumentCType, site.ContentTypes, "Purchase Order")
site.ContentTypes.Add(purchaseOrderCType)
purchaseOrderCType = site.ContentTypes(purchaseOrderCType.Id)
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)
' Commit changes.
purchaseOrderCType.Update()
site.Dispose()
End Sub
См. также
Задачи
Ссылка
Элемент FieldRef (ContentType)