Site columns are column/field definitions which can be
created at site collection level for making them available to reuse at
sub-sites or they can also be created at list level which are termed as list
columns. One can map them to database columns with reusable capability.
Site columns can be created either declaratively or
programmatically.
a.
Declarative
manner
In this method, site columns
are declared in the element manifest file of the feature as shown below.
Following table contains important details about creating the different type of site columns.
Type of field
|
Field Type
|
Further customization tips
|
Yes/No
|
Type="Boolean"
|
|
Single line of text
|
Type="Text"
|
|
Multiple lines of text
|
Type="Note"
|
Plain Text:
RichText="FALSE"
Rich Text:
RichText="TRUE" RichTextMode="Compatible"
Enhanced Rich Text:
RichText="TRUE" RichTextMode="FullHtml"
Use NumLines attribute to set
the number of lines to display
|
Choice (menu to choose from)
|
Single Choice (dropdown or radio
buttons):
Type="Choice"
Multiple choices (check boxes):
Type="MultiChoice"
|
Dropdown:
Format="Dropdown"
Radio Buttons/ check boxes:
Format="RadioButtons"
Choices can be entered using choice tag and default choice can be set
using Default tag as shown below.
<CHOICES>
<CHOICE>First Choice</CHOICE>
<CHOICE>Second Choice</CHOICE>
</CHOICES>
<Default>First Choice</Default>
Use fill in choice option to allow users entering the values apart
from fixed choices.
FillInChoice="TRUE"
|
Date and Time
|
Type="DateTime"
|
Date and Time:
Format="DateTime"
Date Only:
Format="DateOnly"
|
Hyperlink or Picture
|
Type="URL"
|
Display as link:
Format="Hyperlink"
Display as image:
Format="Image"
|
Integer
|
Type="Integer"
|
|
Number
|
Type="Number"
|
|
Person or Group
|
Single User or Group
Type="User"
Multiple Users or Groups
Type="UserMulti" |
Allow all people:
UserSelectionScope="0"
Allow people from specific group:
UserSelectionScope="group
id here"
Multiple values:
Mult="TRUE"
Communicator presence:
Presence="TRUE"
Allow people only
UserSelectionMode="0"
Allow both people and groups:
UserSelectionMode="1"
|
Currency
|
Type="Currency"
|
Use LCID attribute to set the currency type of specific locale
|
Calculated
|
Type="Calculated"
|
Use excel formula syntax to calculate the value of this field.
FieldRefs to other fields can be used in the same manner as that of excel
cell values in excel formula.
<Formula> excel formula </Formula>
<FieldRefs>
<FieldRef Name="Field1"/>
<FieldRef Name="Field2"/>
</FieldRefs>
|
Other important customizations
to remember are outlined in the table below. Most of them are independent of
field type.
Attribute/ child Tags
|
Value
|
Purpose
|
ID
|
Registry format GUID
|
Specifies the GUID of the field contained within braces ({}).
|
Name
|
Sets internal name of the field
|
|
Static Name
|
Keep this same as that of internal name
|
|
Display Name
|
Display name of the field
|
|
Required
|
True/ False
|
Denotes whether field is mandatory or not.
|
Description
|
Sets the description to be shown on list forms.
|
|
Group
|
Group name to which column should belong
|
|
Hidden
|
True/ False
|
If True, then field is not displayed anywhere in user interface.
|
ReadOnly
|
True/ False
|
If True, then field does not get displayed in New/Edit form.
|
Min
Max
MaxLength
|
Integer
|
Minimum and maximum values.
Max length controls length of the column value.
|
Decimals
|
Integer
|
Determines number of decimals to display.
|
EnforceUniqueValues
|
Enforces unique values. For column to be unique, it must be indexed
also.
|
|
Indexed
|
True/ False
|
Used for efficient filtering
|
LinkToItem
|
True/ False
|
Specifies whether column should be shown with link (similar to Edit column)to display form.
|
ListItemMenu
|
True/ False
|
Specifies whether column should be shown with item context menu
(similar to LinkTitle column).
|
ShowInDisplayForm, ShowInEditForm, ShowInNewForm,
ShowInListSettings,
ShowInVersionHistory,
ShowInViewForms
|
True/ False
|
Controls visibility of the column on Display form, Edit form, New
form, List Settings, Version History and List View form respectively
|
Validation
|
This child tag is used for validating the field value using excel
based formula.
<Validation Message="Validation
failed message" Script="Excel compatible validation formula"/>
|
Apart from above, there are
two more attributes named “Overwrite”
and “OverwriteInChildScope”. These
must be set to True at least during development
phase to avoid errors in case of frequent deployments.
Note here that some of the above attributes are newly added in SharePoint 2010. They do not exist in WSS 3.0 or MOSS 2007.
Note here that some of the above attributes are newly added in SharePoint 2010. They do not exist in WSS 3.0 or MOSS 2007.
Steps to Create site
column in declarative fashion
1. In
Visual Studio 2010, click New Project,
expand the SharePoint node, click 2010 , and then click Empty SharePoint Project. Name
the project as SPCustomDevelopment and then click OK.
2. In
the SharePoint Customization Wizard, select the local SharePoint site that can
be used for debugging and and type of deployment method (Sandbox or Farm) as shown in Figure 1. Click Finish.
3. In Solution Explorer, right-click the Features node and then click Add Feature as shown in Figure 2.
Figure 1: Select Deployment Method |
3. In Solution Explorer, right-click the Features node and then click Add Feature as shown in Figure 2.
Figure 2: Add Feature |
4. Name the feature as SPCustomDevelopment – Site Columns and give appropriate description. Ensure that the feature scope is set to Site. As Site Column gallery in which the site column gets created is present at root web of Site collection, the scope of the feature creating it must be set to Site as shown in Figure 3.
5. Rename the Feature 1 folder to Site Columns as shown in Figure 4 for better readability.
Figure 4 : Rename the Feature Folder |
6. In Solution Explorer, right-click the SPCustomDevelopment project, select Add , and then select New Item as shown in Figure 5.
7. In the Add New Item dialog box, select the Empty Element template, type Site Columns as the name, and then click Add as shown in Figure 6.
8. Open the Elements.xml file inside Site Columns project item and then replace the file content with the following code example.
<Field ID="{6F87C38C-5218-45D8-905E-877D694ECC31}"
Type="Choice"
Name="Technology"
StaticName="Technology"
Description="Select the technology on which this book is written."
DisplayName="Technology"
Format="Dropdown"
Group="SharePoint 2010 Custom Development"
Required="TRUE"
Overwrite="TRUE"
>
<CHOICES>
<CHOICE>C#</CHOICE>
<CHOICE>ASP.NET</CHOICE>
<CHOICE>SharePoint 2010</CHOICE>
<CHOICE>MOSS 2007 and WSS 3.0</CHOICE>
</CHOICES>
</Field>
<Field ID="{52AE411D-32FB-484C-A04F-ED6C7E41A593}"
Type="Text"
Name="Publication"
StaticName="Publication"
DisplayName="Publication"
Description="Type the Publication of this book."
Group="SharePoint 2010 Custom Development"
Required="TRUE"
Overwrite="TRUE"/>
<Field ID="{7D8A68DA-3A2D-444D-A721-1E7A6633402B}"
Type="Currency"
Name="PriceOfBook"
StaticName="PriceOfBook"
DisplayName="Price"
Description="Enter the book cost."
Group="SharePoint 2010 Custom Development"
Required="TRUE"
Overwrite="TRUE"/>
<Field ID="{E93762F1-6F7E-4DFC-9161-0B3B35A7BE35}"
Type="UserMulti"
Name="BookAuthors"
StaticName="BookAuthors"
DisplayName="Authors"
Description="Enter the book authors"
Group="SharePoint 2010 Custom Development"
Required="TRUE"
Mult="TRUE"
UserSelectionMode="0"
UserSelectionScope="0"
Overwrite="TRUE"/>
|
9. Save the file.
10. Add
the Site Columns project item to Site Columns feature as shown in Figure 7.
11. Right click the solution name and then click Deploy as shown in Figure 8. Visual Studio 2010 will build and deploy the solution to the farm/ site collection depending upon the deployment methodology selected in Step 2.
12. VS
2010 will activate the feature Site
Columns and custom site columns
will be created into the Site Column gallery. Navigate to local site collection=>Site Settings=>Site Column. Filter the
columns displayed using Show Group
dropdown as shown in figure 9.
Figure 9: Custom site columns present in the Site Column gallery |
b.
Programmatic
manner
I find this method more error
prone and also it becomes difficult to maintain the code in case there is need
of creating huge number of site columns. Hence I prefer declarative method
rather than going for this. However, for certain type of site columns e.g lookup
columns, metadata columns, it becomes mandatory to create them programmatically
in certain situations. We will see how to create lookup columns, metadata
columns in my later blogs.
The logic is to get the
SPFieldCollection object of SPWeb or SPList and then make use of
SPFieldCollection.Add and SPFieldCollection.AddFieldAsXml methods to create the field. My personal
recommendation is to use later one as it is more powerful e.g. it gives you
option to add the new field into all associated content types of list, add new
field into the default list view or even adding your own custom attributes.
Refer the figure below.
Site columns Vs List
columns
The fields which are stored in Site Column gallery at site collection
level are termed as Site Columns. These columns are available for use in entire
site collection.
The fields which are created directly in list or once site
columns from site column gallery are used in list, then they are termed as List
Columns. When existing site column (parent) is added to the list, parent field does not get directly associated with the list. Instead a separate
field definition copy is created which derives from its parent field. This
separate copy of site column (list column) is associated with list. Hence changes made in List column does not reflect in Site Columns but changes made Site Columns can be reflected in derived list columns in some cases.
In declarative way, the changes in columns through element manifest get reflected
in site columns present in site column gallery only. Propagating the site
column changes to the list columns can be achieved either by programmatic way or
through browser. However doing so, make list columns customized. Once
list column is customized, it gets detached from its parent site column and further
propagation of changes done through programmatic way or through browser might not work.
SharePoint does not support phased deployment for many of
its artifacts and site column is one of the them. Rather, I should say it is
one of the most painful area in phased deployment. It has given me bad memories
in my past…Ohh…I still remember…such a nightmare it was…The problem lies in
SharePoint architecture of site columns and list columns. So what to do in case
when phased deployment is unavoidable… my take is to create all the site
columns and content types required for all the phases in one go and deploy them
in first deployment only….and then pray that future phases or change requests won’t need any
changes in them….
Key Take Away Points
1. The
site columns created in declarative manner are kept in Site Column gallery.
Hence the feature who creates them must be site collection scoped feature
2. The
changes made in declarative site column definitions are reflected in Site
Column gallery only. The list columns inherited from declarative site columns
will not reflect the changes.
3. Site
columns do not support phased deployment. Hence create all the site columns
required in all phases in first deployment of the application.
4. Don’t
create site columns programmatically…it is error prone and not recommended way…
5. If
you are creating the site columns through browser interface, then do not create
the site columns directly in list unless unavoidable (except look up/ metadata
columns). First create the site columns in Site Column gallery and then add
them to list level. This makes maintenance and support job lot easier.
To end this, will suggest to have a look at an OOB feature
“SharePointRoot\TEMPLATE\FEATURES\fields” for reference purpose. It has field definitions of OOB site columns. In addition,
you can also take help of magical power of SharePoint Manager 2010 (http://spm.codeplex.com/) to check the
field schemas.
Time for a tea break...too hot in office during weekends without AC...can't wait for my laptop so that I can Learn from home...have booked it yesterday in Dell India, Hyderabad. Was not aware that it takes 8 days. :-(
Time for a tea break...too hot in office during weekends without AC...can't wait for my laptop so that I can Learn from home...have booked it yesterday in Dell India, Hyderabad. Was not aware that it takes 8 days. :-(
really nice article. for my use case, I have to create the field programmatically. how do you obtain the registry format GUIDs? Do you just generate them in VStudio?
ReplyDeleteGlad you liked it. Go to the Tools menu in Visual Studio where you will find Create GUID option using which you can generate registry format GUIDs. Or you can make use System.Guid.NewGuid()to create it in code.
Deletevery nice article thanks
ReplyDeleteRegards,
Zuri
zurijackshot@gmail.com
Great post! It's complete and really helpful.
ReplyDelete