diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj
index 9d66a5dde..a928654da 100644
--- a/src/Orchard.Web/Core/Orchard.Core.csproj
+++ b/src/Orchard.Web/Core/Orchard.Core.csproj
@@ -214,6 +214,7 @@
+
diff --git a/src/Orchard.Web/Core/Settings/Drivers/SiteSettings2PartDriver.cs b/src/Orchard.Web/Core/Settings/Drivers/SiteSettings2PartDriver.cs
new file mode 100644
index 000000000..93456225d
--- /dev/null
+++ b/src/Orchard.Web/Core/Settings/Drivers/SiteSettings2PartDriver.cs
@@ -0,0 +1,27 @@
+using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
+using Orchard.Core.Settings.Models;
+using Orchard.Localization;
+using Orchard.Logging;
+using Orchard.Settings;
+
+namespace Orchard.Core.Settings.Drivers
+{
+ public class SiteSettings2PartDriver : ContentPartDriver {
+ public SiteSettings2PartDriver() {
+ T = NullLocalizer.Instance;
+ Logger = NullLogger.Instance;
+ }
+
+ public Localizer T { get; set; }
+ public ILogger Logger { get; set; }
+
+ protected override void Exporting(SiteSettings2Part part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(SiteSettings2Part part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Core/Settings/Drivers/SiteSettingsPartDriver.cs b/src/Orchard.Web/Core/Settings/Drivers/SiteSettingsPartDriver.cs
index 81cd50525..064c77e90 100644
--- a/src/Orchard.Web/Core/Settings/Drivers/SiteSettingsPartDriver.cs
+++ b/src/Orchard.Web/Core/Settings/Drivers/SiteSettingsPartDriver.cs
@@ -3,6 +3,7 @@ using System.Net;
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
using Orchard.Core.Settings.Models;
using Orchard.Core.Settings.ViewModels;
using Orchard.Localization.Services;
@@ -101,5 +102,13 @@ namespace Orchard.Core.Settings.Drivers {
return ContentShape("Parts_Settings_SiteSettingsPart",
() => shapeHelper.EditorTemplate(TemplateName: "Parts.Settings.SiteSettingsPart", Model: model, Prefix: Prefix));
}
+
+ protected override void Exporting(SiteSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(SiteSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentSettingsPartDriver.cs
index 4e06b09d5..c74593b49 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentSettingsPartDriver.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentSettingsPartDriver.cs
@@ -2,7 +2,9 @@
using Orchard.Comments.Models;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
+using Orchard.Settings;
namespace Orchard.Comments.Drivers {
public class CommentSettingsPartDriver : ContentPartDriver {
@@ -28,5 +30,13 @@ namespace Orchard.Comments.Drivers {
})
.OnGroup("comments");
}
+
+ protected override void Exporting(CommentSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(CommentSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs
index c009122db..c0430dc1b 100644
--- a/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs
+++ b/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs
@@ -1,8 +1,10 @@
using System;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
using Orchard.Email.Models;
using Orchard.Localization;
+using Orchard.Settings;
namespace Orchard.Email.Drivers {
@@ -39,5 +41,13 @@ namespace Orchard.Email.Drivers {
})
.OnGroup("email");
}
+
+ protected override void Exporting(SmtpSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(SmtpSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Email/Orchard.Email.csproj b/src/Orchard.Web/Modules/Orchard.Email/Orchard.Email.csproj
index 09f71bdd8..680a6872e 100644
--- a/src/Orchard.Web/Modules/Orchard.Email/Orchard.Email.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Email/Orchard.Email.csproj
@@ -53,6 +53,8 @@
..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll
+
+
diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs
index 9d1672bd9..4709da212 100644
--- a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs
+++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs
@@ -139,31 +139,8 @@ namespace Orchard.ImportExport.Services {
}
private XElement ExportSiteSettings() {
- var settings = new XElement("Settings");
- var hasSetting = false;
-
- foreach (var sitePart in _orchardServices.WorkContext.CurrentSite.ContentItem.Parts) {
- var setting = new XElement(sitePart.PartDefinition.Name);
-
- foreach (var property in sitePart.GetType().GetProperties()) {
- var propertyType = property.PropertyType;
- // Supported types (we also know they are not indexed properties).
- if (propertyType == typeof(string) || propertyType == typeof(bool) || propertyType == typeof(int)) {
- // Exclude read-only properties.
- if (property.GetSetMethod() != null) {
- setting.SetAttributeValue(property.Name, property.GetValue(sitePart, null));
- hasSetting = true;
- }
- }
- }
-
- if (hasSetting) {
- settings.Add(setting);
- hasSetting = false;
- }
- }
-
- return settings;
+ var exportContentItem = ExportContentItem(_orchardServices.WorkContext.CurrentSite.ContentItem);
+ return new XElement("Settings", exportContentItem.Elements());
}
private XElement ExportData(IEnumerable contentTypes, IEnumerable contentItems, int? batchSize) {
diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/WebSearchSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/WebSearchSettingsPartDriver.cs
new file mode 100644
index 000000000..aa64bd654
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/WebSearchSettingsPartDriver.cs
@@ -0,0 +1,28 @@
+using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
+using Orchard.Localization;
+using Orchard.Logging;
+using Orchard.MediaLibrary.Models;
+using Orchard.Settings;
+
+namespace Orchard.MediaLibrary.Drivers
+{
+ public class WebSearchSettingsPartDriver : ContentPartDriver {
+ public WebSearchSettingsPartDriver()
+ {
+ T = NullLocalizer.Instance;
+ Logger = NullLogger.Instance;
+ }
+
+ public Localizer T { get; set; }
+ public ILogger Logger { get; set; }
+
+ protected override void Exporting(WebSearchSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(WebSearchSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj
index 83ace0c1d..efe7356a1 100644
--- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj
+++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj
@@ -98,6 +98,7 @@
+
diff --git a/src/Orchard.Web/Modules/Orchard.Messaging/Drivers/MessageSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Messaging/Drivers/MessageSettingsPartDriver.cs
index cbc319c69..1554256fd 100644
--- a/src/Orchard.Web/Modules/Orchard.Messaging/Drivers/MessageSettingsPartDriver.cs
+++ b/src/Orchard.Web/Modules/Orchard.Messaging/Drivers/MessageSettingsPartDriver.cs
@@ -1,10 +1,12 @@
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Messaging.Models;
using Orchard.Messaging.Services;
using Orchard.Messaging.ViewModels;
+using Orchard.Settings;
namespace Orchard.Messaging.Drivers {
[UsedImplicitly]
@@ -43,5 +45,13 @@ namespace Orchard.Messaging.Drivers {
return ContentShape("Parts_MessageSettings_Edit", () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
+
+ protected override void Exporting(MessageSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(MessageSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Drivers/CacheSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Drivers/CacheSettingsPartDriver.cs
new file mode 100644
index 000000000..9dd3b3378
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Drivers/CacheSettingsPartDriver.cs
@@ -0,0 +1,28 @@
+using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
+using Orchard.Localization;
+using Orchard.Logging;
+using Orchard.OutputCache.Models;
+using Orchard.Settings;
+
+namespace Orchard.OutputCache.Drivers
+{
+ public class CacheSettingsPartDriver : ContentPartDriver {
+ public CacheSettingsPartDriver()
+ {
+ T = NullLocalizer.Instance;
+ Logger = NullLogger.Instance;
+ }
+
+ public Localizer T { get; set; }
+ public ILogger Logger { get; set; }
+
+ protected override void Exporting(CacheSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(CacheSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj b/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj
index c9a23d76e..7b804868a 100644
--- a/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj
+++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Orchard.OutputCache.csproj
@@ -90,6 +90,7 @@
+
diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/SettingsRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/SettingsRecipeHandler.cs
index e0e0366b3..cbf8993df 100644
--- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/SettingsRecipeHandler.cs
+++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/SettingsRecipeHandler.cs
@@ -1,7 +1,9 @@
using System;
+using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;
using Orchard.ContentManagement;
+using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Recipes.Models;
@@ -11,15 +13,20 @@ using Orchard.Settings;
namespace Orchard.Recipes.RecipeHandlers {
public class SettingsRecipeHandler : IRecipeHandler {
private readonly ISiteService _siteService;
+ private readonly IContentManager _contentManager;
+ private readonly Lazy> _handlers;
- public SettingsRecipeHandler(ISiteService siteService) {
+ public SettingsRecipeHandler(ISiteService siteService, IContentManager contentManager, Lazy> handlers) {
_siteService = siteService;
+ _contentManager = contentManager;
+ _handlers = handlers;
Logger = NullLogger.Instance;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public ILogger Logger { get; set; }
+ private IEnumerable Handlers { get { return _handlers.Value; } }
/*
@@ -34,41 +41,19 @@ namespace Orchard.Recipes.RecipeHandlers {
}
var site = _siteService.GetSiteSettings();
- foreach (var element in recipeContext.RecipeStep.Step.Elements()) {
- var partName = XmlConvert.DecodeName(element.Name.LocalName);
- foreach (var contentPart in site.ContentItem.Parts) {
- if (!String.Equals(contentPart.PartDefinition.Name, partName, StringComparison.OrdinalIgnoreCase)) {
- continue;
- }
- foreach (var attribute in element.Attributes()) {
- SetSetting(attribute, contentPart);
- }
- }
+
+ var importContentSession = new ImportContentSession(_contentManager);
+
+ var context = new ImportContentContext(site.ContentItem, recipeContext.RecipeStep.Step, importContentSession);
+ foreach (var contentHandler in Handlers) {
+ contentHandler.Importing(context);
+ }
+
+ foreach (var contentHandler in Handlers) {
+ contentHandler.Imported(context);
}
recipeContext.Executed = true;
}
-
- private static void SetSetting(XAttribute attribute, ContentPart contentPart) {
- var attributeName = attribute.Name.LocalName;
- var attributeValue = attribute.Value;
- var property = contentPart.GetType().GetProperty(attributeName);
- if (property == null) {
- throw new InvalidOperationException(string.Format("Could set setting {0} for part {1} because it was not found.", attributeName, contentPart.PartDefinition.Name));
- }
- var propertyType = property.PropertyType;
- if (propertyType == typeof(string)) {
- property.SetValue(contentPart, attributeValue, null);
- }
- else if (propertyType == typeof(bool)) {
- property.SetValue(contentPart, Boolean.Parse(attributeValue), null);
- }
- else if (propertyType == typeof(int)) {
- property.SetValue(contentPart, Int32.Parse(attributeValue), null);
- }
- else {
- throw new InvalidOperationException(string.Format("Could set setting {0} for part {1} because its type is not supported. Settings should be integer,boolean or string.", attributeName, contentPart.PartDefinition.Name));
- }
- }
}
}
diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs
index 20e2512c7..2adf8eaa1 100644
--- a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs
+++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs
@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Xml.Linq;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
using Orchard.Indexing;
using Orchard.Localization;
using Orchard.Search.Models;
@@ -61,5 +63,20 @@ namespace Orchard.Search.Drivers {
return shapeHelper.EditorTemplate(TemplateName: "Parts/Search.SiteSettings", Model: model, Prefix: Prefix);
}).OnGroup("search");
}
+
+ protected override void Exporting(SearchSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ context.Element(part.PartDefinition.Name).Add(new XAttribute("SearchedFields", string.Join(",", part.SearchedFields)));
+ }
+
+ protected override void Importing(SearchSettingsPart part, ImportContentContext context) {
+ var xElement = context.Data.Element(part.PartDefinition.Name);
+ if (xElement == null) return;
+
+ DefaultSettingsPartImportExport.ImportSettingPart(part, xElement);
+
+ var searchedFields = xElement.Attribute("SearchedFields");
+ part.SearchedFields = searchedFields.Value.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
+ }
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj
index 0f31f0b6f..e313da440 100644
--- a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj
@@ -55,6 +55,8 @@
..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll
+
+
diff --git a/src/Orchard.Web/Modules/Orchard.Themes/Drivers/ThemeSiteSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Themes/Drivers/ThemeSiteSettingsPartDriver.cs
new file mode 100644
index 000000000..34c8f3918
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.Themes/Drivers/ThemeSiteSettingsPartDriver.cs
@@ -0,0 +1,28 @@
+using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
+using Orchard.Localization;
+using Orchard.Logging;
+using Orchard.Settings;
+using Orchard.Themes.Models;
+
+namespace Orchard.Themes.Drivers
+{
+ public class ThemeSiteSettingsPartDriver : ContentPartDriver {
+ public ThemeSiteSettingsPartDriver()
+ {
+ T = NullLocalizer.Instance;
+ Logger = NullLogger.Instance;
+ }
+
+ public Localizer T { get; set; }
+ public ILogger Logger { get; set; }
+
+ protected override void Exporting(ThemeSiteSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+
+ protected override void Importing(ThemeSiteSettingsPart part, ImportContentContext context) {
+ DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Themes/Orchard.Themes.csproj b/src/Orchard.Web/Modules/Orchard.Themes/Orchard.Themes.csproj
index 7db1f19c6..eab80c367 100644
--- a/src/Orchard.Web/Modules/Orchard.Themes/Orchard.Themes.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Themes/Orchard.Themes.csproj
@@ -20,6 +20,11 @@
+ false
+
+
+
+
true
@@ -48,10 +53,13 @@
False
..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll
+
+
+
diff --git a/src/Orchard.Web/Modules/Orchard.Users/Drivers/RegistrationSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Users/Drivers/RegistrationSettingsPartDriver.cs
new file mode 100644
index 000000000..23e5bc53c
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.Users/Drivers/RegistrationSettingsPartDriver.cs
@@ -0,0 +1,24 @@
+using Orchard.ContentManagement.Drivers;
+using Orchard.ContentManagement.Handlers;
+using Orchard.Localization;
+using Orchard.Logging;
+using Orchard.Settings;
+using Orchard.Users.Models;
+
+namespace Orchard.Users.Drivers
+{
+ public class RegistrationSettingsPartDriver : ContentPartDriver {
+ public RegistrationSettingsPartDriver()
+ {
+ T = NullLocalizer.Instance;
+ Logger = NullLogger.Instance;
+ }
+
+ public Localizer T { get; set; }
+ public ILogger Logger { get; set; }
+
+ protected override void Exporting(RegistrationSettingsPart part, ExportContentContext context) {
+ DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj
index 7878803b5..bda180931 100644
--- a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj
@@ -64,6 +64,7 @@
+
diff --git a/src/Orchard/ContentManagement/Drivers/DefaultSettingsPartImportExport.cs b/src/Orchard/ContentManagement/Drivers/DefaultSettingsPartImportExport.cs
new file mode 100644
index 000000000..f784ce2e5
--- /dev/null
+++ b/src/Orchard/ContentManagement/Drivers/DefaultSettingsPartImportExport.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.Xml.Linq;
+using Orchard.ContentManagement.Handlers;
+using Orchard.Recipes.Models;
+using Orchard.Settings;
+
+namespace Orchard.ContentManagement.Drivers
+{
+ public class DefaultSettingsPartImportExport
+ {
+ public static void ExportSettingsPart(ContentPart sitePart, ExportContentContext context) {
+ var xAttributes = new List