From f80301d54bbef1217090498736b19fdaca4f6724 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Wed, 21 Sep 2011 12:15:03 -0700 Subject: [PATCH] Addind events to field storage --HG-- branch : 1.x --- .../FieldStorage/IFieldStorageEvents.cs | 20 ++++++++++++ .../InfosetStorage/InfosetStorageProvider.cs | 31 ++++++++++++++++--- .../FieldStorage/SimpleFieldStorage.cs | 10 +++--- src/Orchard/Orchard.Framework.csproj | 1 + 4 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs diff --git a/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs new file mode 100644 index 000000000..b213896e5 --- /dev/null +++ b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs @@ -0,0 +1,20 @@ +using System; +using Orchard.Events; + +namespace Orchard.ContentManagement.FieldStorage +{ + public class FieldStorageEventContext + { + public IContent Content { get; set; } + public string PartName { get; set; } + public string FieldName { get; set; } + public string ValueName { get; set; } + public object Value { get; set; } + public Type ValueType { get; set; } + } + + public interface IFieldStorageEvents : IEventHandler + { + void SetCalled(FieldStorageEventContext context); + } +} diff --git a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs index 016de4f47..4ef1519ca 100644 --- a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs @@ -1,9 +1,16 @@ -using System.Xml; +using System.Collections.Generic; +using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Models; namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { public class InfosetStorageProvider : IFieldStorageProvider { + private readonly IEnumerable _events; + + public InfosetStorageProvider(IEnumerable events) { + _events = events; + } + public string ProviderName { get { return FieldStorageProviderSelector.DefaultProviderName; } } @@ -14,8 +21,24 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { var infosetPart = contentPart.As(); return new SimpleFieldStorage( - name => Get(infosetPart.Infoset.Element, partName, fieldName, name), - (name, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value)); + (name, valueType) => Get(infosetPart.Infoset.Element, partName, fieldName, name), + (name, valueType, value) => { + Set(infosetPart.Infoset.Element, partName, fieldName, name, value); + + var context = new FieldStorageEventContext { + FieldName = partFieldDefinition.Name, + PartName = contentPart.PartDefinition.Name, + Value = value, + ValueName = name, + ValueType = valueType, + Content = infosetPart + }; + + foreach(var fieldEvent in _events) { + fieldEvent.SetCalled(context); + } + } + ); } private static string Get(XElement element, string partName, string fieldName, string valueName) { @@ -37,7 +60,7 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { return valueAttribute.Value; } - private static void Set(XElement element, string partName, string fieldName, string valueName, string value) { + private void Set(XElement element, string partName, string fieldName, string valueName, string value) { var partElement = element.Element(partName); if (partElement == null) { partElement = new XElement(partName); diff --git a/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs b/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs index 2897bf430..f9898ef38 100644 --- a/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs +++ b/src/Orchard/ContentManagement/FieldStorage/SimpleFieldStorage.cs @@ -3,23 +3,23 @@ using System.Globalization; namespace Orchard.ContentManagement.FieldStorage { public class SimpleFieldStorage : IFieldStorage { - public SimpleFieldStorage(Func getter, Action setter) { + public SimpleFieldStorage(Func getter, Action setter) { Getter = getter; Setter = setter; } - public Func Getter { get; set; } - public Action Setter { get; set; } + public Func Getter { get; set; } + public Action Setter { get; set; } public T Get(string name) { - var value = Getter(name); + var value = Getter(name, typeof(T)); return string.IsNullOrEmpty(value) ? default(T) : (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture); } public void Set(string name, T value) { - Setter(name, Convert.ToString(value, CultureInfo.InvariantCulture)); + Setter(name, typeof(T), Convert.ToString(value, CultureInfo.InvariantCulture)); } } } \ No newline at end of file diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 180d1fa7f..2f8e1ae97 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -171,6 +171,7 @@ +