Web コンテンツ管理対応の SharePoint サイトをカスタマイズしブランド設定する (パート 2/3): WCM を拡張する

概要 : この記事ではマスタ ページの構造、カスタム マスタ ページの作成手順、WCM 対応サイトのナビゲーションの基になるメカニズム、カスタム フィールド コントロールの作成、および [ページ編集] ツール バーのカスタマイズ方法を説明します。(19 印刷ページ)

Patrick Tisseghem、U2U (英語)

2006 年 10 月

適用対象 : Microsoft Office SharePoint Server 2007

目次

  • WCM の拡張の概要

  • マスタ ページの構造について

  • 既定のマスタ ページについて

  • カスタム マスタ ページを作成する

  • カスケード スタイル シートを追加する

  • ナビゲーションをカスタマイズする

  • カスタム フィールド コントロールを作成する

  • 編集モード エクスペリエンスをカスタマイズする

  • まとめ

  • 作成者について

  • 追加情報

WCM の拡張の概要

Microsoft Office SharePoint Server 2007 はインターネット プレゼンスと Web コンテンツ管理 (WCM) インフラストラクチャを提供する豊富なサイト定義を備えていますが、ほとんどの企業では既定の機能をカスタマイズし拡張する必要があります。Office SharePoint Server 2007 では、WCM のすべての機能と基になるアイテムの拡張性が高くなっています。

マスタ ページの構造について

ユーザーが Office SharePoint Server 2007 サイトに移動したときブラウザに表示される各ページは、マスタ ページおよび特定のページ レイアウト (テンプレート) に基づいて発行されたページを組み合わせたものです。このシリーズの最初の記事 (「Web コンテンツ管理対応の SharePoint サイトのカスタマイズとブランディング (パート 1/3): Web コンテンツ管理および既定の機能について」) では、マスタ ページとページ レイアウトの概要を説明しています。この記事ではさらに高度な内容を説明します。

サイト マスタ ページはマスタ ページ ギャラリーのサイト コレクションのレベルに格納されます。すべてのサイトはマスタ ページと関連付けられています。サイトに発行されるページでは、マスタ ページの外観を採用し、マスタ ページに定義されたナビゲーション コントロールを公開します。

Office SharePoint Server 2007 はマスタ ページを構成するさまざまな要素の探究に使用される優れた製品です。Microsoft Office SharePoint Designer 2007 を使うと、WCM 機能を使用するサイトの 1 つを開くことができます。ここでは例として、発行ポータルを使用します。フォルダ一覧で _catalogs ノードと masterpage ノードを展開します。BlueBand.master をダブルクリックし、ファイルのチェックアウトを確認します。図 1 に示すように分割モードに切り替え、デザイナとコード エディタを表示します。

図 1. SharePoint Designer で BlueBand.master を開く

SharePoint Designer で BlueBand.master を開く

SharePoint フレームワーク コントロール

名前の先頭に "SPSWC"、"SharePoint"、または "WebPartPages" が付いたコントロールは、Microsoft.SharePoint.Portal.dll または Microsoft.SharePoint.dll 利用できる Web コントロールまたは Web パーツであり、Windows SharePoint Services の一部または Office SharePoint Server 2007 で提供される追加部分です。これらのコントロールは WCM 機能に対応していないサイトを含め、すべてのサイトで使用できます。

たとえば、ページで検索機能を提供するコントロールです。マスタ ページに埋め込まれたナビゲーション コントロールは、Windows SharePoint Services に付属するコントロールの例です (図 2)。

発行されるページには Web パーツを入れることができます。マスタ ページには SPWebPartManager コントロールがあります。このコントロールは発行ページに埋め込まれる Web パーツの調整を行います。

図 2. マスタ ページの Web コントロールとナビゲーション コントロール

マスタ ページ内の Web およびナビゲーション コントロール

発行コントロール

名前の先頭に "PublishingWebControls" および "PublishingNavigation" が付くコントロールはサイトに WCM 機能を提供する Web コントロールです。

Microsoft.SharePoint.Publishing.dll で提供される PublishingWebControls:AuthoringContainer コントロールはページの最上部を作成します (図 3)。これは、Welcome ユーザー コントロール、[サイトの操作] メニュー、および作成コンソールをレンダリングする Microsoft ASP.NET ユーザー コントロールのコンテナです。

図 3. マスタ ページの作成コンテナ

マスタ ページ内でのコンテナの作成

名前の先頭に "PublishingNavigation" が付き、やはり Microsoft.SharePoint.Publishing.dll で提供される発行コントロールは、ページに直接表示されない Web コントロールです。PortalSiteMapDataSource Web コントロールは、ASP.NET 2.0 の一部であるサイト マップ プロバイダ モデルの最上部にレイヤーを追加します。ASP.NET 2.0 サイト マップ プロバイダ モデルはユーザー インターフェイス (UI) とデータ ソースが分離されたプラグ可能なナビゲーション モデルを提供します。Windows SharePoint Services 3.0 と Office SharePoint Server 2007 は機能を追加しますが、そのうち最も重要な機能はセキュリティによるトリミングです。図 4 は、SharePoint サイトでナビゲーションを行うさまざまなコンポーネント間でのやり取りの概要を示しています。

