我们刚刚更新了我们的项目以使用Glass.Mapper V3。我们喜欢它。但是我们遇到了一个问题。它似乎不尊重语言后备。
我们设置了我们的网站,以便在用户选择非默认语言时,他们会看到该语言的项目(如果存在)。如果没有,他们将看到默认(“后备”)语言版本。我们还在字段级别进行了设置,因此如果项目的非默认版本但并非所有字段都已更改,则任何未更改的字段都将回退到该字段的默认语言版本的值。
我们可以做些什么来让Glass使用语言回退吗?
答案 0 :(得分:6)
我正在更新这个,并介绍了我们进行检查的原因。如果您要求Sitecore项目不存在,则会获得空值,因此处理起来很简单。但是,如果您要求在该特定语言中不存在的Sitecore项目,则返回没有版本的项目。这意味着我们必须做这个检查,否则Glass会最终返回空类,我觉得这没有多大意义。
这个答案会有点实验性的。
首先在Spherical.cs文件中,您需要禁用检查:
protected void Application_BeginRequest()
{
Sitecore.Context.Items["Disable"] = new VersionCountDisabler();
}
然后,我们可以将检查移到后面的Object Construction管道。首先创建一个任务:
public class FallbackCheckTask : IObjectConstructionTask
{
public void Execute(ObjectConstructionArgs args)
{
if (args.Result == null)
{
var scContext = args.AbstractTypeCreationContext as SitecoreTypeCreationContext;
if (scContext.Item == null)
{
args.AbortPipeline();
return;
}
//this checks to see if the item was created by the fallback module
if (scContext.Item is Sitecore.Data.Managers.StubItem)
{
return;
}
// we could be trying to convert rendering parameters to a glass model, and if so, just return.
if (String.Compare(scContext.Item.Paths.FullPath, "[orphan]/renderingParameters", true) == 0)
{
return;
}
if (scContext.Item.Versions.Count == 0)
{
args.AbortPipeline();
return;
}
}
}
}
然后最终在GlassMapperScCustom类中注册此任务:
public static void CastleConfig(IWindsorContainer container){
var config = new Config();
container.Register(
Component.For<IObjectConstructionTask>().ImplementedBy<FallbackCheckTask>().LifestyleTransient()
);
container.Install(new SitecoreInstaller(config));
}
我没有对此进行过测试,但它应该在理论上工作&lt; - 免责声明; - )
答案 1 :(得分:1)
当使用sitecore 7(7.2)+ IoC + solr + mvc时,提供的解决方案几乎没有潜在问题。
使用IoC ex Winsdor时,请确保您的Global.asax看起来像<%@ Application Codebehind="Global.asax.cs" Inherits="Sitecore.ContentSearch.SolrProvider.CastleWindsorIntegration.WindsorApplication" Language="C#" %>
。错误之后,此文件已更改为<%@ Application Codebehind="Global.asax.cs" Inherits="Merck.Manuals.Web.Global" Language="C#" %>
且语言回退无效。我们得到的错误也没有描述性,因为我们认为solr架构不正确。
代码Sitecore.Context.Items["Disable"] = new VersionCountDisabler();
可以添加到PreprocessRequestProcessor中,并且工作正常,这是修改global.asax的更好解决方案。