3

ページ エディターの使用に移行する準備として、Sitecore ソリューションを「コンポーネント化」しようとしてきましたが (すごい!ついに!)、継承ベースの複合体である可能性のあるページ テンプレートを主に使用して実際に作業しています。ページ固有のフィールドに加えて、これらのコンポーネント化されたテンプレートの 1:多く。これが当社のソリューションでどのように見えるかの例を以下に示します。バナー機能カルーセルと注目の漫画は、当社が作成しているこれらの新しいコンポーネントの一部です。

コンポーネントを示す基本テンプレート

Sitecore.Context.Item を使用しないようにするために (この記事で最近思い出したように)、新しいコンポーネントのサブレイアウトのデータソース テンプレート フィールドに入力し始めました。プレゼンテーションの詳細、Sitecore サブレイアウト、および .NET コード ファイルの間で適切な接続が確立されました (私が知る限り、この方法で作業するのは私たちの方が新しいです)。

また、Nick Allen によるこの投稿に従って、これらのコンポーネントの基本クラスを設定しようとしましたが、ここで問題が発生しています。コードを実行すると、この基本クラスはコンポーネントのサブレイアウトを適切に見つけています (全体「this.Parent as Sublayout」のこと) しかし、Sublayout.Datasource プロパティを調べると、空の文字列になります。この基本クラスのコードは次のとおりです (これまでのところ)。

public class ComponentBase : System.Web.UI.UserControl
{
    private Sublayout Sublayout { get { return Parent as Sublayout; } }

    public Item DataSourceItem 
    { 
        get 
        { 
            return Sublayout != null && !String.IsNullOrEmpty(Sublayout.DataSource) ? 
            Sitecore.Context.Database.GetItem(Sublayout.DataSource) : Sitecore.Context.Item; 
        } 
    }
}

どうやら、Sitecore サブレイアウトのデータソース テンプレート フィールドと、それが実際にデータソースに変換される方法との間の相互作用が欠けているようです。これらのコンポーネント テンプレートがページ テンプレートを構成するために使用されているためですか? データソースは、問題のコンポーネントが現在使用されているページ テンプレートに最終的に解決されると考えていましたが、おそらくそれは私の誤解です。

誰かが私に確認すべきことのヒントを教えてくれたり、さらに先に進むために使用できるリソースを教えてくれたりしたら、私はそれを感謝します. 私自身、Googs にかなりの質問をしましたが、役に立ちそうなものは何も得られませんでした。

Sitecore の皆様、よろしくお願いします。

4

3 に答える 3

3

上記の手順で、サブレイアウトに許可されたテンプレートを構成したようです。これは基本的に Sitecore に伝えます。「このサブレイアウトのこれらのテンプレートに基づいて、ユーザーがアイテムを選択できるようにします」。これだけでは、サブレイアウトを使用して項目にデータ ソースを設定しません。このサブレイアウトを使用するアイテムのプレゼンテーションの詳細に移動し、サブレイアウトを選択してから、そのデータソース プロパティを設定する必要があります (コンテンツ エディター内で[プレゼンテーション] > [詳細] > [サブレイアウト] > [データ ソース]に移動します)。

この質問に対する私の回答は、データソース アイテムを取得し、すべてのプロパティを設定するサブレイアウトのサイトコア コントロールを反復処理するために必要なソース コードを提供しItemます。

コードは次のとおりです。

public class SublayoutBase : UserControl
{
    private Item _dataSource;

    public Item DataSource
    {
        get
        {
            if (_dataSource == null)
            {
                if (Parent is Sublayout)
                {
                    _dataSource =
                        Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);
                }
                if (_dataSource == null)
                {
                    _dataSource = Sitecore.Context.Item;
                }
            }
            return _dataSource;
        }
    }

    protected override void OnLoad(EventArgs e)
    {
        foreach (Control c in Controls)
        {
            SetFieldRenderers(DataSource, c);
        }
        base.OnLoad(e);
    }

    private void SetFieldRenderers(Item item, Control control)
    {
        if (item != null)
        {
            var ctrl = control as Sitecore.Web.UI.WebControl;
            if (ctrl != null && !string.IsNullOrEmpty(ctrl.DataSource))
            {
                //don't set the source item if the DataSource has already been set. 
                return;
            }
            if (control is FieldRenderer)
            {
                var fr = (FieldRenderer)control;
                fr.Item = item;
            }
            else if (control is Image)
            {
                var img = (Image)control;
                img.Item = item;
            }
            else if (control is Link)
            {
                var link = (Link)control;
                link.Item = item;
            }
            else if (control is Text)
            {
                var text = (Text)control;
                text.Item = item;
            }
            else
            {
                foreach (Control childControl in control.Controls)
                {
                    SetFieldRenderers(item, childControl);
                }
            }
        }
    }
}
于 2013-08-23T20:44:09.330 に答える
0

Sitecore 7 update 1 を使用している場合、実際に属性を使用できるようになりました。リリースノートから:

コード ビハインドからサブレイアウトのデータ ソースを簡単に取得できるようにするために、データ ソースは "sc_datasource" 属性でサブレイアウト コントロールに転送されるようになりました。(320768)

コードからデータ ソースを取得するには、単に this.Attributes["sc_datasource"]; を参照してください。

于 2013-08-26T08:05:58.037 に答える