SharePoint 開発の本質 (4) : フィーチャーのカスタマイズ


本内容は、SharePoint Server 2007 をベースに記載しています。(2008 年に記載したコラムです。コラム終了のため、こちらに移動しました . . .)
最新の SharePoint 2010 を使用した製品開発手法については、「SharePoint Server 開発 サンプル コード集 : 10 行コードで作る .NET アプリケーション」を参照してください。

「UI / Web パーツで見るフィーチャー フレームワーク」では、SharePoint 独自の世界である「フィーチャー」の存在意義について簡単に説明しました。平たく記述してしまうと「XML で記述された SharePoint 上の機能 (フィーチャー) の定義」です。
ここでは、このフィーチャーの基本的概念を理解し、さらに応用的な例なども考察してみましょう。

SharePoint 開発の本質

SharePoint では、Web パーツ、ワークフローなどのコンポーネントも「フィーチャー」として定義 (ラッピング) して利用しました。この他にも、SharePoint をお使いの方にとってお馴染みの「サイト」、「リスト」、「コンテンツタイプ」、「フィールド」 (列) など、SharePoint のほとんどのカスタマイズはフィーチャーフレームワークを使ってインストールすることが可能です。以降では、「リスト」を例にフィーチャーカスタマイズの基本概念を述べていきます。

まず、いかなるフィーチャー開発でも、その対象とするオブジェクトの基本的性格を理解しておくことが重要です。今回扱う SharePoint の「リスト」には、実は、「リスト定義」、「リストインスタンス」と呼ばれるオブジェクトが存在しているという点を製品レベルの開発者は理解しておきましょう (無論、一般の利用者は、こうした知識は必要ありません)。

「リスト定義」は SharePoint Server 上で実際に動いているリストではなく、リストのインスタンスを作成する際に使用されるリストの雛型です。SharePoint 上でリストを作成する際にどのようなリストを作成するか一覧から選択をおこないますが、このいくつかはリスト定義としてインストールされています。

補足 : ここでは省略しますが、この他に「リスト テンプレート」と呼ばれる種類のオブジェクトも存在します。「リスト テンプレート」は「リスト定義」に似ていますが、その違いは「リスト定義」の差分情報を定義しているオブジェクトであるという点です。このため、元となる「リスト定義」に変更などがおこなわれると、その「リスト テンプレート」は使用できなくなります。管理者の方はご存じの方も多いと思いますが、この「定義」と「テンプレート」の概念は「サイト」にも存在しています。(管理者は、既存のサイト インスタンスを基としてサイト テンプレートを容易に構築することができるようになっています。)

一方、「リスト インスタンス」は、その名から想像できるように「リスト定義」などから作成される個別のリスト (実際にユーザーが使用するリスト) になります。
いずれもフィーチャーフレームワークを使用して設定することが可能ですが、今回は「リスト定義」のフィーチャーを作成してみましょう。

フィーチャー作成では一般に、

  1. フィーチャーを定義した feature.xml
  2. その中から参照される要素のマニフェストファイル (.xml)
  3. 関連するその他のファイル (各種)

の 3 種類のファイルが必要です。

feature.xml (上記 1) は、「フィーチャーのタイトル」、「使用する要素のマニフェストファイル」、「関連するその他のファイル」など、すべての SharePoint フィーチャーに共通の属性を定義しています。一方、feature.xml から参照される要素のマニフェストファイル (上記 2) は、フィーチャーの種類ごと (例:リスト、フィールド、ワークフロー、など) の独自の情報を定義しています。例えば、この連載の 「ワークフロー フィーチャー」 で作成したフィーチャー定義をもう 1 度参照してみてください。この中で feature.xml と MyWorkflow.xml という 2 種類のファイルを作成していましたが、後者はワークフロー専用の定義を記述したワークフローマニフェストと呼ばれる要素のマニフェストファイル (上記 2) です。さらに、ワークフローに独自な画面 (InfoPath のフォーム、など) を作成してワークフローと連携させたい場合には、こうした関連するフォームファイルなど (上記 3) もフィーチャー定義の一部として準備し、feture.xml 内部で使用するファイルとして列挙しておきます。

