Sitecore Glass.Mapper V3是否支持语言回退(字段级和项目级)?

Sitecore Glass.Mapper V3是否支持语言回退(字段级和项目级)?,sitecore,sitecore6,glass-mapper,Sitecore,Sitecore6,Glass Mapper,我们刚刚更新了我们的项目,使用Glass.mapperv3。我们喜欢它。但我们遇到了一个问题。它似乎不尊重语言退路 我们已经设置了我们的网站,如果用户选择了非默认语言,他们将看到该语言的项目(如果存在)。如果没有,他们将看到默认(“回退”)语言版本。我们还在字段级别设置了此项,因此,如果存在项的非默认版本,但并非所有字段都已更改,则任何未更改的字段都将返回该字段的默认语言版本值 我们可以做些什么来让Glass使用语言回退吗?我正在更新这篇文章,介绍一下我们为什么要进行检查。如果您请求一个不存在的

我们刚刚更新了我们的项目,使用Glass.mapperv3。我们喜欢它。但我们遇到了一个问题。它似乎不尊重语言退路

我们已经设置了我们的网站,如果用户选择了非默认语言,他们将看到该语言的项目(如果存在)。如果没有,他们将看到默认(“回退”)语言版本。我们还在字段级别设置了此项,因此,如果存在项的非默认版本,但并非所有字段都已更改,则任何未更改的字段都将返回该字段的默认语言版本值


我们可以做些什么来让Glass使用语言回退吗?

我正在更新这篇文章,介绍一下我们为什么要进行检查。如果您请求一个不存在的Sitecore项目,您会得到一个空值,因此这很容易处理。但是,如果您请求一个特定语言中不存在的Sitecore项目,则返回一个没有版本的项目。这意味着我们必须做这个检查,因为否则玻璃将返回空类,我认为这没有多大意义

这个答案会有点实验性

首先,在sphere.cs文件中,您需要禁用检查:

受保护的无效应用程序\u BeginRequest()
{
Sitecore.Context.Items[“Disable”]=新版本CountDisabler();
}
然后,我们可以将检查移到稍后的对象构造管道。首先创建一个任务:

公共类FallbackCheckTask:IObjectConstructionTask
{
public void Execute(ObjectConstructionArgs args)
{
如果(args.Result==null)
{
var scContext=args.AbstractTypeCreationContext作为SitecoreTypeCreationContext;
if(scContext.Item==null)
{
args.AbortPipeline();
返回;
}    
//这将检查项目是否由回退模块创建
if(scContext.Item是Sitecore.Data.Managers.StubItem)
{
返回;
}
//我们可以尝试将渲染参数转换为玻璃模型,如果是,请返回。
if(String.Compare(scContext.Item.path.FullPath,“[orphan]/renderingParameters”,true)==0)
{
返回;
}
if(scContext.Item.Versions.Count==0)
{
args.AbortPipeline();
返回;
}
}
}
}
最后在GlassMapperScCustom类中注册此任务:

publicstaticvoidcastleconfig(IWindsorContainer){
var config=new config();
集装箱。登记(
Component.For().ImplementedBy().LifestyleTransient()实现
);
container.Install(新的SitecoreInstaller(配置));
}

我还没有测试过这一点,但在理论上应该是可行的当使用sitecore 7(7.2)+IoC+solr+mvc时,提供的解决方案几乎没有潜在问题

使用IoC ex Winsdor时,请确保您的Global.asax与此类似
。有一次,错误地将此文件更改为
,并且语言回退功能不起作用。我们得到的错误也不是描述性的,因为我们认为solr模式是不正确的


CodeSitecore.Context.Items[“Disable”]=new VersionCountDisabler()可以添加到PreprerequestProcessor中,它运行良好,这是比修改global.asax更好的解决方案

您使用的是哪种语言回退模块?部分语言回退模块使用标准值提供程序,因此它应该可以毫无问题地使用Glass。我从未使用过回退语言项提供程序,所以我不太确定。失败的是PLF,还是仅仅是项/版本级回退?我们同时使用部分语言回退(字段级)和回退语言项提供程序(项级)模块。当我尝试获取一个不存在的项目的语言版本时(当只有“en”存在时尝试获取“es”),我得到null。如果有一个“es”项,但某些字段没有更改(返回到“en”版本),则从Glass访问时,这些字段将显示为空。Dan,你可以通过电子邮件向我发送更多有关你尝试执行的操作的详细信息吗?理论上,Glass应该可以工作,因为它只是包装了Sitecore项目API,也就是说,项目后面发生的任何事情,例如回退模块,都应该仍然可以工作。@techphoria414,我支持更正。只有回退语言项提供程序模块不工作。经过进一步调查,它从字段级回退返回值,但当字段是项目列表时,列表中没有项目(因为项目级回退无法获取项目)。好吧,迈克·爱德华兹再次攻击。它的工作原理与所描述的完全相同。我考虑添加一个检查来查看当前站点是否启用了回退功能,但我认为这是一个不必要的性能问题,因为无论是否启用了回退功能,代码仍然可以工作。非常好,再次感谢你,Mike。渲染参数项没有版本,因此当尝试在控件中使用GetParameters时(来自本教程),此代码会过早中止管道。我们需要在第二个AbortPipeline调用上方进行检查,以确保scContext.Item不是“renderingParameters”项。是否有人使用MVC在Sitecore 7.2中实现了这一点?除非为该语言创建了版本,否则似乎不会返回任何项。然而,这似乎只是在使用Sitecore Query+Glass时出现的,也许这是一个单独的问题?@PirateKitten您可以将您的问题记录在GitHub上,我来看看。