diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs index a203f45f6..8e8747de4 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs @@ -124,7 +124,7 @@ namespace Orchard.Alias.Implementation { return _aliasStorage.List(sourceStartsWith).Select(item => Tuple.Create(item.Item1, item.Item3.ToRouteValueDictionary(), item.Item4)); } - public IEnumerable LookupVirtualPaths(RouteValueDictionary routeValues,HttpContextBase httpContext) { + public IEnumerable LookupVirtualPaths(RouteValueDictionary routeValues, HttpContextBase httpContext) { return Utils.LookupVirtualPaths(httpContext, _routeDescriptors.Value, routeValues); } diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs index 09a1e2e0a..736fcece6 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs @@ -63,7 +63,7 @@ namespace Orchard.Alias.Implementation.Storage { r => r.Area == areaName && r.Controller == controllerName && r.Action == actionName, o => o.Asc(r => r.Id), 0, 1).FirstOrDefault(); aliasRecord.Action = aliasRecord.Action ?? new ActionRecord { Area = areaName, Controller = controllerName, Action = actionName }; - + aliasRecord.RouteValues = values.ToString(); aliasRecord.Source = source; if (aliasRecord.Action.Id == 0 || aliasRecord.Id == 0) { @@ -106,7 +106,7 @@ namespace Orchard.Alias.Implementation.Storage { foreach (var aliasRecord in _aliasRepository.Fetch(filter)) { _aliasRepository.Delete(aliasRecord); - // Bulk updates might go wrong if we don't flush + // Bulk updates might go wrong if we don't flush. _aliasRepository.Flush(); var dict = ToDictionary(aliasRecord); _aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3 }); @@ -114,7 +114,7 @@ namespace Orchard.Alias.Implementation.Storage { } public IEnumerable, string, int>> List() { - return List((Expression>) null); + return List((Expression>)null); } public IEnumerable, string, int>> List(Expression> predicate) { diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs index 57ce977f4..275e17b32 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs @@ -9,12 +9,10 @@ using Orchard.Autoroute.Settings; using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Models; -using Orchard.Localization; -using Orchard.Logging; using Orchard.Tokens; namespace Orchard.Autoroute.Services { - public class AutorouteService : IAutorouteService { + public class AutorouteService : Component, IAutorouteService { private readonly IAliasService _aliasService; private readonly ITokenizer _tokenizer; @@ -29,41 +27,36 @@ namespace Orchard.Autoroute.Services { ITokenizer tokenizer, IContentDefinitionManager contentDefinitionManager, IContentManager contentManager, - IRouteEvents routeEvents, + IRouteEvents routeEvents, IAliasStorage aliasStorage) { - _aliasService = aliasService; - _tokenizer = tokenizer; - _contentDefinitionManager = contentDefinitionManager; + + _aliasService = aliasService; + _tokenizer = tokenizer; + _contentDefinitionManager = contentDefinitionManager; _contentManager = contentManager; _routeEvents = routeEvents; _aliasStorage = aliasStorage; - - Logger = NullLogger.Instance; - T = NullLocalizer.Instance; } - public ILogger Logger { get; set; } - public Localizer T { get; set; } - public string GenerateAlias(AutoroutePart part) { if (part == null) { throw new ArgumentNullException("part"); } - string pattern = GetDefaultPattern(part.ContentItem.ContentType).Pattern; - - // String.Empty forces pattern based generation. "/" forces homepage - if(part.UseCustomPattern + var pattern = GetDefaultPattern(part.ContentItem.ContentType).Pattern; + + // String.Empty forces pattern based generation. "/" forces homepage. + if (part.UseCustomPattern && (!String.IsNullOrWhiteSpace(part.CustomPattern) || String.Equals(part.CustomPattern, "/"))) { pattern = part.CustomPattern; } - // Convert the pattern and route values via tokens + // Convert the pattern and route values via tokens. var path = _tokenizer.Replace(pattern, BuildTokenContext(part.ContentItem), new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); - // removing trailing slashes in case the container is empty, and tokens are base on it (e.g. home page) - while(path.StartsWith("/")) { + // Removing trailing slashes in case the container is empty, and tokens are base on it (e.g. home page). + while (path.StartsWith("/")) { path = path.Substring(1); } @@ -72,9 +65,7 @@ namespace Orchard.Autoroute.Services { public void PublishAlias(AutoroutePart part) { var displayRouteValues = _contentManager.GetItemMetadata(part).DisplayRouteValues; - _aliasService.Replace(part.DisplayAlias, displayRouteValues, AliasSource); - _routeEvents.Routed(part, part.DisplayAlias); } @@ -101,7 +92,7 @@ namespace Orchard.Autoroute.Services { patterns.Add(routePattern); settings.Patterns = patterns; - // define which pattern is the default + // Define which pattern is the default. if (makeDefault || settings.Patterns.Count == 1) { settings.DefaultPatternIndex = settings.Patterns.IndexOf(routePattern); } @@ -117,12 +108,12 @@ namespace Orchard.Autoroute.Services { public RoutePattern GetDefaultPattern(string contentType) { var settings = GetTypePartSettings(contentType).GetModel(); - // return a default pattern if none is defined - if(settings.DefaultPatternIndex < settings.Patterns.Count) { - return settings.Patterns.ElementAt(settings.DefaultPatternIndex); + // Return a default pattern if none is defined. + if (settings.DefaultPatternIndex < settings.Patterns.Count) { + return settings.Patterns.ElementAt(settings.DefaultPatternIndex); } - return new RoutePattern {Name = "Title", Description = "my-title", Pattern = "{Content.Slug}"}; + return new RoutePattern { Name = "Title", Description = "my-title", Pattern = "{Content.Slug}" }; } public void RemoveAliases(AutoroutePart part) { @@ -146,16 +137,6 @@ namespace Orchard.Autoroute.Services { _aliasService.Delete(part.Path, AliasSource); } - private SettingsDictionary GetTypePartSettings(string contentType) { - var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); - - if (contentDefinition == null) { - throw new OrchardException(T("Unknown content type: {0}", contentType)); - } - - return contentDefinition.Parts.First(x => x.PartDefinition.Name == "AutoroutePart").Settings; - } - public string GenerateUniqueSlug(AutoroutePart part, IEnumerable existingPaths) { if (existingPaths == null || !existingPaths.Contains(part.Path)) return part.Path; @@ -163,22 +144,10 @@ namespace Orchard.Autoroute.Services { int? version = existingPaths.Select(s => GetSlugVersion(part.Path, s)).OrderBy(i => i).LastOrDefault(); return version != null - ? string.Format("{0}-{1}", part.Path, version) + ? String.Format("{0}-{1}", part.Path, version) : part.Path; } - private static int? GetSlugVersion(string path, string potentialConflictingPath) { - int v; - string[] slugParts = potentialConflictingPath.Split(new[] { path }, StringSplitOptions.RemoveEmptyEntries); - - if (slugParts.Length == 0) - return 2; - - return int.TryParse(slugParts[0].TrimStart('-'), out v) - ? (int?)++v - : null; - } - public IEnumerable GetSimilarPaths(string path) { return _contentManager.Query() @@ -191,11 +160,10 @@ namespace Orchard.Autoroute.Services { } public bool ProcessPath(AutoroutePart part) { - var pathsLikeThis = GetSimilarPaths(part.Path).ToArray(); // Don't include *this* part in the list - // of slugs to consider for conflict detection + // of slugs to consider for conflict detection. pathsLikeThis = pathsLikeThis.Where(p => p.ContentItem.Id != part.ContentItem.Id).ToArray(); if (pathsLikeThis.Any()) { @@ -219,5 +187,27 @@ namespace Orchard.Autoroute.Services { private int GetHomePageAliasRecordId() { return _aliasStorage.List(x => x.Path == "").First().Item5; } + + private SettingsDictionary GetTypePartSettings(string contentType) { + var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); + + if (contentDefinition == null) { + throw new OrchardException(T("Unknown content type: {0}", contentType)); + } + + return contentDefinition.Parts.First(x => x.PartDefinition.Name == "AutoroutePart").Settings; + } + + private static int? GetSlugVersion(string path, string potentialConflictingPath) { + int v; + var slugParts = potentialConflictingPath.Split(new[] { path }, StringSplitOptions.RemoveEmptyEntries); + + if (slugParts.Length == 0) + return 2; + + return Int32.TryParse(slugParts[0].TrimStart('-'), out v) + ? (int?)++v + : null; + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Views/EditorTemplates/Parts.Autoroute.Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Autoroute/Views/EditorTemplates/Parts.Autoroute.Edit.cshtml index 072222774..f36084fbf 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Views/EditorTemplates/Parts.Autoroute.Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Views/EditorTemplates/Parts.Autoroute.Edit.cshtml @@ -1,8 +1,7 @@ -@model Orchard.Autoroute.ViewModels.AutoroutePartEditViewModel -@using Orchard.Autoroute -@using Orchard.Mvc.Extensions -@using Orchard.Utility.Extensions; +@using Orchard.Autoroute @using Orchard.Environment.Configuration +@using Orchard.Mvc.Extensions +@model Orchard.Autoroute.ViewModels.AutoroutePartEditViewModel @if(Model.Settings.DefaultPatternIndex == -1) {
@T("The current Content Type does not have a default Autoroute Pattern. Please edit the settings first.")