図 4. サイト マップ プロバイダ モデルのコンポーネント

サイト マップ プロバイダ モデルのコンポーネント

3 つの PortalSiteMapDataSource コントロールが埋め込まれています。各コントロールは、サイトの web.config ファイル内のプロバイダの定義にマップされます。SiteMapDataSourceRoot コントロールは CombinedNavSiteMapProvider コントロールを使用し、ブレッドクラム コントロールに接続されます。このコントロールは、その名前が示すように、2 つの他の PortalSiteMapDataSource コントロールを 1 つに組み合わせます。siteMapDataSource1 コントロールは最上部のナビゲーション バーにデータを提供します。siteMapDS コントロールは垂直ナビゲーション コントロールにデータを提供します。

ASP.NET ユーザー コントロール

ASP.NET サーバー コントロールに加え、ASP.NET ユーザー コントロール (.ascx files) もマスタ ページに埋め込まれています。

  • ページの最上部には、Welcome.ascx が表示されます。このコントロールはすべての SharePoint サイトに表示されます (WCM を使用していないサイトを含む)。

  • ページがバリエーション階層の一部である場合、VariationsLabelMenu.ascx が表示されます。ユーザーはこのコントロールを使用して、別のバリエーションの同じページに簡単にジャンプできます (図 5)。

    図 5. ユーザーが別の言語の同じページにジャンプできるようにする ASP.NET ユーザー コントロール

    同じページの異なるバージョン間でジャンプする ASP.NET ユーザー コントロール

  • PublishingConsole.ascx は、ページの発行サイクル内のすべてのステップを制御します (図 6)。このコントロールの詳細については、「編集モード エクスペリエンスをカスタマイズする」で説明します。

    図 6. コンテンツ作成者およびページの発行サイクルにかかわるユーザーが使用するコンソール

    ページの発行サイクルを管理するコンソール

  • PublishingActionMenu.ascx は [サイトの操作] メニューを提供するユーザー コントロールです。これは、WCM 機能に対応していないサイトで使用するユーザー コントロールとは異なります。

マスタ ページの最後のコントロール セットは ASP.NET ContentPlaceHolder コントロールです。最も重要なコントロールは PlaceHolderMain コントロールです。このコントロールは、Windows SharePoint Services が実際のコンテンツ ページを挿入する場所を示します。

既定のマスタ ページについて

Windows SharePoint Services 3.0 と Office SharePoint Server 2007 では、異なるマスタ ページを利用できます。BlueBand.master については詳しく調べましたが、スターターとして他のページを使用することもできます。

利用可能な他のページとの違いを調べるには、[サイトの設定] をクリックし、[外観] セクションで [マスタ ページ] をクリックします。[サイト マスタ ページの設定] ページで、サイト マスタ ページをマスタ ページ ギャラリーに格納されている任意のマスタ ページに変更できます。

  • Default.master は Windows SharePoint Services チーム サイトに使用されています。同じデザインをサイトに使用できます。

    説明したすべてのコントロールは default.master 内にあるような印象を受けるかもしれませんが、Office SharePoint Designer 2007 で default.master を開くと、ページに直接は発行コントロールが入っていないことに気付くでしょう。各コントロールは DelegateControl コントロールによって挿入されます。たとえば、マスタ ページの発行コンソールの定義を次に示します。

    <SharePoint:DelegateControl runat="server" ControlId="PublishingConsole" 
      PrefixHtml="&lt;tr&gt;&lt;td colspan=&quot;4&quot;&gt;" 
      SuffixHtml="&lt;/td&gt;&lt;/tr&gt;">
    </SharePoint:DelegateControl>
    

    委任コントロールは、Feature 内で表示するコントロールを決定する強力で柔軟性の高い方法です。たとえば、Feature は番号でシーケンス化された 2 つの検索コントロールをマニフェスト ファイルに定義できます。実行時には、ページの委任コントロールがシーケンス番号が最も小さい検索コントロールを選択し、そのコントロールをユーザーに表示します。委任コントロールは、ナビゲーション、検索などの領域の機能を有効にするため、Office SharePoint Server 2007 で頻繁に使用されます。

    クリーンな WCM インフラストラクチャを提供する場合、カスタム マスタ ページのスターターとして次のマスタ ページは使用しないでください。

  • BlueBand.master, BlackBand.master, and BlueGlassBand.master は同じファミリに属し、上部ナビゲーション バーと左側のナビゲーション バーを表示します。これらはサイトの候補として、またカスタマイズの出発点として適切です。

  • BlueVertical.master and BlackVertical.master はインターネット サイト向けに調整されたマスタ ページであり、WCM 関係のコントロールの表現が優れています。前の箇条書き項目で説明した 3 つのマスタ ページと同じ外観ですが、上部ナビゲーション バーはありません。

  • BlueTabs.master も既定のマスタ ページの代わりに使用することに適しています。異なる点は、上部ナビゲーション バーがタブ表示になっていることです。

  • OrangeSingleLevel.master and BlackSingleLevel.master は BlueBand マスタ ページのバリエーションですが、色の組み合わせが異なります。

