【VSeWSS で作る製品パッケージ(番外編)】 新機能 WSP View の活用(例 : Master Page feature の追加)
環境:
Microsoft Office SharePoint Server (MOSS) 2007
SharePoint Designer 2007
Visual Studio 2005
Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 (VSeWSS) Version 1.1
VSeWSS で作る製品パッケージ
- VSeWSS 進化のポイント
- CAML によるサイト/フィーチャーカスタマイズの基本
- Provisioning Handler の活用
- 新機能 WSP View の活用(例 : Workflow feature の追加)
- 新機能 WSP View の活用(例 : Master Page feature の追加)
こんにちは。
VSeWSS 1.1 を使用してカスタムマスターページ (.master) を組み込んで設定するというデモについて掲載のリクエストもいくつかいただきましたので記載させていただきます。(確かに、この方法は、実際の製品開発などではニーズの高いテクノロジーです、、、)
以前終了したシリーズを思い出したようにまた続けてすみませんが、上記シリーズ(VSeWSS で作る製品パッケージ)の続きとして記載します。(なお、作成したサンプルプロジェクトは本ブログで download できるように添付しておきました)
まず、考え方そのものは、前回の第 4 回「新機能 WSP View の活用(例 : Workflow feature の追加)」の考え方を多くのフィーチャーで応用していくことができますので、今後のために基本的考え方を以下におさらいしておきましょう。
VSeWSS を使ったカスタムフィーチャーの組み込み手順 (考え方のおさらい)
- フィーチャーを定義した Element マニフェストの xml (ワークフローのときは workflow.xml でした) を作成
- すると、VSeWSS の WSP View が認識してくれますので、フィーチャーの定義 (feature.xml) を記載
- 追加で配布する付属のファイル (例えば、イメージファイル、ページ、フォーム、など) は、「テンプレート」(Template) として追加
- Provisioning ハンドラを使った準備処理の作成
それでは早速、同じ要領で、カスタムマスターページ (Custom Master Page) をソリューションパッケージの中にフィーチャーとして組み込んでみましょう。
まず、当然のことですが、フィーチャーとして組む込む .master ファイルを SharePoint Designer などで作っておいてください。また補足ですが、作成したマスター (.master) の中からどのようなスタイルファイル (.css) やイメージファイル (.jpg 等) を参照しているかといった点もちゃんと把握をしておくようにしましょう。
では、上記の手順 1 に該当する、Element マニフェストの作成です。まずは、以下のような xml ファイルを作成してください。
<?xml version="1.0" encoding="utf-8" ?>
<!-- _lcid="1033" _version="12.0.4407" _dal="1" -->
<!-- _LocalBinding -->
<Elements Id="7E989867-D053-4069-85EE-277C9755F294" xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="OSGPageLayouts" Url="_catalogs/masterpage" Path="MasterPages" RootWebOnly="TRUE">
<File Url="MyDemoMaster.master" Type="GhostableInLibrary" Path="">
<Property Name="ContentType" Value="My Demo Master Page" />
<Property Name="PublishingPreviewImage" Value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/MyDemoMaster.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/MyDemoMaster.png" />
<Property Name="MasterPageDescription" Value="このマスターページは、デモとして組み込まれました" />
</File>
</Module>
<Module Name="PublishingLayoutsPreviewImages" Url="_catalogs/masterpage" IncludeFolders="??-??" Path="" RootWebOnly="TRUE">
<File Url="MyDemoMaster.png" Name="Preview Images/MyDemoMaster.png" Type="GhostableInLibrary" Path="">
</File>
</Module>
</Elements>
面倒でしたら上記のコピー/ペーストで作成していただいてOKですが、意味を理解して作成しておくようにしましょう。
例えば、以下の項目は、みなさんが作成されたマスターファイルなどの名前にあわせて変更をおこなってください。
-
Elements の Id
Visual Studio などで GUID を生成してユニークな値を設定してください
-
MyDemoMaster.master
ここは、みなさんが作成したマスター (.master) にあわせて適切な名前を設定しておいてください。
-
MyDemoMaster.png
マスターを選択するときに表示されるプレビューのイメージファイルです。これも、みなさんが作成されたイメージファイルにあわせて適当な名前を設定しておきましょう
つぎに、上記の手順 2 に進みましょう。
上記の XML を第 4 回のとき同様、VSeWSS のサイト定義のプロジェクト (無論、Solution Generator で抽出したプロジェクトでも構いません) に含め、WSP View で表示の更新をおこなうと、OSGPageLayouts という名前のフィーチャーが自動で組み込まれて、feature.xml が作成されます。まずは、WSP View で OSGPageLayouts の名前 (さらに、サブフォルダの名前も) を適当な名前に変更してください (feature.xml の中のパスの記述も自動的に変更されます)。
つぎに、上記の作成された feature.xml を以下の通り変更しましょう。(ここで、Feature の Id は、前回同様、元の値から変更しないように注意してください)
<?xml version="1.0" encoding="utf-8"?>
<Feature Id="bec7f3a3-e53e-4c6e-b3d6-83604b8092bb"
Title="My Demo MasterPage"
Description="このフィーチャーは、カスタムマスターページフィーチャーのためのデモ用です"
Version="1.0.0.0"
Scope="Site"
Hidden="False"
DefaultResourceFile="core"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="<先ほどの XML マニフェストの入ったフォルダ名>\<XML マニフェストのファイル名 (.xml)>"/>
</ElementManifests>
</Feature>
(上記で italic の箇所は、フォルダ構成や xml のファイル名にあわせて設定しておきましょう)
では、上記の手順 3 に進みます。
まず、上記の XML (feature.xml でなく、最初に作成した Element マニフェストの XML です) の記述にあわせて、フォルダに .master ファイルと .png ファイル (プレビューイメージ) を配置します。第 4 回 (ワークフロー編) で記載したときと同じ手順で、ソリューションエクスプローラのプロジェクトを右クリックして、[追加] - [新しい項目] で [テンプレート] (Template) を選択し、上記で宣言した .master ファイルとイメージファイル (.png) を配置します。(下図のようになります)
イメージファイルについては、上記のマニフェスト (.xml) で、IncludeFolders="??-??" と記載していましたので、下図のようにロケールのサブフォルダ (ja-JP) を作成して入れている点に注意してください。

