Может ли Glass.Mapper V3 поддерживать откат языка (на уровне поля и на уровне элемента)?

Мы только что обновили наш проект, чтобы использовать Glass.Mapper V3. Мы любим это. Но мы столкнулись с проблемой. Кажется, он не уважает запас языка.

Наш сайт настроен так, что если пользователь выбирает язык не по умолчанию, он будет видеть элемент этого языка, если он существует. Если нет, они увидят версию языка по умолчанию ("запасной вариант"). Мы также установили это на уровне поля, чтобы при наличии версии элемента, отличной от версии по умолчанию, но при изменении не всех полей, любые неизмененные поля возвращались к значению версии языка по умолчанию для этого поля.

Есть ли что-нибудь, что мы можем сделать, чтобы позволить Glass использовать языковой запасной вариант?

2 ответа

Решение

Я обновляю это с небольшой историей о том, почему мы делаем проверку. Если вы запрашиваете несуществующий элемент Sitecore, вы получаете нулевое значение, так что с ним легко работать. Однако, если вы запрашиваете элемент Sitecore, который не существует на этом конкретном языке, возвращает элемент без версий. Это означает, что мы должны сделать эту проверку, потому что в противном случае Glass в конечном итоге вернет пустой класс, что, я думаю, не имеет большого смысла.

Этот ответ получится немного экспериментальным.

Сначала в файле Spherical.cs вам нужно отключить проверку:

protected void Application_BeginRequest()
{
    Sitecore.Context.Items["Disable"] = new VersionCountDisabler();
}

Затем мы можем переместить проверку позже в конвейер строительства объекта. Сначала создайте задачу:

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));
    }

Я не проверял это, но теоретически это должно работать <- Disclaimer;-)

Существует несколько потенциальных проблем с предоставленным решением при использовании 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.

Другие вопросы по тегам