カスタム マスタ ページを作成する

独自のカスタム マスタ ページの作成にはさまざまなオプションがあります。既存のマスタ ページのコピーを作成し、コントロールを並べ替えてレイアウトと外観を変更できます。または、空のページから始めて独自のページを作成できます。

SharePoint Designer でサイトを開きます。[ファイル] メニューの [新しいページ] をクリックします。[新規作成] ダイアログ ボックスにはさまざまな選択肢があります。[マスタ ページ] を選択すると、空のマスタ ページが表示されます。空のページで始めると、作業量が多くなり、問題が発生する可能性があることに注意してください。空のファイルには、Office SharePoint Server 2007 に付属するページ レイアウトとコンテンツ ページの操作に必要なすべてのコンテンツ プレースホルダがないためです。次のコード例は、できるだけ簡単なマスタ ページを表しています。

<%-- Identifies this page as a .master page written in C# and registers 
tag prefixes, namespaces, assemblies and controls. --%>
<%@ Master language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Register Tagprefix="SPSWC" Namespace="Microsoft.SharePoint.Portal.WebControls" 
Assembly="Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" 
Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" 
Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="PublishingWebControls" Namespace="Microsoft.SharePoint.Publishing.WebControls" 
Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="PublishingNavigation" Namespace="Microsoft.SharePoint.Publishing.Navigation" 
Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="wssuc" TagName="Welcome" 
src="~/_controltemplates/Welcome.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="DesignModeConsole" 
src="~/_controltemplates/DesignModeConsole.ascx" %>
<%@ Register TagPrefix="PublishingVariations" TagName="VariationsLabelMenu" 
src="~/_controltemplates/VariationsLabelMenu.ascx" %>
<%@ Register Tagprefix="PublishingConsole" TagName="Console" 
src="~/_controltemplates/PublishingConsole.ascx" %>
<%@ Register TagPrefix="PublishingSiteAction" TagName="SiteActionMenu" 
src="~/_controltemplates/PublishingActionMenu.ascx" %>
<%-- Uses the Microsoft Office namespace and schema. --%>
<html>
  <WebPartPages:SPWebPartManager runat="server"/>
  <SharePoint:RobotsMetaTag runat="server"/>

  <%-- The head section includes a content placeholder for the page 
  title and links to CSS and JavaScript files that run on the server. --%>
  <head runat="server">
    <asp:ContentPlaceHolder runat="server" id="head">
      <title>
        <asp:ContentPlaceHolder id="PlaceHolderPageTitle" runat="server" />
      </title>
    </asp:ContentPlaceHolder>
    <Sharepoint:CssLink runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server" />
  </head>

  <%-- When loading the body of the .master page, MOSS 2007 also loads 
  the SpBodyOnLoadWrapper class. This class handles .js calls for the 
  master page. --%>
  <body onload="javascript:_spBodyOnLoadWrapper();">
    <%-- The SPWebPartManager manages all of the Web part controls, 
    functionality, and events that occur on a Web page. --%>
    <form runat="server" onsubmit="return _spFormOnSubmitWrapper();">
      <wssuc:Welcome id="explitLogout" runat="server"/>
      <PublishingSiteAction:SiteActionMenu runat="server"/>
      <PublishingWebControls:AuthoringContainer id="authoringcontrols" 
      runat="server">
        <PublishingConsole:Console runat="server" />
      </PublishingWebControls:AuthoringContainer>
      <%-- The PlaceHolderMain content placeholder defines where the 
      page content should go for all the content from the page layout. 
      The page layout can overwrite any content placeholder from the 
      master page. Example: The PlaceHolderLeftNavBar can overwrite the 
      left navigation bar. --%>
      <asp:ContentPlaceHolder id="PlaceHolderMain" runat="server" />
      <asp:Panel visible="false" runat="server">
        <%-- These ContentPlaceHolders are necessary only to ensure all 
        default MOSS 2007 pages render with this master page. If the 
        system master page is set to any default master pages, the only 
        content placeholders required are those that are being 
        overridden by your page layouts. --%>
        <asp:ContentPlaceHolder id="PlaceHolderSearchArea" runat="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderTitleBreadcrumb runat="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderPageTitleInTitleArea" runat="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderLeftNavBar" runat="server"/>
        <asp:ContentPlaceHolder ID="PlaceHolderPageImage" runat="server"/>
        <asp:ContentPlaceHolder ID="PlaceHolderBodyLeftBorder" runat="server"/>
        <asp:ContentPlaceHolder ID="PlaceHolderNavSpacer" runat="server"/>
        <asp:ContentPlaceHolder ID="PlaceHolderTitleLeftBorder" runat="server"/>
        <asp:ContentPlaceHolder ID="PlaceHolderTitleAreaSeparator" runat="server"/>
        <asp:ContentPlaceHolder ID="PlaceHolderMiniConsole" runat="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderCalendarNavigator" runat ="server" />
        <asp:ContentPlaceHolder id="PlaceHolderLeftActions" runat ="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderPageDescription" runat ="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderBodyAreaClass" runat ="server"/>
        <asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat ="server"/>
      </asp:Panel>
    </form>
  </body>