以降の説明では、それぞれがどの位置づけのファイルであるかを意識しながら読み進めてください。

では、まずリスト定義を作成するため、以下のfeature.xmlファイルを作成します。

補足 : SharePoint のフィーチャー定義を Visual Studio 上で編集する際には、[スキーマ] として %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML\wss.xsd を選択します。(インテリセンスを使用して快適に編集できます)

feature.xml

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
  Id="BA3916F5-E2B4-44f8-916E-112D569FDAA1"
  Title="テスト用のリスト"
  Scope="Web"
  Version="1.0.0.0">
  <ElementManifests>
    <ElementManifest Location="TestListTemplate.xml" />
    <ElementFile Location="schema.xml" />
  </ElementManifests>
</Feature>

この中の <ElementManifest> は、上述した要素のマニフェストファイル (上記 2) を定義しています (後ほど内容を説明します)。また <ElementFile> は、上記 3 で記述した関連ファイルです。関連ファイルは、フィーチャーの種類によって、.aspx ファイル、.xsn ファイル、その他バイナリファイルなどさまざまですが、リスト定義の場合には、必ず schema.xml というリストのスキーマ定義情報を記述した XML ファイルを準備しておく必要があります (この内容も後述します)。
上記で <Feature> 要素の Scope 属性は重要です。SharePoint の機能 (フィーチャー) には、インストール (及び有効化) することで SharePoint のサイトコレクション全体 (Site) に対して有効になる機能と、サイトコレクションの中の個々のサイト (Web) で有効になる機能があり、フィーチャーの種類によってこのスコープ (Scope) が決まっています。例えば、SharePoint で CMS (コンテンツ管理) の仕組みを使用したい場合には、「Office SharePoint Server 発行インフラストラクチャー」という機能 (フィーチャー) をサイトコレクションで有効にして基本的なブランディングのためのインフラを使用できるようにしてから、このインフラを使用する「発行機能」という機能 (フィーチャー) を個々のサイトで有効にすることにより、はじめてそのサイトで CMS 的な機能 (Web コンテンツクリエーター向けの専用機能) を使用することができるようになっています。今回作成する「リスト定義」は、サイト単位 (Web) のフィーチャーになります。
この feature.xml のサンプルでは必要最低限の要素・属性しか指定していませんが、他に、機能 (フィーチャー) の一覧で表示する説明文やアイコンなどさまざまな情報も指定することができますので、必要な際に MSDN などのリファレンスを参照してください。(以降の定義ファイルも同様です。)

つぎに、上記の feature.xml から参照されているリスト定義要素のマニフェストファイル (TestListDefinition.xml) を作成します。

TestListDefinition.xml

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <ListTemplate
    BaseType="0"
    DisplayName="テスト用リスト"
    SecurityBits="11"
    Type="100">
  </ListTemplate>
</Elements>

BaseType 属性は、リストの場合には「0」、ドキュメントライブラリの場合には「1」を設定します。
またリストの種類に応じ Type 属性を設定します。例えば、「107」を指定することで「タスクリスト」として作成され、SharePoint 上の他のタスクリスト同様に扱うことが可能となります。今回は「100」(= 汎用リスト) として設定しています (Type の一覧については、以下が参考になります)。
また、ユーザーにリストのアイテムの読み込み権限を与えるよう、上記の SecurityBits は必ず設定しておきましょう。

[MSDN] Type の一覧、など

http://msdn.microsoft.com/ja-jp/library/ms462947.aspx

さいごに、「リスト定義」固有の schema.xml を作成します。

schema.xml

