前回、[Sitecore CMS]アイテムに数値バージョンがあるかをチェックする拡張メソッドを定義してみるでMarketplaceで公開されている Web Parts Framework のインストール方法とサンプルページの簡単な使い方をご説明しました。

今回は インストール時に作成される Web Part Node データテンプレート定義アイテムを使用して WebPartZone に配置するWebPartをコンテンツアイテムとして定義する方法をご説明します。詳細な手順は マーケットプレースのページからダウンロードできる ドキュメントを参照していただくようにお願いします。

検証環境は次の通りです。

  • Sitecore CMS 6.6 Update 5, .NET 4.0
  • Web Part Framework220 rev 090316

Web Part Node 定義アイテムを使用することで 通常は  WebPartZone に表示するコントロールをWebPartZoneのZoneTemplateにマークアップとして設定する Webコントロール(WebPart) をコンテンツツリー上のアイテムとして定義することができるようになります。本例では、Web Part Framework パッケージインストール時に作成される/layouts/WPF Layout.aspx レイアウトファイルを変更して Web Part Node アイテムを使用するサンプルを掲載します。

1. サブレイアウトの作成

まず、WebPartZone に配置する簡単なサブレイアウト定義アイテムを作成します。なんでもいいのですが、今回は LoginInfo というサブレイアウトを作成しました。LoginInfo.ascx ファイルを次のように編集しました。ログインユーザーの情報とサブレイアウト(ユーザーコントロール)をレンダリングした時間を表示しています。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LoginInfo.ascx.cs" Inherits="SCWebPartsSample.Web.layouts.wpf.LoginInfo" %>
<div>
    <asp:LoginName ID="loginName" runat="server" />
    <br />
    Last Rendering Time:<asp:Literal runat="server" ID="ltlDateTime" />
</div>

LoginInfo.ascx.cs コードビハインドファイルを次のように編集します。レンダリング時間の文字列はユーザーの標準の言語のカルチャと同じにしています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using Sitecore.Caching;

namespace SCWebPartsSample.Web.layouts.wpf
{
    public partial class LoginInfo : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ltlDateTime.Text = DateTime.Now.ToString(CultureInfo.GetCultureInfo(Sitecore.Context.User.Profile.ContentLanguage));

        }
    }
}

非常に簡単ですが、サブレイアウトのサンプルは以上となります。

2. Web Part Node アイテムの作成

WebPartManger上のそれぞれのWebPartZoneのSource プロパティにWebPartManagerのSourceプロパティで指定した定義アイテムの相対パスを設定することで別々のWeb Part Node の定義アイテムを表示するようにできます。なので、今回は下図のようにZoneSettingというアイテムの下にZone1, Zone2 という 2箇所のWebPartZone用のフォルダ型のアイテムを作成しました。

例ではフォルダ型のアイテムをWebPartZoneごとのパスを設定するために使用していますが、フォルダ型のアイテムである必要はありません。

それでは Zone1 アイテム配下に WebPartZoneに表示するための WebPartを定義する Web Part Node 型のアイテムを作成します。挿入オプションからテンプレートから挿入を選択し、テンプレートから挿入ダイアログのコンテンツツリーで /テンプレート/WebPart Framework/Web Part Node データテンプレートを選択しアイテムを作成します。今回は UserInfoWebPartNode という名前でアイテムを作成しました。

作成されたコンテンツアイテムを選択します。 WebPartItem というフィールドがあるので、 WebPartItem にプレゼンテーションコンポーネントのID(GUID)を設定します。IDには /sitecore/system/modules/Web Parts 配下で定義した Web Parts の定義アイテムのIDも指定できます。今回は下図のように UserInfo サブレイアウトのGUIDを設定します。下図はテスト環境で使用したサブレイアウトのGUIDなので、環境によって異なります。

今回は1つだけ Web Part Nodeを作成しました。複数のWeb Part Node 型のアイテムを定義することもできます。また、必要であれば別のWebPartZone用に Zone2 など別のアイテム配下にも Web Part Node アイテムを作成します。

3. WPF Layout.aspx の修正

Web Part Framework 作成時に自動でインストールされる WPF Layout.aspx を修正して、 今作成した ZoneSetting アイテム配下の Zone1, Zone2 の下に作成した Web Part Node で指定されたコントロール が WebPartZone に表示されるようにします。

WPF sample.aspx を表示して WebPartManager タグの Source プロパティに WPF Part Node 設定用のルートアイテムのパスを設定します。今回の例では /sitecore/content/ZoneSetting になります。 今回の記事での 変更前と変更後のSourceの値を表示します。

変更前

<framework:WebPartManager ID="WebPartManager1" runat="server" Source="/sitecore/content/home/myportal"/>

変更後

<framework:WebPartManager ID="WebPartManager1" runat="server" Source="/sitecore/content/ZoneSetting"/>

次に、 各 WebPartZone マークアップのSourceプロパティに、 /sitecore/content/ZoneSetting 配下のWebPart定義アイテムが格納されているアイテムへの相対パスを設定します(今回はZone1, Zone2)。実際には、WPF Layout.aspx の WebPartZone は下のように定義されているため、Source プロパティを設定する必要はありません。

<framework:WebPartZone ID="WebPartZone1" runat="server" Source="Zone1"
<framework:WebPartZone ID="WebPartZone2" runat="server" Source="Zone2"

Web Part Node の親アイテムへの相対パスをSourdeプロパティに設定することで Web Part Node で指定したサブレイアウトなどのプレゼンテーションコンポーネント(WebParts 用の定義アイテム含む) が WebPartZone にデフォルトの状態で表示されるようになります。

4.動作確認

準備ができたので、下図のようにホームアイテム配下のWPF Sampleアイテムのページを表示します。ページを表示すると下図のようにWebPartZoneに Zone1アイテム配下に作成した UserInfoWebPartNodeアイテムで指定した UserInfoサブレイアウトが既定で表示されます。

Web Part Node アイテムで定義した WebPartをWebPartZoneから削除した場合は、 Catalog Mode 時に Catalog Zone で表示される Page Catalog のリンクをクリックすることで、下図のように UserInfoWebPartNode を再び 任意の WebPartZone に追加することができます。

5.まとめ

説明は以上です。このようにWeb Part Zoneを使用することで WebPartZone に表示するコントロールをコンテンツツリーのアイテムで制御することができるようになります。WebPartとして表示したいWebコントロールを作成するたびに、aspxファイル(ascxの場合もあります。) を編集して再コンパイルを行う必要がなくなります。