</html>

この最小限のマスタ ページには、PlaceHolderMain コントロール内でレンダリングされた発行ページのコンテンツと発行ページのタイトルのみが表示されます。このマスタ ページを完成する最適の方法は、BlueBand.master ページを開き、利用可能にするさまざまなコントロールを独自のマスタ ページに埋め込むことです。

  • ナビゲーションを処理する PortalSiteMapDataSource コントロールと ASPMenu コントロール

  • [サイトの操作] メニューと発行コンソールを表示するさまざまな ASP.NET ユーザー コントロール

カスケード スタイル シートを追加する

ページの外観を定義するには、カスケード スタイル シート (CSS) を使用します。Office SharePoint Server 2007 は、さまざまなサイト定義が入ったいくつかの CSS ファイルを備えています。WCM 対応サイトの場合、スタイル ライブラリによりサイト コレクション レベルで利用できます。コンテンツを確認するには、[サイトの操作] メニューから [サイトのコンテンツと構造] ページを開きます。スタイル ライブラリには、サイトでサポートする各ロケールのサブフォルダが入っています。ローカライズされた CSS ファイルを該当するフォルダに追加できます。

カスタム マスタ ページでは Band.css を使用できますが、独自の CSS ファイルを作成し、スタイル ライブラリにアップロードすることもできます。スタイル ライブラリの CSS ファイルの 1 つとマスタ ページをリンクするには、Microsoft.SharePoint.WebControls.CSSRegistration コントロールを使用します。

<SharePoint:CssRegistration name="<% $SPUrl:~sitecollection/Style Library/~language/Core Styles/Band.css %>" runat="server"/>
<SharePoint:CssRegistration name="<% $SPUrl:~sitecollection/Style Library/~language/Core Styles/controls.css %>" runat="server"/>

SharePoint Designer では、[スタイルの適用] 作業ウィンドウに、ページのさまざまな要素やコントロールと関連付けることができるすべての CSS クラスが表示されます。

サイトの管理者は、[サイト マスタ ページの設定] ページを使用して、代替 CSS URL を簡単に定義できます。このオプションを使用すると、マスタ ページを直接編集せずに新しいスタイルを定義し、既存のスタイルをオーバーライドできます。

注意

スタイルのカスタマイズの詳細については、「[方法] スタイルをカスタマイズする」を参照してください。

ナビゲーションをカスタマイズする

次の 3 つのアイテムはユーザーにページのナビゲーション機能を提供します。

  • サイト マップ プロバイダ。コンテンツ データベースに格納されたナビゲーション データを取得します。

  • SiteMapDataSource コントロール。ナビゲーション コントロール自体とナビゲーション データの基になるプロバイダ間の抽象化層を提供します。

  • ブレッドクラム、上部ナビゲーション バーに表示されるメニューなどの UI ナビゲーション コントロール

これら 3 つのレベルで拡張しカスタマイズできます。

サイト マップ プロバイダ

SharePoint 製品とテクノロジにおけるサイト マップ プロバイダの役割は ASP.NET Web アプリケーションの場合と同じです。Office SharePoint Server 2007 では、プロバイダを使用してコンテンツ データベースに格納されたナビゲーション データにアクセスし、このナビゲーション データを SiteMapNode 型のノード ツリーとして表示します。さまざまなナビゲーション コントロールで 4 つのサイト マップ プロバイダを使用します。

SPSiteMapProviderSPContentMapProvider、および SPNavigationProvider は Windows SharePoint Services クラスの一部です。PortalSiteMapProvider は Office SharePoint Server 2007 オブジェクト モデルの一部です。他のプロバイダも利用できます。SharePoint サイトをホストする Microsoft インターネット インフォメーション サービス (IIS) Web アプリケーションに関連付けられた web.config ファイルにすべてのプロバイダの登録があります。

ほとんどの場合、ナビゲーション コントロールに必要なデータを渡すには、これらのプロバイダで十分です。しかし、独自のプロバイダを作成し、メモリのノード ツリーを使って独自のデータ マッピング方法を定義し、独自のナビゲーション コントロールでデータ マッピングを使用できるようにすることもできます。カスタム サイト マップ プロバイダを作成するには、ASP.NET の一部である SiteMapProvider 基本クラスまたは SharePoint プロバイダ クラスの 1 つから継承したクラスを作成します。後者の方法を使用することをお勧めします。たとえば、PortalSiteMapProvider をサブクラス化できます。このようにすると、適切なキャッシュとセキュリティによるトリミングが確保されます。カスタム サイト マップ プロバイダの例は Office SharePoint Server 2007 SDK で説明されています。

