[sitecore][datasource]コールアウトデータソースの継続

概要:コールアウトに使われるデータソースの継続についてのメモ書きです。


 

サイトの構築の際にコールアウトがよく使われます。

20140514_01

特定のページに同じコールアウトのサブレイアウトを使用し、データソースを変えたりするにはSitecoreのルールエンジンおよびコンディションによってレンダリング レンダリングのデータソースを設定したりします。ただ実際にこのルールエンジンを使うお客さんこれまでの作業でそれほど多くない。

よく、お客さんから、デフォルトのコールアウトを設定しれくれという要求があります。たとえば、サービスーというサイトコアのフォルトがあり、その下数重レベルのサブアイテムフォルダがあって、さらにその下に数千のアイテムがあります。スタンダード値にてデフォルトのデータソースを設定する方法もありますが、もし、既存アイテムにデーターソースがない場合は、もっとも近いアンセスターのアイテムのデーターソースを使用という方法があります。もし、近いアンセスターがデーターソースが設定されていないなら、ツリーを従って上の方へ繰り返しでデーターソースを探します。

コールアウトのデータソースの取得もGoogleで検索を書けば下記のように簡単に取得することができます。

Sublayout sublayout = this.Parent as Sublayout;
if (sublayout != null)
{
Item item = Sitecore.Context.Database.GetItem(sublayout.DataSource);
}

ただ、レンダリングにてデーターソースを取得する記事があまり見つからなかったので、それをついて書いてみようと思った。

まず、下準備します。

1.三つのページと三つのコールアウトを用意します。

20140514_02

2.それぞれのページにそれぞれのデータソースを指定します。

20140514_03

3.ページを表示します。

20140514_04

ここで、もし、Levle3のデーターソースを削除します。

20140514_05

Level3のページにて、コールアウトが最も近いアンセスターがデーターソースが設定されているかどうかを確認し、この場合Level2にてデータースースが設定されているので、それを使用します。

20140514_06

もし、Level2もデーターソースが設定されていない場合、

20140514_07

Level3のページにて、コールアウトが最も近いアンセスターがデーターソースが設定されていないので、引き続き上のアイテムを確認し、
この場合Level1にてデータースースが設定されているので、それを使用します。

20140514_08

さて、コードを見てみましょう。
Callout.ascx

<%@ Control Language="c#" AutoEventWireup="true" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"
    Inherits="local.sandbox.com.callout.CalloutSublayout" CodeBehind="Callout.ascx.cs" %>
<%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %>

<asp:Panel ID="pnlCallout" runat="server" CssClass="callout">
    <div class="reg-callout">
    <h4>
        <sc:text id="scTitle" runat="server" field="Callout Title" />
    </h4>
    <sc:text id="scCopy" runat="server" field="Callout Copy" />
    <sc:link id="scLink" runat="server" field="Callout Link" />
    </div>
</asp:Panel>

Callout.ascx.cs

using System;
using System.Linq;
using System.Collections.Generic;
using Sitecore.Data.Items;

namespace local.sandbox.com.callout
{
    public partial class CalloutSublayout : System.Web.UI.UserControl
    {
        private void Page_Load(object sender, EventArgs e)
        {
            BindControls();
        }
         
        private void BindControls()
        {
            Item contextItem = Sitecore.Context.Item;
            Item dataSource = GetDataSourceWithLookUp();

            if (contextItem != null && dataSource != null)
            {
                scTitle.Item = dataSource;
                scCopy.Item = dataSource;
                scLink.Item = dataSource;
            }
        }

        private Item GetDataSourceWithLookUp()
        {
            Item returnVal = GetDatasourceItem(Sitecore.Context.Item);

            if (returnVal == null)
            {
                List<Item> ancestors = Sitecore.Context.Item.Axes.GetAncestors().Where(a => a.TemplateName.Equals("YOUR Template Name Here")).Reverse().ToList();
                foreach (Item ancestor in ancestors)
                {
                    returnVal = GetDatasourceItem(ancestor);
                    if(returnVal != null)
                        break;
                }
            }

            return returnVal;
        }


        private Item GetDatasourceItem(Item item)
        {
            Item returnVal = null;

            item.Visualization.GetRenderings(Sitecore.Context.Device, false).ToList().ForEach(r =>
                {
                    if (r.RenderingItem.InnerItem.TemplateName.ToLower().Equals("sublayout") && r.RenderingItem.InnerItem.Name.Equals("Callout")) 
                    {
                        if (!string.IsNullOrEmpty(r.Settings.DataSource))
                        {
                            returnVal = Sitecore.Context.Database.GetItem(r.Settings.DataSource);
                        }
                    }
                });

            return returnVal;
        }



    }
}

 

Uncategorized