[sitecore][datasource]コールアウトデータソースの継続
概要:コールアウトに使われるデータソースの継続についてのメモ書きです。
サイトの構築の際にコールアウトがよく使われます。
特定のページに同じコールアウトのサブレイアウトを使用し、データソースを変えたりするにはSitecoreのルールエンジンおよびコンディションによってレンダリング レンダリングのデータソースを設定したりします。ただ実際にこのルールエンジンを使うお客さんこれまでの作業でそれほど多くない。
よく、お客さんから、デフォルトのコールアウトを設定しれくれという要求があります。たとえば、サービスーというサイトコアのフォルトがあり、その下数重レベルのサブアイテムフォルダがあって、さらにその下に数千のアイテムがあります。スタンダード値にてデフォルトのデータソースを設定する方法もありますが、もし、既存アイテムにデーターソースがない場合は、もっとも近いアンセスターのアイテムのデーターソースを使用という方法があります。もし、近いアンセスターがデーターソースが設定されていないなら、ツリーを従って上の方へ繰り返しでデーターソースを探します。
コールアウトのデータソースの取得もGoogleで検索を書けば下記のように簡単に取得することができます。
Sublayout sublayout = this.Parent as Sublayout; if (sublayout != null) { Item item = Sitecore.Context.Database.GetItem(sublayout.DataSource); }
ただ、レンダリングにてデーターソースを取得する記事があまり見つからなかったので、それをついて書いてみようと思った。
まず、下準備します。
1.三つのページと三つのコールアウトを用意します。
2.それぞれのページにそれぞれのデータソースを指定します。
3.ページを表示します。
ここで、もし、Levle3のデーターソースを削除します。
Level3のページにて、コールアウトが最も近いアンセスターがデーターソースが設定されているかどうかを確認し、この場合Level2にてデータースースが設定されているので、それを使用します。
もし、Level2もデーターソースが設定されていない場合、
Level3のページにて、コールアウトが最も近いアンセスターがデーターソースが設定されていないので、引き続き上のアイテムを確認し、
この場合Level1にてデータースースが設定されているので、それを使用します。
さて、コードを見てみましょう。
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; } } }