SiteMapDataSource コントロール

SiteMapDataSource コントロールは、TreeView コントロール、Menu コントロールなど、いくつかのナビゲーション コントロールで使用され、 ナビゲーション コントロールと SiteMapProvider クラス間の抽象化層として機能します。その主な役割は、ナビゲーション データのビューを表し、さまざまなプロパティや属性によってカスタマイズできるようにすることです。たとえば、SiteMapDataSource コントロールを使用して、ノードのツリーでナビゲーション コントロールを開始する場所、および表示するレベル数を指定します。

筆者の WCM 対応サイトで使用しているコントロールは PortalSiteMapDataSource コントロールです。これは System.SharePoint.Publishing.Navigation 名前空間の一部です。

UI ナビゲーション コントロール

最も使用されるナビゲーション コントロールは Microsoft.SharePoint.WebControls.AspMenu です。このコントロールはメニューベースのナビゲーションを提供します。マスタ ページの HTML で、またはオブジェクト モデルによりプログラムで多くのプロパティを設定できます。独自のカスタム ナビゲーション コントロールの作成の詳細については、多くの ASP.NET 2.0 リソースを参照してください。

カスタム フィールド コントロールを作成する

このシリーズの最初の記事 (「Web コンテンツ管理対応の SharePoint サイトのカスタマイズとブランディング (パート 1/3): Web コンテンツ管理および既定の機能について」) で説明したように、発行ページでコンテンツを提供するか取得するにはフィールド コントロールを使用します。フィールド コントロールは、ページ レイアウトに関連付けられたコンテンツ タイプのレベルで定義するフィールドの種類と密接に結び付いています。たとえば、1 行テキスト タイプの "役職名" という列を追加すると、編集モードではテキスト ボックス フィールド コントロール、レンダリング モードではプレーン テキストが表示されます。Microsoft.SharePoint.Publishing.dll は、ページ レイアウトの設計で使用できる新しい種類のフィールドを追加します。

これらのフィールドで足りない場合でも、 ページ モデルを構成するアイテムは拡張性が高くなっています。マスタ ページのカスタマイズについては確認しましたが、Windows SharePoint Services または Office SharePoint Server 2007 の一部としては提供されていない特殊な方法でデータの取得と表示を行う追加フィールド コントロールを作成することもできます。

アドレス フィールド コントロールを作成する

SharePoint リストとライブラリの通常の種類のフィールドとして、またページ レイアウトのフィールド コントロールとして使用できるアドレス フィールドの種類を作成するプロセスを説明します。Microsoft.SharePoint.Publishing.dll の一部であるフィールド コントロールから継承して、ページ レイアウトでのみ使用されるフィールド コントロールを作成できます。

カスタム フィールド コントロールでは異なる使用モードを処理する必要があります。モードには表示モードと編集モードだけでなく、設計モードもあります。SharePoint Designer のデザイナにフィールド コントロールをドロップすると、フィールド コントロールは設計モードになります。

リスト、ドキュメント ライブラリ、またはコンテンツ タイプの新しい列を作成するとき、カスタム フィールドはフィールドの種類のリストに表示される必要があります。カスタム フィールドを選択すると、カスタム フィールドを設定し、既定の値を指定するときに使用するオプション セクションの部分が表示されます (図 7)。

カスタム アドレス フィールドは、カスタム フィールド値を使用して定義されているため、既定のデータの ASP.NET サーバー コントロールのレンダリングに関連付けられます。

図 7. カスタム アドレス フィールドの種類に基づき列を追加する

ユーザー設定のアドレス フィールドの種類に基づく列の追加

カスタム フィールドには、アイテムまたはページが作成されたとき、またはユーザーがアイテムかページの編集モードに入ったときにデータを取得する UI のレンダリング機能が必要です。データのカスタム処理、外部データ ソースの使用など、分離コード ロジックを使用して ASP.NET ユーザー コントロールを作成できます。図 8 は編集モードのカスタム アドレス フィールドを示しています。ポータル サイト シナリオでは、リストの列として使用されています。インターネット シナリオでは、特定のページ レイアウトのフィールド コントロールとして使用されています。

図 8. ポータル サイトとインターネット サイトのアドレス フィールド UI

ポータル サイトとインターネット サイトのアドレス フィールド UI

CAML (Collaborative Application Markup Language) と RenderPattern 要素によって、住所データはレンダリング モードで利用できます。そのため、ユーザーは SharePoint リストまたは発行ページで住所を表示できます。

それでは、以上のことはどのように行われているかを調べてみましょう。(コードは 1 つの Microsoft .NET Framework クラス ライブラリにコンパイルされるため、Microsoft.SharePoint.dll と System.Web.dll への参照はコードの先頭に記述する必要があります。コードに従う場合は、先頭に適切な using ステートメントを記述してください。)

