mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Slugs in pages module no longer case sensitive. Introduces concept of transient and singleton dependencies. Singleton dependencies really mean single instance per shell.
--HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4042638
This commit is contained in:
@@ -6,9 +6,11 @@ using Orchard.CmsPages.Services;
|
||||
namespace Orchard.CmsPages.Controllers {
|
||||
public class TemplatesController : Controller {
|
||||
private readonly IPageManager _pageManager;
|
||||
private readonly ISlugConstraint _slugConstraint;
|
||||
|
||||
public TemplatesController(IPageManager pageManager) {
|
||||
public TemplatesController(IPageManager pageManager, ISlugConstraint slugConstraint) {
|
||||
_pageManager = pageManager;
|
||||
_slugConstraint = slugConstraint;
|
||||
}
|
||||
|
||||
public ActionResult Show(string slug) {
|
||||
@@ -17,7 +19,9 @@ namespace Orchard.CmsPages.Controllers {
|
||||
throw new ArgumentNullException("slug");
|
||||
}
|
||||
|
||||
var revision = _pageManager.GetPublishedBySlug(slug);
|
||||
var correctedSlug = _slugConstraint.LookupPublishedSlug(slug);
|
||||
|
||||
var revision = _pageManager.GetPublishedBySlug(correctedSlug);
|
||||
if (revision == null) {
|
||||
//TODO: Error message
|
||||
throw new HttpException(404, "slug " + slug + " was not found");
|
||||
|
@@ -96,6 +96,7 @@
|
||||
<Compile Include="Services\Templates\MetadataEntry.cs" />
|
||||
<Compile Include="Services\Templates\TemplateMetadataParser.cs" />
|
||||
<Compile Include="Services\XmlRpcHandler.cs" />
|
||||
<Compile Include="Services\SlugConstraint.cs" />
|
||||
<Compile Include="ViewModels\ChooseTemplateViewModel.cs" />
|
||||
<Compile Include="ViewModels\PageCreateViewModel.cs" />
|
||||
<Compile Include="ViewModels\PageEditViewModel.cs" />
|
||||
|
@@ -1,18 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Collections.Generic;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Routing;
|
||||
using Orchard.CmsPages.Services;
|
||||
using Orchard.Mvc.Routes;
|
||||
|
||||
namespace Orchard.CmsPages {
|
||||
public class Routes : IRouteProvider, IRouteConstraint {
|
||||
private readonly IPageManager _pageManager;
|
||||
|
||||
public Routes(IPageManager pageManager) {
|
||||
_pageManager = pageManager;
|
||||
public class Routes : IRouteProvider {
|
||||
private readonly ISlugConstraint _slugConstraint;
|
||||
|
||||
public Routes(ISlugConstraint slugConstraint) {
|
||||
_slugConstraint = slugConstraint;
|
||||
}
|
||||
|
||||
public void GetRoutes(ICollection<RouteDescriptor> routes) {
|
||||
@@ -21,7 +19,6 @@ namespace Orchard.CmsPages {
|
||||
}
|
||||
|
||||
public IEnumerable<RouteDescriptor> GetRoutes() {
|
||||
IRouteConstraint slugConstraint = this;
|
||||
return new[] {
|
||||
new RouteDescriptor {
|
||||
Priority = 10,
|
||||
@@ -33,7 +30,7 @@ namespace Orchard.CmsPages {
|
||||
{"action", "show"}
|
||||
},
|
||||
new RouteValueDictionary {
|
||||
{"slug", slugConstraint}
|
||||
{"slug", _slugConstraint}
|
||||
},
|
||||
new RouteValueDictionary {
|
||||
{"area", "Orchard.CmsPages"}
|
||||
@@ -43,15 +40,5 @@ namespace Orchard.CmsPages {
|
||||
};
|
||||
}
|
||||
|
||||
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
|
||||
//TEMP: direct db call...
|
||||
object value;
|
||||
if (values.TryGetValue(parameterName, out value)) {
|
||||
var parameterValue = Convert.ToString(value);
|
||||
bool result = _pageManager.GetCurrentlyPublishedSlugs().Count(slug => slug == parameterValue) != 0;
|
||||
return result;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Routing;
|
||||
using Orchard.Tasks;
|
||||
|
||||
namespace Orchard.CmsPages.Services {
|
||||
public interface ISlugConstraint : IRouteConstraint, ISingletonDependency {
|
||||
void SetCurrentlyPublishedSlugs(IEnumerable<string> slugs);
|
||||
string LookupPublishedSlug(string slug);
|
||||
}
|
||||
|
||||
public class SlugConstraint : ISlugConstraint {
|
||||
private IDictionary<string, string> _currentlyPublishedSlugs = new Dictionary<string,string>();
|
||||
|
||||
public void SetCurrentlyPublishedSlugs(IEnumerable<string> values) {
|
||||
_currentlyPublishedSlugs = values
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToDictionary(value => value, StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
public string LookupPublishedSlug(string slug) {
|
||||
string actual;
|
||||
if (_currentlyPublishedSlugs.TryGetValue(slug, out actual))
|
||||
return actual;
|
||||
return slug;
|
||||
}
|
||||
|
||||
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
|
||||
object value;
|
||||
if (values.TryGetValue(parameterName, out value)) {
|
||||
var parameterValue = Convert.ToString(value);
|
||||
return _currentlyPublishedSlugs.ContainsKey(parameterValue);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class SlugConstraintUpdater : IBackgroundTask{
|
||||
private readonly IPageManager _pageManager;
|
||||
private readonly ISlugConstraint _slugConstraint;
|
||||
|
||||
public SlugConstraintUpdater(IPageManager pageManager, ISlugConstraint slugConstraint) {
|
||||
_pageManager = pageManager;
|
||||
_slugConstraint = slugConstraint;
|
||||
}
|
||||
|
||||
public void Sweep() {
|
||||
_slugConstraint.SetCurrentlyPublishedSlugs(_pageManager.GetCurrentlyPublishedSlugs());
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user