From 9839ceca6934937c0c7cd8493b2a1e1269fff9af Mon Sep 17 00:00:00 2001 From: Hundrer Date: Fri, 5 Jan 2018 04:27:51 +0800 Subject: [PATCH] Fix #6825 by reducing the changed files to those only related to the issue (#7916) --- .../Orchard.Projections.csproj | 2 + .../Providers/Builders/MemberBindingsStep.cs | 56 +++++++++++++++++++ .../Providers/Executors/MemberBindingsStep.cs | 46 +++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 src/Orchard.Web/Modules/Orchard.Projections/Providers/Builders/MemberBindingsStep.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Projections/Providers/Executors/MemberBindingsStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj b/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj index 0e0403546..4a11e6807 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj +++ b/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj @@ -170,6 +170,8 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Providers/Builders/MemberBindingsStep.cs b/src/Orchard.Web/Modules/Orchard.Projections/Providers/Builders/MemberBindingsStep.cs new file mode 100644 index 000000000..c49506229 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Projections/Providers/Builders/MemberBindingsStep.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Orchard.Data; +using Orchard.Localization; +using Orchard.Projections.Services; +using Orchard.Recipes.Services; + +namespace Orchard.Projections.Providers.Builders { + public class MemberBindingsStep : RecipeBuilderStep { + private readonly IMemberBindingProvider _memberBindingProvider; + public MemberBindingsStep(IMemberBindingProvider memberBindingProvider) { + _memberBindingProvider = memberBindingProvider; + } + + public override string Name { + get { return "MemberBindings"; } + } + + public override LocalizedString DisplayName { + get { return T("Member Bindings"); } + } + + public override LocalizedString Description { + get { return T("Exports query member bindings."); } + } + + public override int Priority { + get { return 25; } + } + + public override int Position { + get { return 25; } + } + + public override void Build(BuildContext context) { + var memberBindings = new XElement("MemberBindings"); + context.RecipeDocument.Element("Orchard").Add(memberBindings); + + var bindingBuilder = new BindingBuilder(); + _memberBindingProvider.GetMemberBindings(bindingBuilder); + + foreach (var bindingItem in bindingBuilder.Build()) { + var declaringType = bindingItem.Property.DeclaringType; + + var memberBinding = new XElement("MemberBinding", + new XAttribute("Type", declaringType.FullName), + new XAttribute("Member", bindingItem.Property.Name), + new XAttribute("Description", bindingItem.Description), + new XAttribute("DisplayName", bindingItem.DisplayName)); + + memberBindings.Add(memberBinding); + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Providers/Executors/MemberBindingsStep.cs b/src/Orchard.Web/Modules/Orchard.Projections/Providers/Executors/MemberBindingsStep.cs new file mode 100644 index 000000000..d54eabef1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Projections/Providers/Executors/MemberBindingsStep.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using Orchard.Data; +using Orchard.Logging; +using Orchard.Projections.Models; +using Orchard.Recipes.Models; +using Orchard.Recipes.Services; + +namespace Orchard.Projections.Providers.Executors { + public class MemberBindingsStep : RecipeExecutionStep { + private readonly IRepository _repository; + + public MemberBindingsStep(IRepository repository, RecipeExecutionLogger logger) : base(logger) { + _repository = repository; + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + + public override string Name { + get { return "MemberBindings"; } + } + + public override void Execute(RecipeExecutionContext context) { + foreach (var memberBindingElement in context.RecipeStep.Step.Elements()) { + Logger.Information("Importing member bindings."); + try { + var member = memberBindingElement.Attribute("Member").Value; + var type = memberBindingElement.Attribute("Type").Value; + if (_repository.Get(b => b.Member == member && b.Type == type) != null) + continue; + _repository.Create(new MemberBindingRecord { + Member = member, + Type = type, + DisplayName = memberBindingElement.Attribute("DisplayName").Value, + Description = memberBindingElement.Attribute("Description").Value, + }); + } + catch (Exception ex) { + Logger.Error(ex, "Error while importing member bindings."); + throw; + } + } + } + } +} \ No newline at end of file