From 79042774bd3042362b094a2f44b48032aa64a733 Mon Sep 17 00:00:00 2001 From: Nicholas Mayne Date: Sat, 30 Aug 2014 00:45:55 +0100 Subject: [PATCH] Adding Culture Rule Provider. this required a change to the IRuleProvider to be an IEventHandler rather than a direct IDependency --- .../Orchard.Localization.csproj | 1 + .../ContentDisplayedRuleProvider.cs | 52 +++++++++++++++++++ .../Orchard.Widgets/RuleEngine/RuleManager.cs | 9 ++-- .../Orchard.Widgets/Services/IRuleProvider.cs | 6 ++- 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj index 6ea0971b3..1bfe06e09 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj +++ b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj @@ -75,6 +75,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs b/src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs new file mode 100644 index 000000000..b5b049ced --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Localization/RuleEngine/ContentDisplayedRuleProvider.cs @@ -0,0 +1,52 @@ +using System; +using System.Globalization; +using System.Linq; +using Orchard.Events; +using Orchard.Localization.Services; +using Orchard.Mvc; + +namespace Orchard.Localization.RuleEngine { + public interface IRuleProvider : IEventHandler { + void Process(dynamic ruleContext); + } + + public class CultureRuleProvider : IRuleProvider { + private readonly ICultureManager _cultureManager; + private readonly IHttpContextAccessor _httpContextAccessor; + + public CultureRuleProvider(ICultureManager cultureManager, IHttpContextAccessor httpContextAccessor) { + _cultureManager = cultureManager; + _httpContextAccessor = httpContextAccessor; + } + + public void Process(dynamic ruleContext) { + if (!String.Equals(ruleContext.FunctionName, "culture-code", StringComparison.OrdinalIgnoreCase)) { + ProcessCultureCode(ruleContext); + } + + if (!String.Equals(ruleContext.FunctionName, "culture-lcid", StringComparison.OrdinalIgnoreCase)) { + ProcessCultureId(ruleContext); + } + } + + private void ProcessCultureCode(dynamic ruleContext) { + var httpContext = _httpContextAccessor.Current(); + var currentUserCulture = CultureInfo.GetCultureInfo(_cultureManager.GetCurrentCulture(httpContext)); + + ruleContext.Result = ((object[])ruleContext.Arguments) + .Cast() + .Select(CultureInfo.GetCultureInfo) + .Any(c => c.Name == currentUserCulture.Name); + } + + private void ProcessCultureId(dynamic ruleContext) { + var httpContext = _httpContextAccessor.Current(); + var currentUserCulture = CultureInfo.GetCultureInfo(_cultureManager.GetCurrentCulture(httpContext)); + + ruleContext.Result = ((object[])ruleContext.Arguments) + .Cast() + .Select(CultureInfo.GetCultureInfo) + .Any(c => c.Name == currentUserCulture.Name); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs index c605ae932..0f5ad2245 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs @@ -1,15 +1,16 @@ using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography.X509Certificates; using Orchard.Localization; using Orchard.Scripting; using Orchard.Widgets.Services; namespace Orchard.Widgets.RuleEngine { public class RuleManager : IRuleManager { - private readonly IEnumerable _ruleProviders; + private readonly IRuleProvider _ruleProviders; private readonly IEnumerable _evaluators; - public RuleManager(IEnumerable ruleProviders, IEnumerable evaluators) { + public RuleManager(IRuleProvider ruleProviders, IEnumerable evaluators) { _ruleProviders = ruleProviders; _evaluators = evaluators; T = NullLocalizer.Instance; @@ -44,9 +45,7 @@ namespace Orchard.Widgets.RuleEngine { Result = context.Result }; - foreach(var ruleProvider in _ruleManager._ruleProviders) { - ruleProvider.Process(ruleContext); - } + _ruleManager._ruleProviders.Process(ruleContext); context.Result = ruleContext.Result; } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs index 260b46f0c..cd30e3f8c 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IRuleProvider.cs @@ -1,5 +1,7 @@ -namespace Orchard.Widgets.Services { - public interface IRuleProvider : IDependency { +using Orchard.Events; + +namespace Orchard.Widgets.Services { + public interface IRuleProvider : IEventHandler { void Process(RuleContext ruleContext); } } \ No newline at end of file