3

随着我们的前进,我们一直在尝试“组件化”我们的 Sitecore 解决方案,为过渡到页面编辑器的使用做准备(Woot!终于!),但实际上我们仍然主要使用可能是基于继承的复合材料的页面模板页面特定字段,加上 1:许多这些组件化模板。下面是我们解决方案中的一个示例——横幅特征轮播和特色卡通是我们正在创建的这些新组件中的一些:

显示组件的基本模板

为了避免使用 Sitecore.Context.Item(正如我最近被这篇文章提醒的那样),我已经开始在新组件的子布局上填写数据源模板字段,看起来我已经在演示详细信息、Sitecore 子布局和 .NET 代码文件之间建立了适当的联系(据我所知;同样,我们对这种工作方式比较陌生)。

根据 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 子布局中的数据源模板字段之间的一些相互作用,以及它如何实际转换为数据源。是因为这些组件模板被用来组成页面模板吗?我在想数据源最终会解析为当前正在使用相关组件的页面模板,但也许这是我的误解。

如果有人可以给我任何提示以检查或指出我可能用来进一步发展的任何资源,我将不胜感激。我自己问了很多 Googs,但没有得到任何帮助。

提前感谢您,Sitecore 朋友们!

4

3 回答 3

3

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

对这个问题的回答提供了检索数据源项和遍历您的子布局上的站点核心控件设置所有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 环境中正确设置所有内容时,您会发现自己拥有一个“this.DatasourceItem”-> 它将包含您的数据源项,或者如果没有给出上下文项,则它会包含上下文项。

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

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

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

于 2013-08-23T18:33:32.590 回答
0

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

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

要从代码中获取数据源,只需参考 this.Attributes["sc_datasource"];

于 2013-08-26T08:05:58.037 回答