SharePoint WCM (3) : コンテンツ管理用のソリューションパッケージ作成
(2009/07/01 : バリエーション機能に対応できるようにサンプルコードを修正)
環境 :
Microsoft Office SharePoint Server 2007
Visual Studio 2008 (Professional Edition 以上)
Visual Studio Extensions for Windows SharePoint Services 3.0 (VSeWSS) Version 1.2
こんにちは。
SharePoint WCM (セミナー補足) :
さいごに、総まとめでお見せしたソリューションパッケージのサンプルです。下記に、サンプルのダウンロードも添付しておきます。(昔作ったデモを今回のセミナー用に部分的に変えただけなので、皆さんの環境でちゃんと動くかは???ですが、、、なお、MOSS が必要です。)
まず、「Web ソリューションパッケージ (wsp) とは何 ?」、「どう作るの ?」 という基礎は以前投稿した下記を参照してください。(なお、セミナーでご質問を受けたのですが、このソリューションパッケージのインストールは、ファーム構成の場合、単一構成と同様の要領でファームに対して 1 回インストールをおこなえば分散された WFE などについてもすべて配置されるようです。すみません、私自身この環境で試していなかったのですが、、、)
http://blogs.msdn.com/tsmatsuz/archive/2008/04/02/vsewss-1-vsewss-1-1.aspx
今回も、上記で記載している要領で、マスターページ、ワークフロー、レイアウトページ (セミナーでデモした要領) などの必要な機能 (フィーチャー) をサイト定義に含めておきます。(この手順詳細は上記を参照してください。)
今回は、利用者、あるいは運用者がサイトの新規作成をおこなうと、セミナーで説明した「発行インフラストラクチャー」、「発行機能」などの必要なフィーチャーを有効化 (Activate) し、さらにデモでお見せしたカスタムのマスターページ、カスタムのレイアウトページ、カスタムのコンテンツ承認ワークフローと [ページ] ライブラリへの関連付け、のすべてを実施してくれるサイト定義を作成してみます。
まず、この際の注意点ですが、SharePoint に既存で含まれている [発行サイト] のテンプレートのように、「発行インフラストラクチャー」、「発行機能」 の両方をアクティベートさせたい場合は、上記 (以前のブログ投稿) で記載している方法 (コードを使った機能のアクティベート) ではなく、ちゃんと onet.xml を使用しましょう。
VSeWSS のサイト定義のプロジェクトに含まれる onet.xml に以下のように記述することで、このサイト定義の利用者がサイトを作成する際に、適切な順序で、適切な機能のアクティベートをおこなってくれます。(サイトコレクションに対して設定するフィーチャーと、サイトに対して設定するフィーチャーがあるので注意しましょう。下記以外にも、必要なフィーチャーがあれば入れておくと良いでしょう、、、)
<?xml version="1.0" encoding="utf-8"?>
<Project Title="テストサイト" . . .>
. . . . .
<Configurations>
<Configuration ID="0" Name="Default">
. . . . .
<SiteFeatures>
. . . . .
<!-- SharePoint ワークフロー 共通機能 -->
<Feature ID="C9C9515D-E4E2-4001-9050-74F980F93160" />
<!-- 発行インフラストラクチャー -->
<Feature ID="f6924d36-2fa8-4f0b-b16d-06b7250180fa" />
<!-- カスタムのマスターページ (よって、Id は構築結果に応じて変更してください) -->
<Feature ID="bec7f3a3-e53e-4c6e-b3d6-83604b8092bb" />
<!-- カスタムのレイアウトページ (よって、Id は構築結果に応じて変更してください) -->
<Feature ID="00edf1fb-230d-48e9-ba73-14e9a38a5329" />
<!-- カスタムのワークフロー (よって、Id は構築結果に応じて変更してください) -->
<Feature ID="F8222634-F70A-401c-A39F-5911FB2B3E78" />
</SiteFeatures>
<WebFeatures>
. . . . .
<!-- 発行機能 -->
<Feature ID="94c94ca6-b32f-4da9-a9e3-1f3d343d7ecb" />
</WebFeatures>
. . . . .
そして、セミナーでもご紹介したサイトプロビジョニングハンドラーのコード作成です。
上記の onet.xml により、カスタムのマスターページ、ワークフローなど必要な機能 (フィーチャー) の有効化は完了ですので、あとは、登録したカスタムマスターページをサイトの既定のマスターページとして設定する作業と、ワークフローをコンテンツ承認用に [ページ] ライブラリに関連付ける作業をおこないます。
サイトプロビジョニングハンドラーは以下の通りになります。(Microsoft.SharePoint.Publishing.dll の参照追加をあらかじめ実施しておいてください。)
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);
SetPublishingWorkflow(web);
}
private void SetMasterPage(SPWeb web)
{
web.AllowUnsafeUpdates = true;
// [ページ] 内のページすべてにカスタムのマスターページを適用
web.CustomMasterUrl = SPUrlUtility.CombineUrl(web.Site.ServerRelativeUrl,
"_catalogs/masterpage/MyDemoMaster.master");
// 設定画面などのシステムのマスターページも変更するには、下記のとおり記述。
// ただし、タスクリストなどでは、default.master に含まれるコントロールなどを使用しているため注意 !!
// (下手に変えると、こうした画面が表示されなくなります)
//web.MasterUrl = SPUrlUtility.CombineUrl(web.Site.ServerRelativeUrl,
// "_catalogs/masterpage/MyDemoMaster.master");
web.Update();
}
private void SetPublishingWorkflow(SPWeb web)
{
web.AllowUnsafeUpdates = true;
// ワークフローテンプレートの取得 (注 : フィーチャー Id ではなく、ワークフロー Id です)
SPWorkflowTemplate wfTmpl = web.WorkflowTemplates.GetTemplateByBaseID(new Guid("5AF9335C-9D4F-4aa1-93C9-C079F469D9D2"));
// [ページ] ライブラリの取得
SPDocumentLibrary pageLib = (SPDocumentLibrary)web.Lists["ドキュメント"]; // ダミー
foreach (SPList list in web.Lists)
{
if (list.BaseTemplate == (SPListTemplateType) 850) // ページライブラリはテンプレート 850 です !
{
pageLib = (SPDocumentLibrary)list;
break;
}
}
// タスクリストの取得 (今回は、既にサイト定義に存在する「Tasks」というリストを使う)
SPList taskList = web.Lists["Tasks"];
// ワークフロー履歴リストの取得 (その前に作成します . . .)
string histListName = "ワークフローの履歴";
SPListTemplateType prcListTemplateTypeHistory = SPListTemplateType.WorkflowHistory;
web.Lists.Add(histListName, "history list", prcListTemplateTypeHistory);
SPList histList = web.Lists[histListName];
// ワークフローの関連設定
pageLib.EnableModeration = true; // (コンテンツ承認を有効化)
SPWorkflowAssociation wfAssoc = SPWorkflowAssociation.CreateListAssociation(wfTmpl, "AutoWorkflow", taskList, histList);
wfAssoc.AllowAsyncManualStart = false;
wfAssoc.AllowManual = true;
pageLib.AddWorkflowAssociation(wfAssoc);
pageLib.DefaultContentApprovalWorkflowId = wfAssoc.Id;
pageLib.Update();
}
また、WSP ビューから、サイト定義の定義ファイル (webtempXXX.xml) を開いて、以下の通り定義します。下記では、[発行] のカテゴリに含まれるサイトテンプレート(下記のDisplayCategory 参照)で、バリエーション階層の作成時などでも選択可能 (下記の FilterCategories 参照) なサイトテンプレートとして定義しています。
<?xml version="1.0" encoding="utf-8"?>
<Templates>
<Template Name="SiteDefinition1" ID="10001">
<Configuration ID="0"
Title="デモの発酵サイト"
Description="テストです!"
Hidden="FALSE"
ImageUrl="/_layouts/1041/images/MyDemo.png"
FilterCategories="PublishingSiteTemplate"
DisplayCategory="発行"/>
</Template>
</Templates>
これで、すべて完了ですので、このサイト定義をインストールしましょう。
既存の SharePoint の [発行サイト] のテンプレート同様、全体管理 (Central Administration) 画面から、下図のように追加されたサイト定義を選択してサイトコレクションを新規作成すると、
-
サイトコレクションの [発行インフラストラクチャー] の有効化
-
サイトの [発行機能] の有効化
-
カスタムマスターページの有効化と、全ページへの適用 (ただし、[ページ] ライブラリのページ)
-
カスタムレイアウトの登録
-
カスタムのコンテンツ承認ワークフローの [ページ] ライブラリへの設定
のすべてが設定されたサイトコレクションが新規作成されます。

セミナーのデモで使用したサンプル (上記) は、以下になります。
デモで使用したサンプル (ダウンロード)
このサンプルで、ページのコンテンツ承認ワークフローを流すと、「Tasks」という名前の既存のタスクリストにタスクが追加されますので、このタスクを完了 (進捗率を 100 % に設定) することでページが承認されて公開されます。(私のデモ環境ではちゃんと動きましたが、動かなかったらゴメンナサイ、、、)