Sharepoint学习笔记—Site Definition系列-- 2、创建Content Type

 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开发的)

 

 

   

转载于:https://www.cnblogs.com/wsdj-ITtech/archive/2012/09/01/2470274.html