Adding Culture Rule Provider. this required a change to the IRuleProvider to be an IEventHandler rather than a direct IDependency

This commit is contained in:
Nicholas Mayne
2014-08-30 00:45:55 +01:00
parent c6ee35a08d
commit 79042774bd
4 changed files with 61 additions and 7 deletions

View File

@@ -75,6 +75,7 @@
<Compile Include="Controllers\CutlureSelectorController.cs" />
<Compile Include="Models\TransliterationSpecificationRecord.cs" />
<Compile Include="Providers\CultureSelectorSelector.cs" />
<Compile Include="RuleEngine\ContentDisplayedRuleProvider.cs" />
<Compile Include="Services\AdminDirectionalityFactory.cs" />
<Compile Include="Services\CultureSelectorFactory.cs" />
<Compile Include="Services\LocalizationCultureFilter.cs" />

View File

@@ -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<string>()
.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<int>()
.Select(CultureInfo.GetCultureInfo)
.Any(c => c.Name == currentUserCulture.Name);
}
}
}

View File

@@ -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<IRuleProvider> _ruleProviders;
private readonly IRuleProvider _ruleProviders;
private readonly IEnumerable<IScriptExpressionEvaluator> _evaluators;
public RuleManager(IEnumerable<IRuleProvider> ruleProviders, IEnumerable<IScriptExpressionEvaluator> evaluators) {
public RuleManager(IRuleProvider ruleProviders, IEnumerable<IScriptExpressionEvaluator> 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;
}

View File

@@ -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);
}
}