Glass.Mapper.Scを使用したSitecoreプログラミング Part3 複雑なフィールドタイプを使用する

samatsu 8/30/2015 1409 N/A Glass Mapper

今回は Sitecore用のORMであるGlass Mapperでテキスト型のフィールドではなく、複雑なフィールドタイプをマッピングで使用する方法を記載します。

例えば、次のようにニュース記事アイテムに対応するモデルクラスを定義できます。フィールドタイプに対応するクラスがGlass.Mapper.Sc.Fields名前空間に定義されているので、そのクラスを使用してImageやGeneral Linkフィールドにマッピングするプロパティを定義します。 複数のアイテムを選択するリスト型のフィールドの場合は、IEnumerable<T>型としてアイテムの一覧を表すプロパティを定義します。サンプルコードではRlatedArticlesプロパティが複数選択型のフィールドに対応するプロパティです。単一アイテムを選択するリスト型フィールドは選択するアイテムに対応するクラスを型として持つプロパティを定義します。サンプルコードではTextNode型のCategoryプロパティが使用例になります。アイテムのURLや名前など、フィールドではなく、アイテムの属性情報を使用したい場合はSitecoreInfoAttributeを使用できます。

[SitecoreType]
public class NewsArticle
{
    [Glass.Mapper.Sc.Configuration.Attributes.SitecoreId]
    public virtual Guid Id { get; set; }
    [SitecoreField]
    public virtual string Title { get; set; }
    [SitecoreField]
    public virtual string Content { get; set; }
    [SitecoreField]
    public virtual Glass.Mapper.Sc.Fields.Image Image { get; set; }
    [SitecoreField("Release Date")]
    public virtual DateTime ReleaseDate { get; set; }

    [SitecoreField("Related Articles")]
    public virtual IEnumerable<NewsArticle> RelatedArticles { get; set; }
    [SitecoreField]
    public virtual TextNode Category { get; set; }
    [SitecoreField]
    public virtual Glass.Mapper.Sc.Fields.Link Top { get; set; }
    // アイテムのURLが自動的に設定される
    [SitecoreInfo(SitecoreInfoType.Url)]
    public virtual string Url { get; set; }
    [SitecoreInfo(SitecoreInfoType.Name)]
    public virtual string Name { get; set; }
}

public class TextNode
{
    [Glass.Mapper.Sc.Configuration.Attributes.SitecoreId]
    public virtual Guid Id { get; set; }
    public virtual string Text { get; set; }
    [SitecoreField(FieldType=SitecoreFieldType.Integer)]
    public virtual int Value { get; set; }
}

あとは、NewsArticleをモデルクラスとして使用するサブレイアウトで簡単に使用できます。サブレイアウトのコードビハインドファイルでGlassUserControl<T>を形容してサブレイアウトを定義します。今回はNewsArticleがモデルクラスなので、型パラメーターに NewsArticle を指定しています。

public partial class NewsArticleSublayout : GlassUserControl<NewsArticle>
{
    private void Page_Load(object sender, EventArgs e)
    {
    }
}

あとはコードフロント側でコンポーネントのマークアップを生成します。マークアップの書き方はGlass.Mapper.Scを使用したSitecoreプログラミング Part2 xEditorサポートで紹介したように、Glass Mapperの書き方にしたがって記述できます。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="NewsArticleSublayout.ascx.cs" Inherits="ScGlass.layouts.NewsArticleSublayout" %>
<%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %>

<article>
    <div>
        <h1><%= Editable(x => x.Title) %></h1>
        <div><%= Editable(x => x.Content) %></div>
        <div><%= Editable(x => x.Image, new { style="float:right"}) %></div>
        <%= Editable(x => x.Top) %>
        <%= Editable(x=>x.ReleaseDate) %>
        <h2>カテゴリ</h2>
        <% if(Model.Category != null){ %>
        <%= Editable(x=> x.Category.Text) %>
        <% } %>
    </div>
    <br />
    <div>
        <h1>imgタグのsrc,alt要素のために使用する</h1>
        <img src="<%= Model.Image.Src %>" alt="<%= Model.Image.Alt %>" />
        <h1>関連記事</h1>
        <div style="background-color: lightgray">
            <% foreach (var news in Model.RelatedArticles)
               { %>
            <div><a href="<%= news.Url %>"><%= news.Name %></a></div>
            <% } %>
        </div>

    </div>
</article>

Glass Mapperを使用するとSitecore Itemを通常のクラス(Plain Old Clr Object) に変換してさらにそのオブジェクトをしよすいてレンダリングを簡単に行えます。