From cda6ae3d06213e51d5c99412f45eca652da814d4 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Tue, 20 Jul 2010 19:25:55 -0700 Subject: [PATCH] Create Display/Editor location settings for Parts and Fields --HG-- branch : dev --- .../Core/Common/Settings/LocationSettings.cs | 6 ++ .../Settings/LocationSettingsEditorEvents.cs | 61 +++++++++++++++++++ .../DefinitionTemplates/DisplayLocation.ascx | 12 ++++ .../DefinitionTemplates/EditorLocation.ascx | 12 ++++ src/Orchard.Web/Core/Orchard.Core.csproj | 4 ++ .../Builders/ContentPartDefinitionBuilder.cs | 32 ++++++++++ .../IContentDefinitionEditorEvents.cs | 8 ++- .../MetaData/Models/SettingsDictionary.cs | 14 ++--- 8 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 src/Orchard.Web/Core/Common/Settings/LocationSettings.cs create mode 100644 src/Orchard.Web/Core/Common/Settings/LocationSettingsEditorEvents.cs create mode 100644 src/Orchard.Web/Core/Common/Views/DefinitionTemplates/DisplayLocation.ascx create mode 100644 src/Orchard.Web/Core/Common/Views/DefinitionTemplates/EditorLocation.ascx diff --git a/src/Orchard.Web/Core/Common/Settings/LocationSettings.cs b/src/Orchard.Web/Core/Common/Settings/LocationSettings.cs new file mode 100644 index 000000000..7e595c13a --- /dev/null +++ b/src/Orchard.Web/Core/Common/Settings/LocationSettings.cs @@ -0,0 +1,6 @@ +namespace Orchard.Core.Common.Settings { + public class LocationSettings { + public string Zone { get; set; } + public string Position { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Settings/LocationSettingsEditorEvents.cs b/src/Orchard.Web/Core/Common/Settings/LocationSettingsEditorEvents.cs new file mode 100644 index 000000000..dda784b98 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Settings/LocationSettingsEditorEvents.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; +using Orchard.ContentManagement.MetaData.Builders; +using Orchard.ContentManagement.MetaData.Models; +using Orchard.ContentManagement.ViewModels; + +namespace Orchard.Core.Common.Settings { + public class LocationSettingsEditorEvents : ContentDefinitionEditorEventsBase { + + public override IEnumerable TypePartEditor(ContentTypeDefinition.Part definition) { + yield return TypePartEditorForLocation(definition, "DisplayLocation"); + yield return TypePartEditorForLocation(definition, "EditorLocation"); + } + + private TemplateViewModel TypePartEditorForLocation(ContentTypeDefinition.Part definition, string locationSettings) { + // Look for the setting in the most specific settings first (part definition in type) + // then in the global part definition. + var settings = + definition.Settings.TryGetModel(locationSettings) ?? + definition.PartDefinition.Settings.GetModel(locationSettings); + + return DefinitionTemplate(settings, locationSettings, locationSettings); + } + + public override IEnumerable TypePartEditorUpdate(ContentTypeDefinitionBuilder.PartConfigurer builder, IUpdateModel updateModel) { + yield return TypePartEditorUpdateForLocation(builder, updateModel, "DisplayLocation"); + yield return TypePartEditorUpdateForLocation(builder, updateModel, "EditorLocation"); + } + + private TemplateViewModel TypePartEditorUpdateForLocation(ContentTypeDefinitionBuilder.PartConfigurer builder, IUpdateModel updateModel, string locationSettings) { + var locationsettings = new LocationSettings(); + updateModel.TryUpdateModel(locationsettings, locationSettings, null, null); + builder.WithLocation("EditorLocation", locationsettings.Zone, locationsettings.Position); + return DefinitionTemplate(locationsettings, locationSettings, locationSettings); + } + + public override IEnumerable PartFieldEditor(ContentPartDefinition.Field definition) { + yield return PartFieldEditorForLocation(definition, "DisplayLocation"); + yield return PartFieldEditorForLocation(definition, "EditorLocation"); + } + + private TemplateViewModel PartFieldEditorForLocation(ContentPartDefinition.Field definition, string locationSettings) { + var settings = definition.Settings.GetModel(locationSettings); + return DefinitionTemplate(settings, locationSettings, locationSettings); + } + + + public override IEnumerable PartFieldEditorUpdate(ContentPartDefinitionBuilder.FieldConfigurer builder, IUpdateModel updateModel) { + yield return PartFieldEditorUpdateForLocation(builder, updateModel, "DisplayLocation"); + yield return PartFieldEditorUpdateForLocation(builder, updateModel, "EditorLocation"); + } + + private TemplateViewModel PartFieldEditorUpdateForLocation(ContentPartDefinitionBuilder.FieldConfigurer builder, IUpdateModel updateModel, string locationSettings) { + var model = new LocationSettings(); + updateModel.TryUpdateModel(model, locationSettings, null, null); + builder.WithLocation(locationSettings, model.Zone, model.Position); + return DefinitionTemplate(model); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/DisplayLocation.ascx b/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/DisplayLocation.ascx new file mode 100644 index 000000000..1a971f152 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/DisplayLocation.ascx @@ -0,0 +1,12 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +
+ <%:T("Display location") %> + + + <%:Html.EditorFor(m=>m.Zone) %> + <%:Html.ValidationMessageFor(m => m.Zone)%> + + + <%:Html.EditorFor(m=>m.Position) %> + <%:Html.ValidationMessageFor(m => m.Position)%> +
diff --git a/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/EditorLocation.ascx b/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/EditorLocation.ascx new file mode 100644 index 000000000..f3cc70f0c --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/EditorLocation.ascx @@ -0,0 +1,12 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +
+ <%:T("Editor Location") %> + + + <%:Html.EditorFor(m=>m.Zone) %> + <%:Html.ValidationMessageFor(m => m.Zone)%> + + + <%:Html.EditorFor(m=>m.Position) %> + <%:Html.ValidationMessageFor(m => m.Position)%> +
diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 5aa40ce5a..1beb1e71a 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -70,6 +70,8 @@ + + @@ -224,6 +226,8 @@ + + diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs index 98f8e71cf..50c00266f 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs @@ -111,6 +111,38 @@ namespace Orchard.ContentManagement.MetaData.Builders { return this; } } + } + public static class ContentPartDefinitionBuilderExtensions { + + public static ContentPartDefinitionBuilder WithLocation(this ContentPartDefinitionBuilder obj, string location, string zone, string position) { + if (string.IsNullOrEmpty(zone)) + zone = null; + if (string.IsNullOrEmpty(position)) + position = null; + return obj + .WithSetting(string.Format("{0}.Zone", location), zone) + .WithSetting(string.Format("{0}.Position", location), position); + } + + public static ContentTypeDefinitionBuilder.PartConfigurer WithLocation(this ContentTypeDefinitionBuilder.PartConfigurer obj, string location, string zone, string position) { + if (string.IsNullOrEmpty(zone)) + zone = null; + if (string.IsNullOrEmpty(position)) + position = null; + return obj + .WithSetting(string.Format("{0}.Zone", location), zone) + .WithSetting(string.Format("{0}.Position", location), position); + } + + public static ContentPartDefinitionBuilder.FieldConfigurer WithLocation(this ContentPartDefinitionBuilder.FieldConfigurer obj, string location, string zone, string position) { + if (string.IsNullOrEmpty(zone)) + zone = null; + if (string.IsNullOrEmpty(position)) + position = null; + return obj + .WithSetting(string.Format("{0}.Zone", location), zone) + .WithSetting(string.Format("{0}.Position", location), position); + } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/MetaData/IContentDefinitionEditorEvents.cs b/src/Orchard/ContentManagement/MetaData/IContentDefinitionEditorEvents.cs index 6fea8af3b..b43ca3138 100644 --- a/src/Orchard/ContentManagement/MetaData/IContentDefinitionEditorEvents.cs +++ b/src/Orchard/ContentManagement/MetaData/IContentDefinitionEditorEvents.cs @@ -52,8 +52,12 @@ namespace Orchard.ContentManagement.MetaData { } protected static TemplateViewModel DefinitionTemplate(TModel model) { - return new TemplateViewModel(model, typeof(TModel).Name) { - TemplateName = "DefinitionTemplates/" + typeof(TModel).Name + return DefinitionTemplate(model, typeof(TModel).Name, typeof(TModel).Name); + } + + protected static TemplateViewModel DefinitionTemplate(TModel model, string templateName, string prefix) { + return new TemplateViewModel(model, prefix) { + TemplateName = "DefinitionTemplates/" + templateName }; } } diff --git a/src/Orchard/ContentManagement/MetaData/Models/SettingsDictionary.cs b/src/Orchard/ContentManagement/MetaData/Models/SettingsDictionary.cs index 1a631744a..050af79f0 100644 --- a/src/Orchard/ContentManagement/MetaData/Models/SettingsDictionary.cs +++ b/src/Orchard/ContentManagement/MetaData/Models/SettingsDictionary.cs @@ -7,7 +7,7 @@ namespace Orchard.ContentManagement.MetaData.Models { public SettingsDictionary() { } public SettingsDictionary(IDictionary dictionary) : base(dictionary) { } - private T TryGetModel(string key) where T : class { + public T TryGetModel(string key) where T : class { var binder = new DefaultModelBinder(); var controllerContext = new ControllerContext(); var context = new ModelBindingContext { @@ -19,6 +19,10 @@ namespace Orchard.ContentManagement.MetaData.Models { } + public T TryGetModel() where T : class { + return TryGetModel(typeof (T).Name); + } + public T GetModel() where T : class, new() { return GetModel(typeof(T).Name); } @@ -26,13 +30,5 @@ namespace Orchard.ContentManagement.MetaData.Models { public T GetModel(string key) where T : class, new() { return TryGetModel(key) ?? new T(); } - - public bool ContainsModel() where T : class { - return TryGetModel(typeof(T).Name) != null; - } - - public bool ContainsModel(string key) where T : class { - return TryGetModel(key) != null; - } } } \ No newline at end of file