最初のクラスでは、取得する値を定義します。この例では、住所は、住所、郵便番号、都道府県、および国の 4 つのフィールドから構成されています。住所は単一の値ではないため、クラスは SPFieldMultiColumnValue クラスから派生しています。このクラス FieldAddressValue では、構造化された値のアイテムごとに 1 つのプロパティを格納します。クラス自体は Litware.CustomFields 名前空間にあります。

namespace Litware.CustomFields
{
    public class FieldAddressValue : SPFieldMultiColumnValue
    {
        private const int numberOfFields = 4;

        public FieldAddressValue()
            : base(numberOfFields)
        {  }

        public FieldAddressValue(string value)
            : base(value)
        {  }

        public string Address
        {
            get { return this[0]; }
            set { this[0] = value; }
        }
        public string Zip
        {
            get { return this[1]; }
            set { this[1] = value; }
        }
        public string City
        {
            get { return this[2]; }
            set { this[2] = value; }
        }
        public string Country
        {
            get { return this[3]; }
            set { this[3] = value; }
        }
    }
}

次に、同じ名前空間でカスタム フィールド自体を作成します。住所フィールドは SPFieldMultiColumn から継承された FieldAddress クラスで表されます。オーバーライドする重要なメソッドは FieldRenderingControl です。このメソッドは、列の作成時にオプション セクションに表示する ASP.NET サーバー コントロールを定義します。GetFieldValue をオーバーライドし、データベースに格納されたシリアル化された値を FieldAddressValue 型として返し、値をコントロールでレンダリングされる 4 つの部分に分解します。

    public class FieldAddress : SPFieldMultiColumn
    {
        public FieldAddress(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName)
        { }

        public FieldAddress(SPFieldCollection fields,
                           string typeName,
                           string displayName)
            : base(fields, typeName, displayName)
        { }
        
        public override BaseFieldControl FieldRenderingControl
        {
            get
            {
                BaseFieldControl fldControl = new AddressFieldControl();
                fldControl.FieldName = InternalName;
                return fldControl;
            }
        }
        
        public override object GetFieldValue(string value)
        {
            if (string.IsNullOrEmpty(value))
                return null;

            return new FieldAddressValue(value);
        }
        
    }

同じプロジェクトを使用して、AddressFieldControl という新しい ASP.NET サーバー コントロールを作成します。既存の ASP.NET サーバー コントロールの 1 つから派生できます。BaseFieldControl から派生することもできます。以前のクラスの型から区別するため、2 番目の名前空間 Litware.WebControls を使用します。

ASP.NET サーバー コントロールでは、UI 自体を実際にはレンダリングしないことに注意してください。ASP.NET ユーザー コントロールで定義されたコントロール テンプレートを使用しています。これは、コントロール データをコントロール表示から区別する ASP.NET の新しい技法です。サーバー コントロールの UI は .ascx ファイルに埋め込まれたテンプレートに定義されます。そのテンプレートの ID は、DefaultTemplateName プロパティのオーバーライドにより、AddressFieldControl コントロールに接続されます。住所フィールドの値は複合値であるため、Value プロパティはオーバーライドされます。CreateChildControls は実際には子コントロールを作成しないことに注意してください。これは、ASP.NET ユーザー コントロールのタスクです。CreateChildControls では、TemplateContainer クラスの FindControl メソッドにより、UI 要素 (さまざまなテキスト ボックス) に接続します。クラスの最後で、既定の値はカスタム フィールドに伴う XML ファイルから取得されます。XML ファイルで定義された 3 つのプロパティは、Field クラスの静的 GetCustomProperty メソッドにより取得されます。

namespace Litware.WebControls
{
    public class AddressFieldControl : BaseFieldControl
    {
        protected TextBox addressBox;
        protected TextBox zipBox;
        protected TextBox cityBox;
        protected TextBox countryBox;

        protected override string DefaultTemplateName
        {
            get { return "AddressFieldRendering"; }
        }

        public override object Value
        {
            get
            {
                EnsureChildControls();
                FieldAddressValue fieldValue = new FieldAddressValue();
                fieldValue.Address = addressBox.Text.Trim();
                fieldValue.Zip = zipBox.Text.Trim();
                fieldValue.City = cityBox.Text.Trim();
                fieldValue.Country = countryBox.Text.Trim();
                
                return fieldValue;
            }
            set
            {
                EnsureChildControls();
                FieldAddressValue fieldValue = (FieldAddressValue)value;
                addressBox.Text = fieldValue.Address;
                zipBox.Text = fieldValue.Zip;
                cityBox.Text = fieldValue.City;
                countryBox.Text = fieldValue.Country;
                
            }
        }

        public override void Focus()
        {
            EnsureChildControls();
            addressBox.Focus();
        }

