在验证器实现中获取子布局的数据源

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
    }