From c328fec5ef5e06da64f99c288d8eb4d8d66bb11b Mon Sep 17 00:00:00 2001 From: Codinlab Date: Sun, 8 Feb 2015 13:08:44 +0000 Subject: [PATCH] #19693: route/content tokens Work Item: 19693 --- .../Orchard.Tokens/Providers/RequestTokens.cs | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Providers/RequestTokens.cs b/src/Orchard.Web/Modules/Orchard.Tokens/Providers/RequestTokens.cs index 24f5a34c3..2f3b3ae2d 100644 --- a/src/Orchard.Web/Modules/Orchard.Tokens/Providers/RequestTokens.cs +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Providers/RequestTokens.cs @@ -1,12 +1,16 @@ using System; +using System.Web; +using Orchard.ContentManagement; using Orchard.Localization; namespace Orchard.Tokens.Providers { public class RequestTokens : ITokenProvider { private readonly IWorkContextAccessor _workContextAccessor; + private readonly IContentManager _contentManager; - public RequestTokens(IWorkContextAccessor workContextAccessor) { + public RequestTokens(IWorkContextAccessor workContextAccessor, IContentManager contentManager) { _workContextAccessor = workContextAccessor; + _contentManager = contentManager; T = NullLocalizer.Instance; } @@ -16,6 +20,8 @@ namespace Orchard.Tokens.Providers { context.For("Request", T("Http Request"), T("Current Http Request tokens.")) .Token("QueryString:*", T("QueryString:"), T("The Query String value for the specified element.")) .Token("Form:*", T("Form:"), T("The Form value for the specified element.")) + .Token("Route:*", T("Route:"), T("The Route value for the specified key.")) + .Token("Content", T("Content"), T("The request routed Content Item."), "Content") ; } @@ -32,7 +38,65 @@ namespace Orchard.Tokens.Providers { .Token( token => token.StartsWith("Form:", StringComparison.OrdinalIgnoreCase) ? token.Substring("Form:".Length) : null, (token, request) => request.Form.Get(token) + ) + .Token( + token => token.StartsWith("Route:", StringComparison.OrdinalIgnoreCase) ? token.Substring("Route:".Length) : null, + (token, request) => GetRouteValue(token, request) + ) + .Token("Content", + (request) => DisplayText(GetRoutedContentItem(request)) + ) + .Chain("Content", "Content", + (request) => GetRoutedContentItem(request) ); } + + private static string GetRouteValue(string token, HttpRequestBase request) { + object result; + if (!request.RequestContext.RouteData.Values.TryGetValue(token, out result)) { + return String.Empty; + } + + return result.ToString(); + } + + private ContentItem GetRoutedContentItem(HttpRequestBase request) { + String area = GetRouteValue("area", request); + String action = GetRouteValue("action", request); + int contentId; + + if (!String.Equals(area, "Containers", StringComparison.OrdinalIgnoreCase) && !String.Equals(area, "Contents", StringComparison.OrdinalIgnoreCase)) { + return null; + } + if (!String.Equals(GetRouteValue("controller", request), "Item", StringComparison.OrdinalIgnoreCase)) { + return null; + } + if (!int.TryParse(GetRouteValue("id", request), out contentId)) { + return null; + } + + if (String.Equals(action, "Display", StringComparison.OrdinalIgnoreCase)) { + return _contentManager.Get(contentId, VersionOptions.Published); + } + else if (String.Equals(action, "Preview", StringComparison.OrdinalIgnoreCase)) { + VersionOptions versionOptions = VersionOptions.Latest; + int version; + if (int.TryParse(request.QueryString["version"], out version)) { + versionOptions = VersionOptions.Number(version); + } + return _contentManager.Get(contentId, versionOptions); + } + else { + return null; + } + } + + private string DisplayText(IContent content) { + if (content == null) { + return String.Empty; + } + + return _contentManager.GetItemMetadata(content).DisplayText; + } } } \ No newline at end of file