        protected override void CreateChildControls()
        {
            if (Field == null)
                return;

            base.CreateChildControls();

            if (ControlMode == SPControlMode.Display)
                return;

            addressBox = (TextBox)TemplateContainer.FindControl("addressBox");
            if (addressBox == null)
                throw new ArgumentException("Corrupted AddressFieldRendering template - missing addressBox.");
            addressBox.TabIndex = TabIndex;
            addressBox.CssClass = CssClass;
            addressBox.ToolTip = Field.Title + " Address";

            zipBox = (TextBox)TemplateContainer.FindControl("zipBox");
            if (zipBox == null)
                throw new ArgumentException("Corrupted AddressFieldRendering template - missing zipBox.");
            zipBox.TabIndex = TabIndex;
            zipBox.CssClass = CssClass;
            zipBox.ToolTip = Field.Title + " zipcode";

            cityBox = (TextBox)TemplateContainer.FindControl("cityBox");
            if (cityBox == null)
                throw new ArgumentException("Corrupted AddressFieldRendering template - missing cityBox.");
            cityBox.TabIndex = TabIndex;
            cityBox.CssClass = CssClass;
            cityBox.ToolTip = Field.Title + " City";

            countryBox = (TextBox)TemplateContainer.FindControl("countryBox");
            if (countryBox == null)
                throw new ArgumentException("Corrupted AddressFieldRendering template - missing countryBox.");
            countryBox.TabIndex = TabIndex;
            countryBox.CssClass = CssClass;
            countryBox.ToolTip = Field.Title + " Country";

            if (ControlMode == SPControlMode.New)
            {
                zipBox.Text = Field.GetCustomProperty("DefaultZip").ToString();
                cityBox.Text = Field.GetCustomProperty("DefaultCity").ToString();
                countryBox.Text = Field.GetCustomProperty("DefaultCountry").ToString();
                
            }
        }
    }
}

前に説明したように、ASP.NET ユーザー コントロールは、編集モードでカスタム住所フィールドとやり取りするとき、ユーザー インターフェイスを構成する 4 つのコントロールの表示を処理します。ID AddressFieldRendering を持つ RenderingTemplate コントロールは簡単な HTML テーブルにコントロールを表示します。

<%@ Control Language="C#" Debug="true" %>
<%@Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls"%>

<SharePoint:RenderingTemplate ID="AddressFieldRendering" runat="server">
    <Template>
    <table class="ms-form">
    <tr><td>Address:</td><td><asp:TextBox ID="addressBox" MaxLength="255" Size="50" runat="server"/></td></tr>
    <tr><td>Zip:</td><td><asp:TextBox ID="zipBox" MaxLength="10" Size="5" runat="server"/></td></tr>
    <tr><td>City:</td><td><asp:TextBox ID="cityBox" MaxLength="50" Size="15" runat="server"/></td></tr>
    <tr><td>Country:</td><td><asp:TextBox ID="countryBox" MaxLength="50" Size="15" runat="server"/></td></tr>
    </table>

    </Template>
</SharePoint:RenderingTemplate>

カスタム フィールドの種類の最後の部分では、フィールドの種類の定義ファイルを作成します。これは fldtypes*.xml という XML ファイルです。この例では、fldtypes_Litware.xml です。このフィールドの種類の定義ファイルには 3 つの部分があります。最初の部分はカスタム フィールドの種類のメタデータです。2 番目の部分は、簡単に変更できるよう、宣言形式で利用できるようにする 3 つのプロパティです。(前に説明したように、ASP.NET サーバー コントロールは Field クラスの GetCustomProperty メソッドを使用して実行時に値にアクセスできます)。3 番目の部分は、レンダリング モードで住所フィールドの値の表示を処理する CAML 定義です。この例は簡単なものですが、CAML はこの種のデータの表示用の高性能なマークアップ言語であり、複雑なレンダリングにも活用できます。

<FieldTypes>
    <FieldType>
        <Field Name="TypeName">Address</Field>
        <Field Name="ParentType">MultiColumn</Field>
        <Field Name="TypeDisplayName">Address</Field>
        <Field Name="TypeShortDescription">Address (street + nr, zip, city and country)</Field>
        <Field Name="UserCreatable">TRUE</Field>
        <Field Name="ShowOnListAuthoringPages">TRUE</Field>
        <Field Name="ShowOnDocumentLibraryAuthoringPages">TRUE</Field>
        <Field Name="ShowOnSurveyAuthoringPages">TRUE</Field>
        <Field Name="ShowOnColumnTemplateAuthoringPages">TRUE</Field>
        <Field Name="FieldTypeClass">Litware.CustomFields.FieldAddress, AddressFieldType, Version=1.0.0.0, 
          Culture=neutral, PublicKeyToken=96bdd15c5d632372</Field>
        <PropertySchema>
            <Fields>
                <Field Name="DefaultZip" DisplayName="Default Zip:" MaxLength="10" DisplaySize="10" Type="Text">
                    <Default>1651</Default>
                </Field>
                <Field Name="DefaultCity" DisplayName="Default City:" MaxLength="50" DisplaySize="30" Type="Text">
                    <Default>Beersel</Default>
                </Field>                
                <Field Name="DefaultCountry" DisplayName="Default Country:" MaxLength="50" DisplaySize="30" Type="Text">
                    <Default>Belgium</Default>
                </Field>
             </Fields>
        </PropertySchema>
       <RenderPattern Name="DisplayPattern">
            <Switch>
                <Expr><Column/></Expr>
                <Case Value="">
                </Case>
                <Default>
                    <Column SubColumnNumber="0" HTMLEncode="TRUE"/>
                    <HTML><![CDATA[<BR>]]></HTML>
                    <Column SubColumnNumber="1" HTMLEncode="TRUE"/>
                    <HTML><![CDATA[&nbsp;-&nbsp;]]></HTML>
                    <Column SubColumnNumber="2" HTMLEncode="TRUE"/>
                    <HTML><![CDATA[<BR>]]></HTML>
                    <Column SubColumnNumber="3" HTMLEncode="TRUE"/>
                </Default>
            </Switch>
        </RenderPattern>

    </FieldType>
