Orchardcms 不同的观点与果园多租户交替
我安装了Orchard CMS,启用了多租户模块,并设置了2个租户。两个租户使用相同的主题 我想要的是能够创建以每个租户为目标的视图替换,例如: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
~/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();
}
}