diff --git a/src/Orchard/ContentManagement/ContentField.cs b/src/Orchard/ContentManagement/ContentField.cs index 671ac54fd..169119fdf 100644 --- a/src/Orchard/ContentManagement/ContentField.cs +++ b/src/Orchard/ContentManagement/ContentField.cs @@ -1,8 +1,17 @@ -using Orchard.ContentManagement.MetaData.Models; +using System.Collections.Generic; +using Orchard.ContentManagement.MetaData.Models; +using Orchard.ContentManagement.Utilities; namespace Orchard.ContentManagement { - public class ContentField { + public class ContentField : IContent { + public virtual ContentItem ContentItem { get; set;} public string Name { get; set; } public ContentFieldDefinition Definition { get; set; } + public IDictionary Settings { get; private set; } + } + + public class ContentField : ContentField { + public readonly LazyField _record = new LazyField(); + public TRecord Record { get { return _record.Value; } set { _record.Value = value; } } } } diff --git a/src/Orchard/ContentManagement/ContentPart.cs b/src/Orchard/ContentManagement/ContentPart.cs index 8f485aa9a..4ec9ad23d 100644 --- a/src/Orchard/ContentManagement/ContentPart.cs +++ b/src/Orchard/ContentManagement/ContentPart.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.Utilities; @@ -7,6 +8,8 @@ namespace Orchard.ContentManagement { public ContentTypeDefinition TypeDefinition { get { return ContentItem.TypeDefinition; } } public ContentTypeDefinition.Part TypePartDefinition { get; set; } public ContentPartDefinition PartDefinition { get { return TypePartDefinition.PartDefinition; } } + + public IEnumerable ContentFields { get; set; } } public class ContentPart : ContentPart { diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs new file mode 100644 index 000000000..91d42a0be --- /dev/null +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -0,0 +1,51 @@ +using Orchard.ContentManagement.Handlers; + +namespace Orchard.ContentManagement.Drivers { + + public interface IContentFieldDriver : IEvents { + DriverResult BuildDisplayModel(BuildDisplayModelContext context); + DriverResult BuildEditorModel(BuildEditorModelContext context); + DriverResult UpdateEditorModel(UpdateEditorModelContext context); + } + + public abstract class ContentFieldDriver : IContentFieldDriver where TContent : ContentField, new() { + protected virtual string Prefix { get { return ""; } } + protected virtual string Zone { get { return "body"; } } + + DriverResult IContentFieldDriver.BuildDisplayModel(BuildDisplayModelContext context) { + var field = context.ContentItem.As(); + return field == null ? null : Display(field, context.DisplayType); + } + + DriverResult IContentFieldDriver.BuildEditorModel(BuildEditorModelContext context) { + var field = context.ContentItem.As(); + return field == null ? null : Editor(field); + } + + DriverResult IContentFieldDriver.UpdateEditorModel(UpdateEditorModelContext context) { + var field = context.ContentItem.As(); + return field == null ? null : Editor(field, context.Updater); + } + + protected virtual DriverResult Display(TContent field, string displayType) { return null; } + protected virtual DriverResult Editor(TContent field) { return null; } + protected virtual DriverResult Editor(TContent field, IUpdateModel updater) { return null; } + + + public ContentFieldTemplateResult ContentPartTemplate(object model) { + return new ContentFieldTemplateResult(model, null, Prefix).Location(Zone); + } + + public ContentFieldTemplateResult ContentPartTemplate(object model, string template) { + return new ContentFieldTemplateResult(model, template, Prefix).Location(Zone); + } + + public ContentFieldTemplateResult ContentPartTemplate(object model, string template, string prefix) { + return new ContentFieldTemplateResult(model, template, prefix).Location(Zone); + } + + public CombinedResult Combined(params DriverResult[] results) { + return new CombinedResult(results); + } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriverHandler.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriverHandler.cs new file mode 100644 index 000000000..89c1da793 --- /dev/null +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriverHandler.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using JetBrains.Annotations; +using Orchard.ContentManagement.Handlers; +using Orchard.Logging; + +namespace Orchard.ContentManagement.Drivers { + [UsedImplicitly] + public class ContentFieldDriverHandler : ContentHandlerBase { + private readonly IEnumerable _drivers; + + public ContentFieldDriverHandler(IEnumerable drivers) { + _drivers = drivers; + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + + public override void BuildDisplayModel(BuildDisplayModelContext context) { + _drivers.Invoke(driver => { + var result = driver.BuildDisplayModel(context); + if (result != null) + result.Apply(context); + }, Logger); + } + + public override void BuildEditorModel(BuildEditorModelContext context) { + _drivers.Invoke(driver => { + var result = driver.BuildEditorModel(context); + if (result != null) + result.Apply(context); + }, Logger); + } + + public override void UpdateEditorModel(UpdateEditorModelContext context) { + _drivers.Invoke(driver => { + var result = driver.UpdateEditorModel(context); + if (result != null) + result.Apply(context); + }, Logger); + } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldTemplateResult.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldTemplateResult.cs new file mode 100644 index 000000000..e94241b5e --- /dev/null +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldTemplateResult.cs @@ -0,0 +1,56 @@ +using System.Linq; +using Orchard.ContentManagement.Handlers; + +namespace Orchard.ContentManagement.Drivers { + public class ContentFieldTemplateResult : DriverResult { + public object Model { get; set; } + public string TemplateName { get; set; } + public string Prefix { get; set; } + public string Zone { get; set; } + public string Position { get; set; } + + public ContentFieldTemplateResult(object model, string templateName, string prefix) { + Model = model; + TemplateName = templateName; + Prefix = prefix; + } + + public override void Apply(BuildDisplayModelContext context) { + context.ViewModel.Zones.AddDisplayPart( + Zone + ":" + Position, Model, TemplateName, Prefix); + } + + public override void Apply(BuildEditorModelContext context) { + context.ViewModel.Zones.AddEditorPart( + Zone + ":" + Position, Model, TemplateName, Prefix); + } + + public ContentFieldTemplateResult Location(string zone) { + Zone = zone; + return this; + } + + public ContentFieldTemplateResult Location(string zone, string position) { + Zone = zone; + Position = position; + return this; + } + + public ContentFieldTemplateResult LongestMatch(string displayType, params string[] knownDisplayTypes) { + + if (string.IsNullOrEmpty(displayType)) + return this; + + var longest = knownDisplayTypes.Aggregate("", (best, x) => { + if (displayType.StartsWith(x) && x.Length > best.Length) return x; + return best; + }); + + if (string.IsNullOrEmpty(longest)) + return this; + + TemplateName += "." + longest; + return this; + } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/ContentPartDriverHandler.cs b/src/Orchard/ContentManagement/Drivers/ContentPartDriverHandler.cs index eb6cc6130..119ac4b48 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentPartDriverHandler.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentPartDriverHandler.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using JetBrains.Annotations; using Orchard.ContentManagement.Handlers; using Orchard.Logging; diff --git a/src/Orchard/ContentManagement/Handlers/ContentHandler.cs b/src/Orchard/ContentManagement/Handlers/ContentHandler.cs index 61264e60f..630c41f0d 100644 --- a/src/Orchard/ContentManagement/Handlers/ContentHandler.cs +++ b/src/Orchard/ContentManagement/Handlers/ContentHandler.cs @@ -25,6 +25,14 @@ namespace Orchard.ContentManagement.Handlers { Filters.Add(new InlineStorageFilter { OnCreated = handler }); } + protected void OnSaving(Action handler) where TPart : class, IContent { + Filters.Add(new InlineStorageFilter { OnSaving = handler }); + } + + protected void OnSaved(Action handler) where TPart : class, IContent { + Filters.Add(new InlineStorageFilter { OnSaved = handler }); + } + protected void OnLoading(Action handler) where TPart : class, IContent { Filters.Add(new InlineStorageFilter { OnLoading = handler }); } @@ -84,6 +92,8 @@ namespace Orchard.ContentManagement.Handlers { public Action OnActivated { get; set; } public Action OnCreating { get; set; } public Action OnCreated { get; set; } + public Action OnSaving { get; set; } + public Action OnSaved { get; set; } public Action OnLoading { get; set; } public Action OnLoaded { get; set; } public Action OnVersioning { get; set; } @@ -103,6 +113,12 @@ namespace Orchard.ContentManagement.Handlers { protected override void Created(CreateContentContext context, TPart instance) { if (OnCreated != null) OnCreated(context, instance); } + protected override void Saving(SaveContentContext context, TPart instance) { + if (OnSaving != null) OnSaving(context, instance); + } + protected override void Saved(SaveContentContext context, TPart instance) { + if (OnSaved != null) OnSaved(context, instance); + } protected override void Loading(LoadContentContext context, TPart instance) { if (OnLoading != null) OnLoading(context, instance); } @@ -185,6 +201,18 @@ namespace Orchard.ContentManagement.Handlers { Created(context); } + void IContentHandler.Saving(SaveContentContext context) { + foreach (var filter in Filters.OfType()) + filter.Saving(context); + Saving(context); + } + + void IContentHandler.Saved(SaveContentContext context) { + foreach (var filter in Filters.OfType()) + filter.Saved(context); + Saved(context); + } + void IContentHandler.Loading(LoadContentContext context) { foreach (var filter in Filters.OfType()) filter.Loading(context); @@ -272,6 +300,9 @@ namespace Orchard.ContentManagement.Handlers { protected virtual void Creating(CreateContentContext context) { } protected virtual void Created(CreateContentContext context) { } + protected virtual void Saving(SaveContentContext context) { } + protected virtual void Saved(SaveContentContext context) { } + protected virtual void Loading(LoadContentContext context) { } protected virtual void Loaded(LoadContentContext context) { } diff --git a/src/Orchard/ContentManagement/Handlers/ContentHandlerBase.cs b/src/Orchard/ContentManagement/Handlers/ContentHandlerBase.cs index f8026393a..a75ef9ed3 100644 --- a/src/Orchard/ContentManagement/Handlers/ContentHandlerBase.cs +++ b/src/Orchard/ContentManagement/Handlers/ContentHandlerBase.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; namespace Orchard.ContentManagement.Handlers { @@ -20,6 +19,12 @@ namespace Orchard.ContentManagement.Handlers { public virtual void Created(CreateContentContext context) { } + public virtual void Saving(SaveContentContext context) { + } + + public virtual void Saved(SaveContentContext context) { + } + public virtual void Loading(LoadContentContext context) { } diff --git a/src/Orchard/ContentManagement/Handlers/IContentHandler.cs b/src/Orchard/ContentManagement/Handlers/IContentHandler.cs index 7dc37cfa7..03cc514b8 100644 --- a/src/Orchard/ContentManagement/Handlers/IContentHandler.cs +++ b/src/Orchard/ContentManagement/Handlers/IContentHandler.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using Orchard.Events; +using System.Collections.Generic; namespace Orchard.ContentManagement.Handlers { public interface IContentHandler : IEvents { @@ -10,6 +8,8 @@ namespace Orchard.ContentManagement.Handlers { void Activated(ActivatedContentContext context); void Creating(CreateContentContext context); void Created(CreateContentContext context); + void Saving(SaveContentContext context); + void Saved(SaveContentContext context); void Loading(LoadContentContext context); void Loaded(LoadContentContext context); void Versioning(VersionContentContext context); diff --git a/src/Orchard/ContentManagement/Handlers/IContentStorageFilter.cs b/src/Orchard/ContentManagement/Handlers/IContentStorageFilter.cs index a3bbe7b40..b4ddfbdef 100644 --- a/src/Orchard/ContentManagement/Handlers/IContentStorageFilter.cs +++ b/src/Orchard/ContentManagement/Handlers/IContentStorageFilter.cs @@ -3,6 +3,8 @@ namespace Orchard.ContentManagement.Handlers { void Activated(ActivatedContentContext context); void Creating(CreateContentContext context); void Created(CreateContentContext context); + void Saving(SaveContentContext context); + void Saved(SaveContentContext context); void Loading(LoadContentContext context); void Loaded(LoadContentContext context); void Versioning(VersionContentContext context); diff --git a/src/Orchard/ContentManagement/Handlers/SaveContentContext.cs b/src/Orchard/ContentManagement/Handlers/SaveContentContext.cs new file mode 100644 index 000000000..0cbe96598 --- /dev/null +++ b/src/Orchard/ContentManagement/Handlers/SaveContentContext.cs @@ -0,0 +1,12 @@ +using Orchard.ContentManagement.Records; + +namespace Orchard.ContentManagement.Handlers { + public class SaveContentContext : ContentContextBase { + public SaveContentContext(ContentItem contentItem) + : base(contentItem) { + ContentItemVersionRecord = contentItem.VersionRecord; + } + + public ContentItemVersionRecord ContentItemVersionRecord { get; set; } + } +} diff --git a/src/Orchard/ContentManagement/Handlers/StorageFilterBase.cs b/src/Orchard/ContentManagement/Handlers/StorageFilterBase.cs index d63e0e4a7..ae0884097 100644 --- a/src/Orchard/ContentManagement/Handlers/StorageFilterBase.cs +++ b/src/Orchard/ContentManagement/Handlers/StorageFilterBase.cs @@ -4,6 +4,8 @@ namespace Orchard.ContentManagement.Handlers { protected virtual void Activated(ActivatedContentContext context, TPart instance) { } protected virtual void Creating(CreateContentContext context, TPart instance) { } protected virtual void Created(CreateContentContext context, TPart instance) { } + protected virtual void Saving(SaveContentContext context, TPart instance) { } + protected virtual void Saved(SaveContentContext context, TPart instance) { } protected virtual void Loading(LoadContentContext context, TPart instance) { } protected virtual void Loaded(LoadContentContext context, TPart instance) { } protected virtual void Versioning(VersionContentContext context, TPart existing, TPart building) { } @@ -31,6 +33,16 @@ namespace Orchard.ContentManagement.Handlers { Created(context, context.ContentItem.As()); } + void IContentStorageFilter.Saving(SaveContentContext context) { + if (context.ContentItem.Is()) + Saving(context, context.ContentItem.As()); + } + + void IContentStorageFilter.Saved(SaveContentContext context) { + if (context.ContentItem.Is()) + Saved(context, context.ContentItem.As()); + } + void IContentStorageFilter.Loading(LoadContentContext context) { if (context.ContentItem.Is()) Loading(context, context.ContentItem.As()); diff --git a/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs b/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs index dd8bd4e9c..c49981ce2 100644 --- a/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs +++ b/src/Orchard/ContentManagement/MetaData/Models/ContentPartDefinition.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Orchard.Utility.Extensions; diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 4245c8db9..81057cf39 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -170,6 +170,9 @@ Code + + + Code @@ -255,6 +258,7 @@ Code + Code