在验证器实现中获取子布局的数据源
Get a Sublayout's DataSource in validator implementation
我使用的是 Sitecore 6.6,我有一个带有自定义参数模板的子布局项。 param 模板具有通常的常规部分(占位符和数据源字段)和一个自定义 "Lock" 部分,其中只有一个复选框字段。我在复选框上添加了一个自定义字段验证器,这是为了确保如果勾选了该框 - 提供了一个数据源。在我的验证器实现中,我继承了 StandardValidator class 并且我可以用这个
检查复选框的值
var currentItem = GetItem();
currentItem.Fields["Lock"].Value
以及通过这个参数
ControlValidationValue
但是我找不到访问数据源字段的方法。我找到的所有指南都使用以下代码获取它,但这适用于继承 Web.UI.UserControl class(渲染控制器)
的 classes
if(Parent is Sublayout)
_dataSource = Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);
我需要在 StandardValidator 实现中进行验证,以便在内容编辑器中提供反馈并防止在验证失败时保存项目。那么如何在 StandardValidator 实现中获取 DataSource 字段的值?
您可以使用下面的代码获取项目的数据源,我没有在 standardValidator 中进行测试,但我想它会起作用
public static class ItemExtensions
{
public static RenderingReference[] GetRenderingReferences(this Item i)
{
if (i == null)
{
return new RenderingReference[0];
}
return i.Visualization.GetRenderings(Sitecore.Context.Device, false);
}
public static List<Item> GetDataSourceItems(this Item i)
{
List<Item> list = new List<Item>();
foreach (RenderingReference reference in i.GetRenderingReferences())
{
Item dataSourceItem = reference.GetDataSourceItem();
if (dataSourceItem != null)
{
list.Add(dataSourceItem);
}
}
return list;
}
public static Item GetDataSourceItem(this RenderingReference reference)
{
if (reference != null)
{
return GetDataSourceItem(reference.Settings.DataSource, reference.Database);
}
return null;
}
private static Item GetDataSourceItem(string id, Database db)
{
Guid itemId;
return Guid.TryParse(id, out itemId)
? db.GetItem(new ID(itemId))
: db.GetItem(id);
}
}
在验证器 class 中,您将使用:
foreach (Item dataSourceItem in GetItem().GetDataSourceItems())
{
//your code
}
我终于明白了。自定义验证器class可以继承StandardValidatorclass,但是调用自定义class的Sitecore验证器Item必须是ItemValidator,而不是FieldValidator。否则无法访问数据源字段。 ItemValidator 的缺点是需要给每一个使用带参数template 的子布局的item 添加,然后过滤掉没有带参数template 的renderings/sublayouts
使用以下行获取所有渲染参考(来自 Sitecore Climber 的回答)
var renderingRefs = GetItem().Visualization.GetRenderings(Sitecore.Context.Device, false);
然后你需要过滤掉不相关的效果图 - 例如将它们与使用您的参数模板的项目 GUID 或模板 ID 列表进行匹配。过滤掉不相关的渲染后,像这样访问数据源:
var dataSource = myRendering.Settings.DataSource;
另外,Sitecore 刚刚回复我,基本上证实了我上面所说的。以下是他们的回应
The parameters of a rendering are not stored in a specific item in content tree, but in the __renderings field of the item that has this rendering.
So, in order to check the value of the DataSource parameter, you should create a validator for the content item and use the following API to get rendering and its datasource:
foreach (var rendering in item.Visualization.GetRenderings(
new DeviceItem(master.GetItem("{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}")), //get correct device item here
false))
{
if(rendering.RenderingID == new ID("some rendering ID"))
//do something with rendering.Settings.DataSource here
}
我使用的是 Sitecore 6.6,我有一个带有自定义参数模板的子布局项。 param 模板具有通常的常规部分(占位符和数据源字段)和一个自定义 "Lock" 部分,其中只有一个复选框字段。我在复选框上添加了一个自定义字段验证器,这是为了确保如果勾选了该框 - 提供了一个数据源。在我的验证器实现中,我继承了 StandardValidator class 并且我可以用这个
检查复选框的值var currentItem = GetItem();
currentItem.Fields["Lock"].Value
以及通过这个参数
ControlValidationValue
但是我找不到访问数据源字段的方法。我找到的所有指南都使用以下代码获取它,但这适用于继承 Web.UI.UserControl class(渲染控制器)
的 classesif(Parent is Sublayout)
_dataSource = Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);
我需要在 StandardValidator 实现中进行验证,以便在内容编辑器中提供反馈并防止在验证失败时保存项目。那么如何在 StandardValidator 实现中获取 DataSource 字段的值?
您可以使用下面的代码获取项目的数据源,我没有在 standardValidator 中进行测试,但我想它会起作用
public static class ItemExtensions
{
public static RenderingReference[] GetRenderingReferences(this Item i)
{
if (i == null)
{
return new RenderingReference[0];
}
return i.Visualization.GetRenderings(Sitecore.Context.Device, false);
}
public static List<Item> GetDataSourceItems(this Item i)
{
List<Item> list = new List<Item>();
foreach (RenderingReference reference in i.GetRenderingReferences())
{
Item dataSourceItem = reference.GetDataSourceItem();
if (dataSourceItem != null)
{
list.Add(dataSourceItem);
}
}
return list;
}
public static Item GetDataSourceItem(this RenderingReference reference)
{
if (reference != null)
{
return GetDataSourceItem(reference.Settings.DataSource, reference.Database);
}
return null;
}
private static Item GetDataSourceItem(string id, Database db)
{
Guid itemId;
return Guid.TryParse(id, out itemId)
? db.GetItem(new ID(itemId))
: db.GetItem(id);
}
}
在验证器 class 中,您将使用:
foreach (Item dataSourceItem in GetItem().GetDataSourceItems())
{
//your code
}
我终于明白了。自定义验证器class可以继承StandardValidatorclass,但是调用自定义class的Sitecore验证器Item必须是ItemValidator,而不是FieldValidator。否则无法访问数据源字段。 ItemValidator 的缺点是需要给每一个使用带参数template 的子布局的item 添加,然后过滤掉没有带参数template 的renderings/sublayouts
使用以下行获取所有渲染参考(来自 Sitecore Climber 的回答)
var renderingRefs = GetItem().Visualization.GetRenderings(Sitecore.Context.Device, false);
然后你需要过滤掉不相关的效果图 - 例如将它们与使用您的参数模板的项目 GUID 或模板 ID 列表进行匹配。过滤掉不相关的渲染后,像这样访问数据源:
var dataSource = myRendering.Settings.DataSource;
另外,Sitecore 刚刚回复我,基本上证实了我上面所说的。以下是他们的回应
The parameters of a rendering are not stored in a specific item in content tree, but in the __renderings field of the item that has this rendering. So, in order to check the value of the DataSource parameter, you should create a validator for the content item and use the following API to get rendering and its datasource:
foreach (var rendering in item.Visualization.GetRenderings(
new DeviceItem(master.GetItem("{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}")), //get correct device item here
false))
{
if(rendering.RenderingID == new ID("some rendering ID"))
//do something with rendering.Settings.DataSource here
}