<?xml version="1.0" encoding="utf-8" ?>
<List xmlns:ows="Microsoft SharePoint"
  Title="TestList"
  Name="TestList"
  Direction="LTR"
  Url="Lists/My Test List"
  BaseType="0">
  <MetaData>
    <Fields>
      <Field Type="Number"
        List="TestList"
        DisplayName="費用"
        Name="Cost"
        ShowInNewForm="TRUE" />
      <Field Type="Choice"
        List="TestList"
        DisplayName="支出種別"
        Name="PaymentType"
        ShowInNewForm="TRUE">
        <CHOICES>
        <CHOICE>出張費</CHOICE>
        <CHOICE>雑費</CHOICE>
        </CHOICES>
      </Field>
    </Fields>
    <Views>
      <View BaseViewID="1"
        Type="HTML"
        WebPartZoneID="Main"
        DisplayName="All Items"
        DefaultView="TRUE"
        SetupPath="pages\viewpage.aspx"
        Url="AllItems.aspx">
        <Toolbar Type="Standard"/>
        <ViewHeader>
          <HTML>
          <![CDATA[<table>]]>
          </HTML>
        </ViewHeader>
        <ViewBody>
          <HTML><![CDATA[<tr>]]></HTML>
          <Fields>
            <HTML><![CDATA[<td>]]></HTML>
            <Field />
            <HTML><![CDATA[</td>]]></HTML>
          </Fields>
          <HTML><![CDATA[</tr>]]></HTML>
        </ViewBody>
        <ViewFooter>
          <HTML><![CDATA[</table>]]></HTML>
        </ViewFooter>
        <ViewFields>
          <FieldRef Name="Title" />
          <FieldRef Name="Cost" />
          <FieldRef Name="PaymentType" />
        </ViewFields>
      </View>
    </Views>
    <Forms>
      <Form Type="DisplayForm"
        Url="DispForm.aspx"
        SetupPath="pages\form.aspx"
        WebPartZoneID="Main" />
      <Form Type="EditForm"
        Url="EditForm.aspx"
        SetupPath="pages\form.aspx"
        WebPartZoneID="Main" />
      <Form Type="NewForm"
        Url="NewForm.aspx"
        SetupPath="pages\form.aspx"
        WebPartZoneID="Main" />
    </Forms>
  </MetaData>
</List>

SharePoint 上でリストを作成する際を思い出してください。作成する列、ビュー (及びそのフィルター条件) などを作成します。上記の schema.xml はこうしたリストの定義を XML で記述しています。
通常、リスト定義を作成する際には、関連ファイルとして、リストアイテムの作成用フォーム (.aspx) や編集用フォーム (.aspx) などもあわせて登録をおこなう必要があります (さらに、これらを feature.xml の <ElementFile> 要素として記述しておきます)。しかし、上記では、SetupPath 属性を使用して、リスト作成時にこうしたフォームを SharePoint の既存のフォームから自動作成するように指示しています。

補足 : これらコピー元のリスト用のフォームの実体は、%programfiles%\common files\microsoft shared\web server extensions\12\Template\Pagesのフォルダに存在しています (viewpage.aspx、form.aspx)。

また上記で、<ViewHeader>、<ViewBody>、<ViewFooter> では、作成した「ビュー」の表示方法を指定しています。ここでは <TABLE> タグを使用して表示をおこなうのみで、ヘッダーの表示や編集用のリンクの表示などはおこなっていませんので、登録したアイテムの編集もおこなうことはできない粗末なリストになります。

以上でフィーチャー作成に必要な 3 種類のファイルが揃いました。これらのファイルを第 4 章「そしてワークフロー、やはり基本は「.NET」 (2)」の際と同様に、Template\FEATURES フォルダの下にコピーして stsadm.exe コマンドを実行します。(今回は、MyTestList という名前のフォルダにコピーしたと仮定します。)

:: フィーチャーのインストール
stsadm -o installfeature -filename MyTestList\feature.xml
stsadm -o activatefeature -filename MyTestList\feature.xml -url http://localhost

:: IIS の再起動
iisreset

では、動作を確認してみましょう。
まずリストの新規作成をおこなう際に、下図のように「テスト用リスト」というリスト定義が表示されます。

リストを新規作成すると、下記のようにアイテムの編集ができない粗末なリストが作成されることでしょう。

このように、リスト、列、さらには ECB の UI 項目 (CustomAction) など、SharePoint 上のさまざまな機能 (フィーチャー) を実装できます。作成可能なフィーチャーの種類は下記が参照になります。

