尝试在Sitecore子布局中使用数据源模板;变空Sublayout.Datasource

时间:2013-08-23 18:26:09

标签: sitecore

我们一直在尝试“组件化”我们的Sitecore解决方案,因为我们向前迈进,准备过渡到页面编辑器使用(Woot!最终!),但我们仍然主要使用可能是继承的页面模板基于页面特定字段的复合,加上1:许多这些组件化模板。以下是我们的解决方案中的一个示例 - Banner Feature Carousel和Featured Cartoon是我们正在创建的一些新组件:

Base templates showing components

为了试图摆脱使用Sitecore.Context.Item(我最近被this post提醒),我已经开始填充新组件的子布局上的数据源模板字段,并且好像我已经在演示文稿细节,Sitecore子布局和.NET代码文件之间建立了适当的连接(据我所知;再次,我们以这种方式工作更新)。

我也尝试按照this post by Nick Allen为这些组件设置一个基类,但是我遇到了一个问题:当我执行我的代码时,这个基类正在适当地找到组件Sublayout (整个“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子布局中数据源模板字段与实际转换为数据源的方式之间的一些相互作用。是因为这些组件模板用于组合页面模板吗?我当时认为数据源最终将解析为当前正在使用该组件的Page模板,但也许这就是我的误解。

如果有人能给我任何要检查的东西,或者指出我可能用来进一步的任何资源,我会很感激。我自己做了很多问过Googs,但我没有得到任何有帮助的东西。

提前感谢Sitecore的朋友们!

3 个答案:

答案 0 :(得分:3)

您似乎已在上述步骤中为子布局配置了允许的模板。这基本上告诉Sitecore; '允许用户根据这个子布局的这些模板选择项目'。仅此一项不会使用子布局设置项目的数据源。您仍然需要使用此子布局进入任何项目的演示文稿详细信息,选择子布局然后设置其数据源属性(在内容编辑器中转到演示文稿>详细信息> [Sublayout]>数据源)。

我的answer to this question提供了检索数据源项所需的源代码,并遍历子布局中的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);
                }
            }
        }
    }
}

答案 1 :(得分:0)

当您开始使用您将设置数据源的子布局时,请尝试使用市场“Sublayout Parameter Helper”。当您使用他们提供的类作为基类并在Sitecore环境中设置一切时,您会发现自己有一个“this.DatasourceItem” - >它将包含您的数据源项,如果没有,则包含上下文项。

http://marketplace.sitecore.net/en/Modules/Sub_Layout_Parameter_Helper.aspx

要了解有关数据源工作原理的更多信息,请尝试搜索http://sdn.sitecore.net。有很多文档可以帮助您找到正确的方向。通常,只需在您可以在子布局中访问的子布局中添加数据源即可。

当您从子布局读取数据源时,它将检查该子布局上的数据源字段是否已填充,并将返回有关此数据源的信息。因此,当您使用页面编辑器向页面添加新组件(例如新闻文章的子布局)并且在添加此组件期间定义并填充了数据源模板时,您将看到当您检查演示文稿详细信息时该页面添加了一个带有数据源的sublyaout。数据源将指向一个文件夹,您可以在该文件夹中找到基于您在子布局中指定的数据源模板的项目。您还应该仔细检查一下,如果添加的子布局中没有数据源,很明显您无法从代码中访问它。

答案 2 :(得分:0)

如果您使用的是Sitecore 7更新1,您现在实际上可以使用这些属性。从发行说明:

  

为了更容易获取子布局的数据源   代码隐藏,数据源现在转移到子布局   控制在“sc_datasource”属性中。 (320768)

     

要从代码中获取数据源,请参阅   this.Attributes [ “sc_datasource”];