Orchardcms 不同的观点与果园多租户交替

Orchardcms 不同的观点与果园多租户交替,orchardcms,multi-tenant,Orchardcms,Multi Tenant,我安装了Orchard CMS,启用了多租户模块,并设置了2个租户。两个租户使用相同的主题 我想要的是能够创建以每个租户为目标的视图替换,例如: ~/Themes/MyTheme/Views/Content.Tenant1.cshtml将以租户1和 ~/Themes/MyTheme/Views/Content.Tenant2.cshtml将以租户2为目标 我意识到我可以用两个不同(但非常相似)的主题来做,但这感觉像是不必要的重复。答案当然是从shapedisplayents继承并绑定到上下文。S

我安装了Orchard CMS,启用了多租户模块,并设置了2个租户。两个租户使用相同的主题

我想要的是能够创建以每个租户为目标的视图替换,例如:

~/Themes/MyTheme/Views/Content.Tenant1.cshtml
将以租户1和
~/Themes/MyTheme/Views/Content.Tenant2.cshtml
将以租户2为目标


我意识到我可以用两个不同(但非常相似)的主题来做,但这感觉像是不必要的重复。

答案当然是从
shapedisplayents
继承并绑定到
上下文。ShapeMetadata.ondisplay
事件,因此:

public class MultiTenancyAlternatesFactory : ShapeDisplayEvents
{
    private readonly ShellSettings _shellSettings;

    public MultiTenancyAlternatesFactory(ShellSettings shellSettings)
    {
        _shellSettings = shellSettings;
    }

    public override void Displaying(ShapeDisplayingContext context)
    {
        context.ShapeMetadata.OnDisplaying(displayingContext =>
        {
            var tenant = _shellSettings.Name;

            // look for ContentItem property
            ContentItem contentItem = displayingContext.Shape.ContentItem;

            // if not, check for ContentPart 
            if (contentItem == null)
            {
                ContentPart contentPart = displayingContext.Shape.ContentPart;
                if (contentPart != null)
                {
                    contentItem = contentPart.ContentItem;
                }
            }

            var shapeName = displayingContext.ShapeMetadata.Type;

            if (contentItem != null)
            {
                var contentTypeName = contentItem.ContentType;

                displayingContext.ShapeMetadata.Alternates.Add(shapeName + "__" + contentTypeName + "__tenant__" + tenant);
            }

            displayingContext.ShapeMetadata.Alternates.Add(shapeName + "__tenant__" + tenant);

        });
    }
}

我试图实现上面的代码,但它只适用于形状

我想查看索引tennant-[TenantName].cshtml以覆盖Index.cshtml

为此,我必须覆盖RazorViewEngineProvider,然后添加ViewEngine要查找的额外路径。我使用了[OrchardSuppressDependency…],因为我不喜欢对实际的Orchard CMS代码进行更改,因为这样做会使将来的升级更加痛苦

我希望这能帮助那些在果园多租户中遇到同样问题的人

[UsedImplicitly]
[OrchardSuppressDependency("Orchard.Mvc.ViewEngines.Razor.RazorViewEngineProvider")]
public class RazorViewEngineProvider : Orchard.Mvc.ViewEngines.Razor.RazorViewEngineProvider, IViewEngineProvider, IShapeTemplateViewEngine
{
    private readonly string _tenant;
    public RazorViewEngineProvider(ShellSettings shellSettings)
    {
        _tenant = shellSettings.Name;
    }

    public new IViewEngine CreateThemeViewEngine(CreateThemeViewEngineParams parameters)
    {
        var viewEngine = base.CreateThemeViewEngine(parameters);
        if (!string.IsNullOrWhiteSpace(_tenant))
        {
            var razorView = viewEngine as RazorViewEngine;
            if (razorView != null)
            {
                razorView.PartialViewLocationFormats = addTenant(razorView.PartialViewLocationFormats);
                razorView.AreaPartialViewLocationFormats = addTenant(razorView.AreaPartialViewLocationFormats);
            }
        }

        return viewEngine;
    }

    public new IViewEngine CreateModulesViewEngine(CreateModulesViewEngineParams parameters)
    {
        var viewEngine = base.CreateModulesViewEngine(parameters);
        if (!string.IsNullOrWhiteSpace(_tenant))
        {
            var razorView = viewEngine as RazorViewEngine;
            if (razorView != null)
            {
                razorView.ViewLocationFormats = addTenant(razorView.ViewLocationFormats);
                razorView.PartialViewLocationFormats = addTenant(razorView.PartialViewLocationFormats);
                razorView.AreaViewLocationFormats = addTenant(razorView.AreaViewLocationFormats);
                razorView.AreaPartialViewLocationFormats = addTenant(razorView.AreaPartialViewLocationFormats);
            }
        }

        return viewEngine;

    }

    private string[] addTenant(string[] views)
    {
        var tenantedView = new List<string>();
        foreach (var view in views)
        {
            if (view.EndsWith(".cshtml",StringComparison.OrdinalIgnoreCase))
                tenantedView.Add(string.Format ("{0}-tenant-{1}.cshtml", view.Substring(0,view.Length - 7) ,_tenant));
            tenantedView.Add(view);
        }
        return tenantedView.ToArray();
    }
}
[usedimplicity]
[OrchardSuppressDependency(“Orchard.Mvc.ViewEngines.Razor.RazorViewEngineProvider”)]
公共类RazorViewEngineProvider:Orchard.Mvc.ViewEngines.Razor.RazorViewEngineProvider、IViewEngineProvider、IShapeTemplateViewEngine
{
私有只读字符串\u租户;
公共RazorViewEngineProvider(外壳设置外壳设置)
{
_tenant=shellSettings.Name;
}
公共新IViewEngine CreateThemeViewEngine(CreateThemeViewEngineParams参数)
{
var viewEngine=base.CreateThemeViewEngine(参数);
如果(!string.IsNullOrWhiteSpace(_))
{
var razorView=作为RazorViewEngine的viewEngine;
如果(razorView!=null)
{
razorView.PartialViewLocationFormats=addTenant(razorView.PartialViewLocationFormats);
razorView.AreaPartialViewLocationFormats=添加租户(razorView.AreaPartialViewLocationFormats);
}
}
返回视图引擎;
}
公共新IViewEngine CreateModulesViewEngine(CreateModulesViewEngineParameters)
{
var viewEngine=base.CreateModulesViewEngine(参数);
如果(!string.IsNullOrWhiteSpace(_))
{
var razorView=作为RazorViewEngine的viewEngine;
如果(razorView!=null)
{
razorView.ViewLocationFormats=addTenant(razorView.ViewLocationFormats);
razorView.PartialViewLocationFormats=addTenant(razorView.PartialViewLocationFormats);
razorView.AreaViewLocationFormats=添加租户(razorView.AreaViewLocationFormats);
razorView.AreaPartialViewLocationFormats=添加租户(razorView.AreaPartialViewLocationFormats);
}
}
返回视图引擎;
}
私有字符串[]添加租户(字符串[]视图)
{
var tenatedView=新列表();
foreach(视图中的变量视图)
{
if(view.EndsWith(“.cshtml”,StringComparison.OrdinalIgnoreCase))
添加(string.Format(“{0}-tenant-{1}.cshtml”,view.Substring(0,view.Length-7),u tenant));
添加(视图);
}
返回tenantedView.ToArray();
}
}