Sharepoint本身就是一個豐富的大容器,里面存儲的所有信息我們可以稱其為“內容(Content)”,為了便於管理這些Conent,按照人類的正常邏輯就必然想到的是對此進行“分類”。分類所涉及到的層面又必然包括:
1、分類的標准或特征描述{即:類型屬性(或:與該類型項目相關聯的屬性)}。
2、對應類的關聯動作(即:工作流,行為以及其他設置)
在Content Type的組織上還有一個Content Type Group,每一種Content Type分屬於不同的Group。
我們以家里的東西為例,你家里的各種物品就算是家里的Content,你可以對它們定義不同的Content Type,如:書籍,廚房用具等等。
書籍類涉及到的屬性可以有書籍名,作者名,ISBN,書籍類別,出版日期。這些屬性定義都基於預先定義好的公共屬性描述(Site Columns),在書籍類我們可以定義相關的工作流 eg:借閱工作流,保管工作流....,可以定義在操作書籍類時使用到的管理表單,讀書卡等等.......
因此,在Sharepoint中也基本按照此邏輯進行管理,我們看看微軟對Content Type的定義:
內容類型(Content Type) 是 Microsoft SharePoint Foundation 2010 列表或文檔庫中一類項目或文檔的元數據(列)、工作流、行為以及其他設置的可重用集合。借助於內容類型,可以采用集中的可重用方式來管理一類信息的設置。
也就是說: 內容類型用於定義列表項List Item、文檔Document或文件夾Folder的屬性。每種內容類型都可以指定:
1.與該類型項目相關聯的屬性
2.可以從該類型項目啟動的工作流
3.文檔模板(針對文檔內容類型)
4.可用的文檔轉換(針對文檔內容類型)
5.自定義功能
您可以將內容類型與列表或庫相關聯。當您執行此操作時,即表示您正在指定該列表或庫可以包含此種內容類型的項目,並且該列表或庫中的“新建”命令將允許用戶新建此類型的項目。
Sharepoint支持一個Document Library關聯多個Content types. 但對於Document library或list中的某個Item,允許一個且只能是一個Contenttype與它關系,這個好理解,好比一個容器可以存放好幾類的物品,但一個物品只能屬於某一個種類,否就會引起管理上的混亂。
而一個Content Type必然需要一組描述其特征的屬性.例如:貓科動物類,那么就你就要有一組特征來描述貓科動物類以區別其它類。描述特征所用的每一個屬性占用一個Field來表示。每一個Field其實都屬於某一個Site Column。
你還可以關聯一個Document template給某個Content Type,這樣在創建此類Content Type的實例時就可以要求用戶同時填寫一個基於此Document Template的Document文檔,連同包含此Conent Type的List Item實例一起存儲在List中。
當創建一個新的ContentType時,你最好先到Sharepoint預定義的Column Groups(eg:Base Columns, Core Contact and Calendar Columns, Core Document Columns, Core Task and Issue Columns, Custom Columns, Extended Columns)中去找找有沒有現成的Site Column供你使用,而不是急着另外創建一個新的Site Column.這樣做的好處是為保持系統內Site Column定義的一致性以及今后的維護管理提供方便。
Content Type是按照層次關系進行組織的,所有的ContentType都有它們的Parent ContentType,如果對它們的Parent Content Type進行修改,那么這種改動會推及到這些Child Content Type,但反之則不然。Content Type的層次關系如下圖:
由圖可見,所有的Content Type都來自System下的Item,而Item是一個隱藏的Content Type,它里面沒有包含任何Column。
Content Type按作用范圍可分為Site Collection Level的和List Level的。前一個層次作用於整個Site Collection,而后一個層次則只對某個特定的List起作用。
既然Site Columns是按照Site Column Groups進行組織的,Content Types也是按照Content Type Groups進行組織的,下面就是系統常用的Content Type Groups:
• Document Content Types
• Folder Content Types
• Group Work Content Types
• List Content Types
• Special Content Types
我們可以使用兩種途徑來創建Content Type
1、通過Sharepoint的UI創建
2、通過Visual Studio編碼創建
這里我們看看如何通過VisualStudio編碼創建,首先打開VS2010,新建一個項目,使用Content Type模板,Solution命名為MyContentType1
選擇新建的Solution為Farm類型
確定此新建的ContentType基於Picture
新建項目如下圖:
我們新增的Content Type將在ContentType1點的Elements.xml中進行定義。請輸入代碼內容如下:
< ContentType ID ="0x01010200404203548fea4e479b7684c563248c8b"
Name ="MyContentType1 - ContentType1"
Group ="Custom Content Types"
Description ="My Content Type"
Version ="0" >
< FieldRefs >
<!-- Date Picture Taken -->
< RemoveFieldRef ID ="{a5d2f824-bc53-422e-87fd-765939d863a5}" />
<!-- Picture Size -->
< RemoveFieldRef ID ="{922551b8-c7e0-46a6-b7e3-3cf02917f68a}" />
<!-- About Me -->
< FieldRef ID ="{e241f186-9b94-415c-9f66-255ce7f86235}" DisplayName ="Information About this Picture" />
<!-- Cameral Used -->
< FieldRef ID ="{B8A42D20-BE9C-48ED-AFC1-78BD48C523A9}" DisplayName ="Cameral Used" />
</ FieldRefs >
</ ContentType >
項目如下圖:
對代碼說明如下:
一、Content Type相關屬性
1、Content Type ID:即內容類型ID
內容類型的ID是識別內容類型的唯一標識,它隱含了內容類型的上下級繼承關系,即從內容類型ID中可以看出此內容類型是繼承自哪個父內容類型的,內容類型ID中包含了父內容類型ID,我們可以從內容類型ID號中找到頂級的系統內容類型。
WSS 3會使用ID號中的這些信息來確定內容類型之間的關系,以及執行操作。
內容類型可以使用兩種方式中的任何一種表示,而系統內容類型ID為”0x”, 所有其它內容類型都從系統內容類型繼承。所有其它內容類型ID都必須使用以上兩種方式之一創建一個ID號,並且此ID號在站點集里必須為唯一的,下面就是這兩種表示方法:
規則 a、 父內容類型ID + 兩位十六進制的值(兩位十六進制的值不能是00),如:0x0101
WSS自帶的內容類型ID均以這種方式生成。例如:基本內容類型Item的ID號為0x01,此ID指示Item的類型內容是直接繼承自系統內容類型。文檔內容類型(Document content type)的ID號為0x0101,文件夾內容類型(Folder content type)的ID號為:0x0120, 分以這兩個ID號,我們可以看出,文檔內容類型和文件夾內容類型都繼承於Item內容類型,而Item內容類型又繼承自系統內容類型
規則b、 父內容類型ID + “00” + 十六進制GUID,如:0x010100D5C2F139516B419D801AC6C18942556D
WSS在以下幾種情況下創建內容類型時,將使用此種規則成生內容類型ID:
1、 基於其它內容類型創建網站內容類型
2、 當增加一個網站內容類型到某個列表時,系統會將網站內容類型復制到此列表並生成為列表內容類型,此生成的內容類型ID
在以下幾種情況時,推薦使用GUID方式的內容類型ID:
1、 繼承自系統默認的內容類型,如文檔內容類型
2、 繼承自第三方開發的內容類型,使用GUID的內容類型ID,能保證內容類型的唯一,並且不會跟將來開發人員繼承此第三方控制生成的新內容類型ID重復
當你使用GUID方式定義了一個內容類型的ID后,你仍然可以使用第一種方式給繼承於此內容類型的類型命名。使用在ID中的GUID可以擔當命名空間的角色,任何繼承自此內容類型的類型都能加上兩位的十六進制數值來表示新ID,如“0x010100D5C2F139516B419D801AC6C18942556D08”
內容類型ID最大長度為512字節,因為一個字節可以存放兩個十六進制的值,所以一個內容類型ID最多可使用1024個字符。
下圖是一些系統的ContentType及其ID表
這里是一些Content Type ID的例子
0x0106000BB3F82D2A624B77833C28045F765D7B
2.創建一個content type,它的GUID {0E3E8F35-3A21-4ed7-8151-816C48E2D64D} ,它的Parent是document (0x0101),那么,你可以設置其ID如下:
0x0101000E3E8F353A214ED78151816C48E2D64D
3.創建一個content type,它的GUID {A6C62A39-E374-4d8d-9EFE-90DD65B659F8} ,它的Parent是 item (0x01),那么,你可以設置其ID如下:
0x0100A6C62A39E3744D8D9EFE90DD65B659F8
2、Content Type的Name屬性:就是我們給這個Content Type起的標識名
3、Content Type的Group屬性:我們把這個Content Type划分入Content Type Group的哪一個組,即分組管理我們的Content Type
4、Content Type的Description屬性: 對這個Content Type的說明
5、Content Type的Inherits屬性: 這個屬性要結合我們后面講的<RemoveFieldRef>元素使用,如果此處設置Interits='True',則<RemoveFieldRef>不會起作用。因此,我們需要取掉它的設置。
6、Content Type的Version屬性:定義它的版本號
二、 <FieldRefs> 元素內容
<FieldRefs> 元素內才是我們真正定義的Content Type的內容,這里我們分別說明
1、 <RemoveFieldRef>元素 : 此元素定義我們想要移除的Field
由於我們新增的Content Type是繼承自Picture,所以它擁有Picturey這個Parent Content Type的所有Field,即繼承關系,但在此處,我們不想要從Picture繼承來的"Date Picture Taken" 與 "Picture Size"這兩個Field,所以我們需要作的工作包括 :
a.移除Content Type的Inherits屬性
b.添加<RemoveFieldRef>元素
因為如果Content Type的Inherits屬性設置為Ture,則不管我們在這里設置了任何RemoveFieldRef元素,它們都不會起作用,系統會強行讓我們新創建的這個ContentType繼承所有其Parent Content Type所具有的fields,所以我們必須要打破我們新定義的Content Type與它的Parent: Picture之間的繼承關系。
接下來就是我們如何知道我們想要取消的Field它們的ID值呢?
我們可以使用VS2010里的Server Exploer這個工具,當我們使用Server Exploer這個工具建立了與Sharepoint網站的連接后,我們就可以看到此網站的各種對象
展開ContentType節點,找到Picture節點,然后就可以查看到對應Field的ID號,可以直接復制到本Solution中來。
2、 <FieldRef>元素 : 定義我們想要添加的新的Field
在本例中,我們添加了兩個Fields,一個是系統本來就有的Site Column,名叫About Me,獲取其ID的方法同上既:使用Server Exploer
我們給了它一個新的DisplayName="Information About this Picture",這個DisplayName將會顯示在Sharepoint的Content Type的管理UI界面上。
< FieldRef ID ="{e241f186-9b94-415c-9f66-255ce7f86235}" DisplayName ="Information About this Picture" />
上面我們添加或移除的都是系統已經存在的Site Columns,如果我們想要操作的Site Column不存在那怎么辦呢,我們既可以通過Sharepoint UI來創建那個Site Column,也可以通過Visual Studio2010來創建,具體的方法參考此文 Sharepoint學習筆記—Site Definition系列-- 創建Site Columns
接下來請Build和部署此Solution,然后到Sharepoint網站去查看
可以看到我們新增的Content Type已經出現在預期的位置
並且它的內容正是我們此處所定義的內容(移除了兩個Fields,添加了兩個Fields,其中一個是系統自帶的,一個是我們上文用VS2010開發的)