[MSDN] SharePoint の機能

http://msdn.microsoft.com/ja-jp/library/bb861828.aspx

さて、ここに記載していないもっと独自なフィーチャー (機能) はどのように組み込まれているのでしょうか。実は、SharePoint の feature.xml では、フィーチャーのインストール (Install) や有効化 (Activate) の際に実行する処理をプログラムコードで記述して組み込むことも可能です。つまり、コードで記述できることは、フィーチャーとして組み込むことができます。例えば、フィーチャーの有効化 (Activate) と同時にタイトルを変更し、無効化 (Deactivate) と同時にタイトルを元に戻すといったフィーチャーを作成することもできます。

補足 : この作成方法は、つぎの通りです。まず、SPFeatureReceiver クラスを継承したクラスライブラリを実装し、インストール時、有効化 (Activate) 時、無効化 (Deactivate) 時などのイベント処理を記述してビルドします。つぎに、作成されたアセンブリを SharePoint Server 上のグローバルアセンブリキャッシュ (GAC) に登録します。feature.xml には、ReceiverAssembly 属性 (アセンブリ名)、ReceiverClass 属性 (クラス名) を設定してこの自作のアセンブリを参照します。

機能をアセンブリとして実装したフィーチャーの例 (レコード収集機能)

<Feature Id="1dbf6063-d809-45ea-9203-d3ba4a64f86d"
  Title="$Resources:SearchAndProcessFeatureTitle"
  Description="$Resources:SearchAndProcessFeatureDescription"
  Version="12.0.0.0"
  DefaultResourceFile="dlccore"
  Hidden="TRUE"
  Scope="WebApplication"
  ReceiverAssembly="Microsoft.Office.Policy, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
  ReceiverClass="Microsoft.Office.RecordsManagement.Internal.SearchAndProcessFeatureReceiver"
  xmlns="http://schemas.microsoft.com/sharepoint/" />

また、より複雑な機能を実装する際には、機能を分割して実装し、インストールポイントのフィーチャー定義 (feature.xml) の中からこれら依存する機能を有効化することも可能です。例えば、前述した「Office SharePoint Server 発行インフラストラクチャー」の機能は、発行のための基本機能、ポータル ナビゲーション機能など、4 つの個別の機能の集合として定義されており、これらを呼び出して SharePoint に機能を組み込んでいます。

補足 : これらのフィーチャーは Hidden 属性を使って有効化 (Activate) する機能の一覧などから隠しておくことができます。

複数のフィーチャーの構成例 (発行インフラストラクチャー)

<?xml version="1.0" encoding="utf-8" ?>
<Feature Id="F6924D36-2FA8-4f0b-B16D-06B7250180FA"
  Title="$Resources:osrvcore,PublishingUberSiteFeatureTitle;"
  Description="$Resources:osrvcore,PublishingUberSiteFeatureDescription;"
  Version="12.0.0.0" Scope="Site"
  xmlns="http://schemas.microsoft.com/sharepoint/">
  <ActivationDependencies>
    <ActivationDependency FeatureId="A392DA98-270B-4e85-9769-04C0FDE267AA" />
    <ActivationDependency FeatureId="AEBC918D-B20F-4a11-A1DB-9ED84D79C87E" />
    <ActivationDependency FeatureId="89E0306D-453B-4ec5-8D68-42067CDBF98E" />
    <ActivationDependency FeatureId="D3F51BE2-38A8-4e44-BA84-940D35BE1566" />
  </ActivationDependencies>
</Feature>

ここでは、これら XML の定義情報 (CAML) をメモ帳などで編集していますが、Windows SharePoint Services 3.0 ツール : Visual Studio 2008 Extensions Version 1.2 (VSeWSS 1.2) を使用するとここで述べたさまざまな記述を自動化することが可能です。しかし、ツールは負荷を軽減することはあっても、"すべて" を自動化するものではありません。たとえ こうした便利なツールを使用してフィーチャーを作成する場合であっても、ここで述べたフィーチャーの基本知識は開発者にとって必要な知識となるでしょう。

 

Comments (0)

Skip to main content