diff --git a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs index 793405598..2a4696860 100644 --- a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs @@ -50,7 +50,7 @@ namespace Orchard.Core.Common.Drivers { context.Element(field.FieldDefinition.Name + "." + field.Name).SetAttributeValue("Text", field.Value); } - public override void Describe(DescribeMembersContext context) { + protected override void Describe(DescribeMembersContext context) { context .Member(null, typeof(string), T("Value"), T("The text associated with the field.")); } diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs index 713b0f7e7..a1a9183f0 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -43,6 +43,10 @@ namespace Orchard.ContentManagement.Drivers { Process(context.ContentItem, (part, field) => Exported(part, field, context)); } + void IContentFieldDriver.Describe(DescribeMembersContext context) { + Describe(context); + } + void Process(ContentItem item, Action effort) { var occurences = item.Parts.SelectMany(part => part.Fields.OfType().Select(field => new { part, field })); foreach (var occurence in occurences) { @@ -81,8 +85,8 @@ namespace Orchard.ContentManagement.Drivers { protected virtual void Imported(ContentPart part, TField field, ImportContentContext context) { } protected virtual void Exporting(ContentPart part, TField field, ExportContentContext context) { } protected virtual void Exported(ContentPart part, TField field, ExportContentContext context) { } - - public virtual void Describe(DescribeMembersContext context) { } + + protected virtual void Describe(DescribeMembersContext context) { } public ContentShapeResult ContentShape(string shapeType, Func factory) { return ContentShapeImplementation(shapeType, null, ctx => factory()); diff --git a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs index 07c7669a2..7b66700cc 100644 --- a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs +++ b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentFieldDriverCoordinator.cs @@ -10,12 +10,15 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { public class ContentFieldDriverCoordinator : ContentHandlerBase { private readonly IEnumerable _drivers; private readonly IFieldStorageProviderSelector _fieldStorageProviderSelector; + private readonly IEnumerable _fieldStorageEvents; public ContentFieldDriverCoordinator( IEnumerable drivers, - IFieldStorageProviderSelector fieldStorageProviderSelector) { + IFieldStorageProviderSelector fieldStorageProviderSelector, + IEnumerable fieldStorageEvents) { _drivers = drivers; _fieldStorageProviderSelector = fieldStorageProviderSelector; + _fieldStorageEvents = fieldStorageEvents; Logger = NullLogger.Instance; } @@ -32,6 +35,9 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { var storage = _fieldStorageProviderSelector .GetProvider(partFieldDefinition) .BindStorage(contentPart, partFieldDefinition); + + storage = new FieldStorageEventStorage(storage, partFieldDefinition, contentPart, _fieldStorageEvents); + var field = fieldInfo.Factory(partFieldDefinition, storage); contentPart.Weld(field); } diff --git a/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs index b213896e5..b7b5c503f 100644 --- a/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs +++ b/src/Orchard/ContentManagement/FieldStorage/IFieldStorageEvents.cs @@ -1,10 +1,10 @@ using System; +using System.Collections.Generic; +using Orchard.ContentManagement.MetaData.Models; using Orchard.Events; -namespace Orchard.ContentManagement.FieldStorage -{ - public class FieldStorageEventContext - { +namespace Orchard.ContentManagement.FieldStorage { + public class FieldStorageEventContext { public IContent Content { get; set; } public string PartName { get; set; } public string FieldName { get; set; } @@ -13,8 +13,46 @@ namespace Orchard.ContentManagement.FieldStorage public Type ValueType { get; set; } } - public interface IFieldStorageEvents : IEventHandler - { + public interface IFieldStorageEvents : IEventHandler { void SetCalled(FieldStorageEventContext context); } + + public class FieldStorageEventStorage : IFieldStorage { + private readonly IFieldStorage _concreteStorage; + private readonly ContentPartFieldDefinition _contentPartFieldDefinition; + private readonly ContentPart _contentPart; + private readonly IEnumerable _events; + + public FieldStorageEventStorage( + IFieldStorage concreteStorage, + ContentPartFieldDefinition contentPartFieldDefinition, + ContentPart contentPart, + IEnumerable events) { + _concreteStorage = concreteStorage; + _contentPartFieldDefinition = contentPartFieldDefinition; + _contentPart = contentPart; + _events = events; + } + + public T Get(string name) { + return _concreteStorage.Get(name); + } + + public void Set(string name, T value) { + _concreteStorage.Set(name, value); + + var context = new FieldStorageEventContext { + FieldName = _contentPartFieldDefinition.Name, + PartName = _contentPart.PartDefinition.Name, + Value = value, + ValueName = name, + ValueType = typeof(T), + Content = _contentPart + }; + + foreach (var fieldEvent in _events) { + fieldEvent.SetCalled(context); + } + } + } } diff --git a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs index 4ef1519ca..cb525ba95 100644 --- a/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs +++ b/src/Orchard/ContentManagement/FieldStorage/InfosetStorage/InfosetStorageProvider.cs @@ -1,16 +1,9 @@ -using System.Collections.Generic; -using System.Xml; +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; } } @@ -22,23 +15,7 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage { return new SimpleFieldStorage( (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); - } - } - ); + (name, valueType, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value)); } private static string Get(XElement element, string partName, string fieldName, string valueName) {