ここでは、スタイル (.css) やイメージファイルなどを使用していない想定ですが、もしマスター (.master) から、カスタムのスタイルシートやイメージファイルなどを使用している場合には (というか、製品開発などの場合、ほとんどそうなりますね)、それらのファイルも上記のテンプレート (Template) の手法を使って、
%ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\1041\STYLES
%ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\1041\IMAGES
などの SharePoint から参照できるフォルダに配置しておくと良いでしょう。(その他のファイルも同様です)

以上で、カスタムマスターページのフィーチャーがインストールされるようになりました。
しかし、フィーチャーがインストールされただけでは納得されない方も多いでしょう。
第 4 回 (ワークフローのとき) と同様、サイトが作成された際に、そのサイトでこのインストールされたマスター (.master) フィーチャーを既定のマスターとして設定するように、Provision の処理を記述していきます。(ここからは、上記の手順 4 になります)
コードの概念としては、上記のマスターページのフィーチャーをサイトコレクションで Activation し、このアクティブ化された
カスタムマスターページを既定のマスターとして設定すれば良いのですが、画面から実施して頂くとわかりますが、カスタムマスターページを使用するには、その前に [発行インフラストラクチャー] と呼ばれるフィーチャーもアクティブ化しておく必要があります。
ですので、プロビジョニングハンドラー (SiteProvisioning.cs) では、以下の通りのコードで設定をおこなう必要があります。
public void OnActivated(SPFeatureReceiverProperties properties)
{
SPWeb web;
if (properties.Feature.Parent is SPWeb)
web = (SPWeb)properties.Feature.Parent;
else
web = ((SPSite)properties.Feature.Parent).RootWeb;
SetMasterPage(web);
}
private void SetMasterPage(SPWeb web)
{
web.AllowUnsafeUpdates = true;
// 発行インフラストラクチャーフィーチャーの Activate
web.Site.Features.Add(new Guid("f6924d36-2fa8-4f0b-b16d-06b7250180fa"), true);
// インストールしたカスタムマスターページの Activate
web.Site.Features.Add(new Guid("bec7f3a3-e53e-4c6e-b3d6-83604b8092bb"), true);
// このサイトにカスタムマスターページを設定
web.MasterUrl = web.Site.ServerRelativeUrl + "/_catalogs/masterpage/MyDemoMaster.master";
web.Update();
}
これですべて完成です。
例により、SiteProvisioning.cs のデバッグは、w3wp.exe へのプロセスアタッチで実施できます。
(このサンプルソースは、本ブログに添付しておきます)