</FieldTypes>

住所フィールド コントロールを展開する

カスタム フィールドの種類の 3 つの部分 (.NET アセンブリ, .ascx ファイル、およびフィールドの種類を定義する .xml ファイル) は次のように展開する必要があります。

  1. .NET アセンブリはグローバル アセンブリ キャッシュに展開する必要があります。

  2. fldtypes_Litware.xml ファイルはパス C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML にコピーする必要があります。他のフィールドの種類の定義 XML ファイルは既にいくつかここに格納されています。

  3. .ascx ファイルはパス C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES にコピーする必要があります。このフォルダには、このシリーズの最初の記事で説明したさまざまな ASP.NET ユーザー コントロールもあります。

SharePoint Designer のページ レイアウト ファイルにドロップするとフィールド コントロールになるカスタム フィールドの種類の場合、そのカスタム フィールドを web.config ファイルの SafeControls セクションに登録する必要があります。

<SafeControl Assembly="AddressFieldType, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=96bdd15c5d632372" 
Namespace="Litware.WebControls" TypeName="*" Safe="True" 
AllowRemoteDesigner="True" />

コントロールを展開した後は、iisreset コマンドを実行して動作させます。

編集モード エクスペリエンスをカスタマイズする

[ページ編集] ツール バーはサイト ページの発行サイクルで重要な役割を果たします。ここには、現在のページに関するコンテンツ作成者の状態情報、ページ操作用のメニュー、および特定のページの状態とコンテキストでよく使われるアクション用のクイック アクセス ボタンが表示されます (図 9)。

図 9. [ページ編集] ツール バー

[ページ編集] ツール バー

これまで説明した大部分の WCM 関連機能と同様、企業のニーズに合わせて [ページ編集] ツール バーを拡張できます。

[ページ編集] ツール バーのレンダリングの基になるメカニズムは ASP.NET ユーザー コントロール publishingconsole.ascx です。このユーザー コントロールは他の多くの ASP.NET ユーザー コントロールと共に C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES に置かれています。[ページ編集] ツール バーはデータ ソースと UI コントロールを分離するという考えに基づいて作成されています。データ ソースと UI コントロールはどちらも独立して変更できます。

データ ソースは、C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\EditingMenu にある EditingMenu.xml と QuickAccess.xml の 2 つの XML ファイルです。互換性を保つため、これら 2 つのファイルのコンテンツは変更しないでください。コンソールをカスタマイズする場合、サイト コレクションのマスタ ページ ギャラリーにある Editing Menu フォルダの 2 つのファイル CustomEditingMenu.xml と CustomQuickAccess.xml を編集できます。これらのファイルのコンテンツは拡張でき、親ファイル (EditingMenu.xml と QuickAccess.xml) にある設定をオーバーライドできます。

使用できるさまざまな要素の詳細については、C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\EditingMenu にある ConsoleConfigurationSchema.xsd という XML スキーマを参照してください。

まとめ

この記事 (3 回シリーズの 2 回目) では、WCM を可能にするさまざまな重要機能について説明し、さまざまなシナリオを示しました。この資料を Windows SharePoint Services 3.0 SDK と Microsoft Office SharePoint Server 2007 SDK を組み合わせることで、皆さんが最初の一歩を踏み出せるようになることを望んでいます。シリーズの最後の記事 (11 月に発表予定) では、WCM 対応サイトの構成と管理について説明します。

作成者について

Patrick Tisseghem (MVP, Microsoft Office SharePoint Portal Server) は、ベルギーのブリュッセルに拠点を置く Microsoft .NET のトレーニングとサービスの会社、U2U のマネージング パートナーです。業務の大半は、Microsoft 契約トレーナーとして、ほぼすべての Microsoft インフォメーション ワーカーの製品およびテクノロジを網羅したプレゼンテーション、ワークショップ、セミナーを開催しています。Patrick は SharePoint Portal Server の開発に関する記事やホワイト ペーパーを執筆しており (MSDN に発表)、現在は Microsoft Press から刊行予定の Microsoft Office SharePoint Server 2007 に関する書籍の調査と執筆を行っています。

この記事は、A23 Consulting (英語) の協力で開発されました。

追加情報

詳細については、以下のリソースを参照してください。