Sitecore自定义数据提供程序将语言版本翻倍?

Sitecore自定义数据提供程序将语言版本翻倍?,sitecore,Sitecore,因此,最近我一直在为Sitecore开发一个自定义数据提供程序,它非常简洁,工作得非常好,直到我遇到以下问题: 正如你所看到的,我收到的是双语版本。即使我的DataProvider的GetItemVersions如下所示: /// <summary> /// Used to retrieve version and language information of given item. /// </summary> public override VersionUriL

因此,最近我一直在为Sitecore开发一个自定义数据提供程序,它非常简洁,工作得非常好,直到我遇到以下问题:

正如你所看到的,我收到的是双语版本。即使我的DataProvider的GetItemVersions如下所示:

/// <summary>
/// Used to retrieve version and language information of given item.
/// </summary>
public override VersionUriList GetItemVersions(ItemDefinition itemDefinition, CallContext context)
{
    VersionUriList result = null;

    if (itemDefinition.ID == RootItem.RootId)
    {
        // Our root only has 1 version in 1 language.
        result = new VersionUriList { new VersionUri(LanguageManager.GetLanguage("en"), Version.First) };
    }
    else if (CanProcess(itemDefinition.ID))
    {
        // Snipped processing of own items
    }

    return result;
}
//
///用于检索给定项的版本和语言信息。
/// 
公共覆盖版本URI列表GetItemVersions(ItemDefinition ItemDefinition,CallContext上下文)
{
VersionUriList结果=null;
if(itemDefinition.ID==RootItem.RootId)
{
//我们的根目录只有1种语言的1个版本。
结果=newversionurilist{newversionuri(LanguageManager.GetLanguage(“en”),Version.First)};
}
else if(CanProcess(itemDefinition.ID))
{
//对自己的物品进行裁剪处理
}
返回结果;
}

这意味着我不处理的任何项目都返回
null
。以前有没有人见过这种行为,并确切知道在哪里解决它?

更新日期2014年4月29日

与此同时,我找到了一个更好的方法来治疗这个问题。在数据提供程序的配置中,您可以确定哪些方法可用,如下所示:

<sitecore>
    <dataProviders>
        <CustomDataProvider type="MyLib.Data.CustomDataProvider, MyLib">
            <disable>*</disable>
            <enable>GetChildIDs</enable>
            <enable>GetParentID</enable>
            <enable>GetItemDefinition</enable>
            <enable>GetItemVersions</enable>
            <enable>GetItemFields</enable>
        </CustomDataProvider>
    </dataProviders>
</sitecore>

*
GetChildId
GetParentID
GetItemDefinition
GetItemVersions
GetItemFields

对于那些在遵循以下指南时遇到与我相同问题的人:

他们忘了提到,当您集成到现有数据库(如主数据库)时,您需要覆盖以下方法:

/// <summary>
/// We don't store any languages.
/// </summary>
public override LanguageCollection GetLanguages(CallContext context)
{
    return null;
}
//
///我们不储存任何语言。
/// 
公共覆盖语言集合GetLanguages(CallContext上下文)
{
返回null;
}

否则,您的数据提供程序会以某种方式足够智能地返回语言,从而将它们有效地提供给Sitecore两次,从而导致上面显示的问题。(它打破了TDS)

2014年4月29日更新

与此同时,我找到了一个更好的方法来治疗这个问题。在数据提供程序的配置中,您可以确定哪些方法可用,如下所示:

<sitecore>
    <dataProviders>
        <CustomDataProvider type="MyLib.Data.CustomDataProvider, MyLib">
            <disable>*</disable>
            <enable>GetChildIDs</enable>
            <enable>GetParentID</enable>
            <enable>GetItemDefinition</enable>
            <enable>GetItemVersions</enable>
            <enable>GetItemFields</enable>
        </CustomDataProvider>
    </dataProviders>
</sitecore>

*
GetChildId
GetParentID
GetItemDefinition
GetItemVersions
GetItemFields

对于那些在遵循以下指南时遇到与我相同问题的人:

他们忘了提到,当您集成到现有数据库(如主数据库)时,您需要覆盖以下方法:

/// <summary>
/// We don't store any languages.
/// </summary>
public override LanguageCollection GetLanguages(CallContext context)
{
    return null;
}
//
///我们不储存任何语言。
/// 
公共覆盖语言集合GetLanguages(CallContext上下文)
{
返回null;
}

否则,您的数据提供程序会以某种方式足够智能地返回语言,从而将它们有效地提供给Sitecore两次,从而导致上面显示的问题。(这打破了TDS)

我遇到了完全相同的问题。覆盖GetItemVersions和GetLanguages修复了该问题

public override VersionUriList GetItemVersions(ItemDefinition itemDefinition, CallContext context)
        {
            if (return true if the itemDefinition is a item from your db)
            {
                VersionUriList result = new VersionUriList();

                //Add versions on languages you want
                result.Add(LanguageManager.GetLanguage("nl"), Sitecore.Data.Version.First);
                result.Add(LanguageManager.GetLanguage("en"), Sitecore.Data.Version.First);

                return result;
            }
            //itemDefinition is a item from a sitecore db => return null (sc will handle versions of his items)
            return null;
        }

并按照建议重写GetLanguages以返回null

我遇到了完全相同的问题。覆盖GetItemVersions和GetLanguages修复了该问题

public override VersionUriList GetItemVersions(ItemDefinition itemDefinition, CallContext context)
        {
            if (return true if the itemDefinition is a item from your db)
            {
                VersionUriList result = new VersionUriList();

                //Add versions on languages you want
                result.Add(LanguageManager.GetLanguage("nl"), Sitecore.Data.Version.First);
                result.Add(LanguageManager.GetLanguage("en"), Sitecore.Data.Version.First);

                return result;
            }
            //itemDefinition is a item from a sitecore db => return null (sc will handle versions of his items)
            return null;
        }
并根据建议重写GetLanguages以返回null