我们一直在努力“组件化”我们的Sitecore解决方案,因为我们前进,在准备过渡到页面编辑器使用(哇!),但实际上我们仍然主要使用页面模板,这些模板可能是基于继承的页面特定字段的组合,再加上1:许多这些组件化模板。这在我们的解决方案中的一个例子是

为了避免使用Sitecore.Context.Item (正如这个职位最近提醒我的那样),我开始在新组件的子布局上填充Datasource模板字段,并且似乎在表示详细信息、Sitecore子布局和.NET代码文件之间建立了适当的连接(据我所知,我们是以这种方式工作的)。
我还尝试按照这篇文章是尼克·艾伦写的设置这些组件的基类,但这里遇到了一个问题:当我执行代码时,这个基类会适当地找到组件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子布局中datasource模板字段之间的一些交互作用,以及如何将其实际转换为数据源。是因为这些组件模板被用来编写页面模板吗?我认为数据源最终会解决当前使用该组件的页面模板,但这可能是我的误解。
如果有人能给我任何提示来检查或指出我可能使用的任何资源来进一步发展,我将不胜感激。我已经问了很多谷歌人,我自己,但我只是没有得到任何帮助。
提前谢谢你的朋友们!
发布于 2013-08-23 20:44:09
看起来您已经在上面描述的步骤中为您的子布局配置了允许的模板。这基本上告诉Sitecore;“允许用户根据这些模板为这个子布局选择项目”。这本身并不会使用子布局在项上设置数据源。您仍然需要进入使用该子布局的任何项的表示详细信息,选择子布局,然后设置它的数据源属性(在内容编辑器中转到Presentation > details > sublayout > datasource )。
我的对这个问题的回答给出了检索数据源项所需的源代码,并在您的子布局上迭代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-23 18:33:32
当您开始使用设置数据源的子布局时,请尝试使用市场“”。当您使用它们提供的类作为基类,并在您的Sitecore环境中设置了所有内容时,您将发现自己拥有一个"this.DatasourceItem“->,它将包含您的数据源项,或者如果没有给出任何内容项,则会发现自己拥有一个”->“。
Helper.aspx
要了解数据源如何工作的更多信息,请尝试在http://sdn.sitecore.net上搜索。有很多可用的文档可以帮助您朝着正确的方向前进。通常,只要在子布局中添加一个数据源就足够了,您可以在子布局中访问它。
当您从子布局读取数据源时,它只需检查子布局上的数据源字段是否已被填充,并将返回有关此数据源的信息。因此,当您使用页面编辑器(例如,新闻文章的子布局)向页面添加新组件时,并且在添加此组件时定义并填充了数据源模板,您将看到,当您检查该页面上的演示文稿详细信息时,将添加一个带有数据源的子布局。数据源将指向一个文件夹,在该文件夹中,您将根据在子布局上指定的数据源模板找到一个项。您还应该对此进行反复检查,因为如果添加的子布局上没有数据源,那么很明显您无法从代码中访问它。
发布于 2013-08-26 08:05:58
如果您正在使用Sitecore 7 update 1,那么现在可以实际使用这些属性了。在发行说明中:
为了更容易地从代码背后获取子布局的数据源,数据源现在被转移到"sc_datasource“属性中的子布局控件。(320768) 要从代码中获取数据源,只需参考this.Attributes"sc_datasource";
https://stackoverflow.com/questions/18409476
复制相似问题