From 96ffefd078450821be92b8143c56f3344efb1d59 Mon Sep 17 00:00:00 2001 From: Hermes Sbicego Date: Thu, 11 Jul 2019 21:09:13 +0200 Subject: [PATCH] Placement's path condition now strips the Tenant/Site UrlPrefix (#8222) Fixes #6962 --- .../Services/ContentDisplayBase.cs | 11 ++++++-- .../Services/ContentFieldDisplay.cs | 27 ++++++++++++++----- .../Services/ContentPartDisplay.cs | 19 +++++++++++-- .../DefaultContentDisplay.cs | 19 ++++++++++--- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentDisplayBase.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentDisplayBase.cs index 1e15899f7..51f46b5d5 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentDisplayBase.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentDisplayBase.cs @@ -5,7 +5,9 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.FileSystems.VirtualPath; +using Orchard.Mvc.Routes; using Orchard.UI.Zones; namespace Orchard.Layouts.Services { @@ -30,9 +32,9 @@ namespace Orchard.Layouts.Services { _requestContext = requestContext; _virtualPathProvider = virtualPathProvider; _workContextAccessor = workContextAccessor; - } + public abstract UrlPrefix TenantUrlPrefix { get; } public abstract string DefaultStereotype { get; } public BuildDisplayContext BuildDisplayContext(IContent content, string displayType, string groupId) { @@ -145,7 +147,12 @@ namespace Orchard.Layouts.Services { /// Gets the current app-relative path, i.e. ~/my-blog/foo. /// private string GetPath() { - return VirtualPathUtility.AppendTrailingSlash(_virtualPathProvider.ToAppRelative(_requestContext.HttpContext.Request.Path)); + var appRelativePath = _virtualPathProvider.ToAppRelative(_requestContext.HttpContext.Request.Path); + // If the tenant has a prefix, we strip the tenant prefix away. + if (TenantUrlPrefix != null) + appRelativePath = TenantUrlPrefix.RemoveLeadingSegments(appRelativePath); + + return VirtualPathUtility.AppendTrailingSlash(appRelativePath); } } } diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentFieldDisplay.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentFieldDisplay.cs index a360722ac..051051f80 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentFieldDisplay.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentFieldDisplay.cs @@ -6,24 +6,39 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.FileSystems.VirtualPath; +using Orchard.Mvc.Routes; namespace Orchard.Layouts.Services { public class ContentFieldDisplay : ContentDisplayBase, IContentFieldDisplay { private readonly IEnumerable _contentFieldDrivers; - + private readonly ShellSettings _shellSettings; public ContentFieldDisplay( IShapeFactory shapeFactory, - Lazy shapeTableLocator, + Lazy shapeTableLocator, RequestContext requestContext, IVirtualPathProvider virtualPathProvider, - IWorkContextAccessor workContextAccessor, - IEnumerable contentFieldDrivers) + IWorkContextAccessor workContextAccessor, + ShellSettings shellSettings, + IEnumerable contentFieldDrivers) : base(shapeFactory, shapeTableLocator, requestContext, virtualPathProvider, workContextAccessor) { - + _shellSettings = shellSettings; _contentFieldDrivers = contentFieldDrivers; } + public override UrlPrefix TenantUrlPrefix { + get { + if (!string.IsNullOrEmpty(_shellSettings.RequestUrlPrefix)) { + return new UrlPrefix(_shellSettings.RequestUrlPrefix); + } + else { + return null; + } + } + } + + public override string DefaultStereotype { get { return "ContentField"; } } @@ -63,7 +78,7 @@ namespace Orchard.Layouts.Services { if (result != null) result.Apply(context); }, Logger); - + return context.Shape; } diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentPartDisplay.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentPartDisplay.cs index 3d2adca4d..8236fb33a 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentPartDisplay.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ContentPartDisplay.cs @@ -6,23 +6,38 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.FileSystems.VirtualPath; +using Orchard.Mvc.Routes; namespace Orchard.Layouts.Services { public class ContentPartDisplay : ContentDisplayBase, IContentPartDisplay { private readonly IEnumerable _contentPartDrivers; + private readonly ShellSettings _shellSettings; + public ContentPartDisplay( IShapeFactory shapeFactory, Lazy shapeTableLocator, RequestContext requestContext, IVirtualPathProvider virtualPathProvider, - IWorkContextAccessor workContextAccessor, + IWorkContextAccessor workContextAccessor, + ShellSettings shellSettings, IEnumerable contentPartDrivers) : base(shapeFactory, shapeTableLocator, requestContext, virtualPathProvider, workContextAccessor) { - + _shellSettings = shellSettings; _contentPartDrivers = contentPartDrivers; } + public override UrlPrefix TenantUrlPrefix { + get { + if (!string.IsNullOrEmpty(_shellSettings.RequestUrlPrefix)) { + return new UrlPrefix(_shellSettings.RequestUrlPrefix); + } + else { + return null; + } + } + } public override string DefaultStereotype { get { return "ContentPart"; } diff --git a/src/Orchard/ContentManagement/DefaultContentDisplay.cs b/src/Orchard/ContentManagement/DefaultContentDisplay.cs index 88bd2ec10..bbc9ef150 100644 --- a/src/Orchard/ContentManagement/DefaultContentDisplay.cs +++ b/src/Orchard/ContentManagement/DefaultContentDisplay.cs @@ -5,8 +5,10 @@ using System.Web.Routing; using Orchard.ContentManagement.Handlers; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.FileSystems.VirtualPath; using Orchard.Logging; +using Orchard.Mvc.Routes; using Orchard.UI.Zones; namespace Orchard.ContentManagement { @@ -18,6 +20,8 @@ namespace Orchard.ContentManagement { private readonly RequestContext _requestContext; private readonly IVirtualPathProvider _virtualPathProvider; private readonly IWorkContextAccessor _workContextAccessor; + private readonly ShellSettings _shellSettings; + private readonly UrlPrefix _urlPrefix; public DefaultContentDisplay( Lazy> handlers, @@ -25,15 +29,19 @@ namespace Orchard.ContentManagement { Lazy shapeTableLocator, RequestContext requestContext, IVirtualPathProvider virtualPathProvider, - IWorkContextAccessor workContextAccessor) { + IWorkContextAccessor workContextAccessor, + ShellSettings shellSettings) { _handlers = handlers; _shapeFactory = shapeFactory; _shapeTableLocator = shapeTableLocator; _requestContext = requestContext; _virtualPathProvider = virtualPathProvider; _workContextAccessor = workContextAccessor; - + _shellSettings = shellSettings; + if (!string.IsNullOrEmpty(_shellSettings.RequestUrlPrefix)) + _urlPrefix = new UrlPrefix(_shellSettings.RequestUrlPrefix); Logger = NullLogger.Instance; + } public ILogger Logger { get; set; } @@ -158,7 +166,12 @@ namespace Orchard.ContentManagement { /// Gets the current app-relative path, i.e. ~/my-blog/foo. /// private string GetPath() { - return VirtualPathUtility.AppendTrailingSlash(_virtualPathProvider.ToAppRelative(_requestContext.HttpContext.Request.Path)); + var appRelativePath = _virtualPathProvider.ToAppRelative(_requestContext.HttpContext.Request.Path); + // If the tenant has a prefix, we strip the tenant prefix away. + if (_urlPrefix != null) + appRelativePath = _urlPrefix.RemoveLeadingSegments(appRelativePath); + + return VirtualPathUtility.AppendTrailingSlash(appRelativePath); } } }