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中進行定義。請輸入代碼內容如下:
<!-- Parent ContentType: Picture (0x010102) -->
<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的例子
1.建立一個content type,它的GUID {0BB3F82D-2A62-4b77-833C-28045F765D7B} ,它的Parent是contact (0x0106),那麼,你可以設定其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介面上。
<!--About Me-->
<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開發的)