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

Dan*_*air 6 sitecore sitecore6 glass-mapper

我们刚刚更新了我们的项目以使用Glass.Mapper V3.我们喜欢它.但是我们遇到了一个问题.它似乎不尊重语言后备.

我们设置了我们的站点,这样如果用户选择非默认语言,他们将看到该语言的项目(如果存在).如果没有,他们将看到默认("后备")语言版本.我们还在字段级别进行了设置,因此如果项目的非默认版本但未更改所有字段,则任何未更改的字段都将回退到该字段的默认语言版本的值.

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

Mic*_*rds 6

我正在更新这个有关我们为何进行检查的背景知识.如果您要求Sitecore项目不存在,则会获得空值,因此处理起来很简单.但是,如果您要求在该特定语言中不存在的Sitecore项目,则返回没有版本的项目.这意味着我们必须做这个检查,否则Glass会最终返回空类,我觉得这没有多大意义.

这个答案会得到一点实验.

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

protected void Application_BeginRequest()
{
    Sitecore.Context.Items["Disable"] = new VersionCountDisabler();
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以将检查移到后面的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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后最终在GlassMapperScCustom类中注册此任务:

    public static void CastleConfig(IWindsorContainer container){
        var config = new Config();

        container.Register(
            Component.For<IObjectConstructionTask>().ImplementedBy<FallbackCheckTask>().LifestyleTransient()
            );
        container.Install(new SitecoreInstaller(config));
    }
Run Code Online (Sandbox Code Playgroud)

我没有测试过这个,但它应该在理论上工作< - 免责声明;-)