#19693: route/content tokens

Work Item: 19693
This commit is contained in:
Codinlab
2015-02-08 13:08:44 +00:00
committed by agriffard
parent 46fd3d22f0
commit c328fec5ef

View File

@@ -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:<element>"), T("The Query String value for the specified element."))
.Token("Form:*", T("Form:<element>"), T("The Form value for the specified element."))
.Token("Route:*", T("Route:<key>"), 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;
}
}
}