diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ImportContentSessionWrapper.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ImportContentSessionWrapper.cs
new file mode 100644
index 000000000..2d36dceb3
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ImportContentSessionWrapper.cs
@@ -0,0 +1,19 @@
+using Orchard.ContentManagement;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace Orchard.Layouts.Framework.Drivers {
+ public class ImportContentSessionWrapper : IContentImportSession {
+ private readonly ImportContentSession _session;
+
+ public ImportContentSessionWrapper(ImportContentSession session) {
+ _session = session;
+ }
+
+ public ContentItem GetItemFromSession(string id) {
+ return _session.Get(id);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj
index 1db4de37a..c449c6908 100644
--- a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj
@@ -336,6 +336,7 @@
+
diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Builders/CustomElementsStep.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Builders/CustomElementsStep.cs
index 44f82582a..efcaa1490 100644
--- a/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Builders/CustomElementsStep.cs
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Builders/CustomElementsStep.cs
@@ -4,14 +4,19 @@ using Orchard.Data;
using Orchard.Layouts.Models;
using Orchard.Localization;
using Orchard.Recipes.Services;
+using Orchard.Layouts.Services;
+using Orchard.Layouts.Helpers;
+using Orchard.Layouts.Framework.Drivers;
namespace Orchard.Layouts.Recipes.Builders {
public class CustomElementsStep : RecipeBuilderStep {
private readonly IRepository _repository;
+ private readonly IElementManager _elementManager;
- public CustomElementsStep(IRepository repository) {
+ public CustomElementsStep(IRepository repository, IElementManager elementManager) {
_repository = repository;
+ _elementManager = elementManager;
}
public override string Name {
@@ -26,24 +31,41 @@ namespace Orchard.Layouts.Recipes.Builders {
get { return T("Exports custom defined elements."); }
}
- public override void Build(BuildContext context) {
- var elements = _repository.Table.OrderBy(x => x.ElementTypeName).ToList();
+ public override void Build(BuildContext context)
+ {
+ var blueprints = _repository.Table.OrderBy(x => x.ElementTypeName).ToList();
- if (!elements.Any()) {
+ if (!blueprints.Any())
return;
- }
+
+ var blueprintEntries = blueprints.Select(blueprint => {
+
+ var describeContext = DescribeElementsContext.Empty;
+ var descriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, blueprint.BaseElementTypeName);
+ var baseElement = _elementManager.ActivateElement(descriptor);
+ baseElement.Data = ElementDataHelper.Deserialize(blueprint.BaseElementState);
+ return new { Blueprint = blueprint, BaseElement = baseElement };
+
+ }).ToList();
+
+ var baseElements = blueprintEntries.Select(e => e.BaseElement).ToList();
+ var exportLayoutContext = new ExportLayoutContext();
+ _elementManager.Exporting(baseElements, exportLayoutContext);
+ _elementManager.Exported(baseElements, exportLayoutContext);
+
var root = new XElement("CustomElements");
context.RecipeDocument.Element("Orchard").Add(root);
- foreach (var element in elements) {
+ foreach (var bluprintEntry in blueprintEntries) {
root.Add(new XElement("Element",
- new XAttribute("ElementTypeName", element.ElementTypeName),
- new XAttribute("BaseElementTypeName", element.BaseElementTypeName),
- new XAttribute("ElementDisplayName", element.ElementDisplayName),
- new XAttribute("ElementDescription", element.ElementDescription),
- new XAttribute("ElementCategory", element.ElementCategory),
- new XElement("BaseElementState", new XCData(element.BaseElementState))));
+ new XAttribute("ElementTypeName", bluprintEntry.Blueprint.ElementTypeName),
+ new XAttribute("BaseElementTypeName", bluprintEntry.Blueprint.BaseElementTypeName),
+ new XAttribute("ElementDisplayName", bluprintEntry.Blueprint.ElementDisplayName),
+ new XAttribute("ElementDescription", bluprintEntry.Blueprint.ElementDescription ?? ""),
+ new XAttribute("ElementCategory", bluprintEntry.Blueprint.ElementCategory ?? ""),
+ new XAttribute("BaseExportableData", bluprintEntry.BaseElement.ExportableData.Serialize()),
+ new XElement("BaseElementState", new XCData(bluprintEntry.Blueprint.BaseElementState))));
}
}
}
diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Executors/CustomElementsStep.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Executors/CustomElementsStep.cs
index 2f2eba242..23b771f00 100644
--- a/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Executors/CustomElementsStep.cs
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/Recipes/Executors/CustomElementsStep.cs
@@ -1,20 +1,32 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using Orchard.Data;
using Orchard.Layouts.Models;
using Orchard.Logging;
using Orchard.Recipes.Models;
using Orchard.Recipes.Services;
+using Orchard.Layouts.Services;
+using Orchard.Layouts.Framework.Elements;
+using Orchard.Layouts.Helpers;
+using Orchard.ContentManagement;
+using Orchard.Layouts.Framework.Drivers;
namespace Orchard.Layouts.Recipes.Executors {
public class CustomElementsStep : RecipeExecutionStep {
private readonly IRepository _repository;
+ private readonly IElementManager _elementManager;
+ private readonly IOrchardServices _orchardServices;
public CustomElementsStep(
IRepository repository,
+ IElementManager elementManager,
+ IOrchardServices orchardServices,
RecipeExecutionLogger logger) : base(logger) {
_repository = repository;
+ _elementManager = elementManager;
+ _orchardServices = orchardServices;
}
public override string Name {
@@ -25,24 +37,50 @@ namespace Orchard.Layouts.Recipes.Executors {
get { return new[] { Name, "LayoutElements" }; }
}
- public override void Execute(RecipeExecutionContext context) {
- foreach (var elementElement in context.RecipeStep.Step.Elements()) {
- var typeName = elementElement.Attribute("ElementTypeName").Value;
+ public override void Execute(RecipeExecutionContext context)
+ {
+
+ var blueprintEntries = context.RecipeStep.Step.Elements().Select(xmlBlueprint => {
+
+ var typeName = xmlBlueprint.Attribute("ElementTypeName").Value;
Logger.Information("Importing custom element '{0}'.", typeName);
try {
- var element = GetOrCreateElement(typeName);
- element.BaseElementTypeName = elementElement.Attribute("BaseElementTypeName").Value;
- element.ElementDisplayName = elementElement.Attribute("ElementDisplayName").Value;
- element.ElementDescription = elementElement.Attribute("ElementDescription").Value;
- element.ElementCategory = elementElement.Attribute("ElementCategory").Value;
- element.BaseElementState = elementElement.Element("BaseElementState").Value;
+ var blueprint = GetOrCreateElement(typeName);
+ blueprint.BaseElementTypeName = xmlBlueprint.Attribute("BaseElementTypeName").Value;
+ blueprint.ElementDisplayName = xmlBlueprint.Attribute("ElementDisplayName").Value;
+ blueprint.ElementDescription = xmlBlueprint.Attribute("ElementDescription").Value;
+ blueprint.ElementCategory = xmlBlueprint.Attribute("ElementCategory").Value;
+ blueprint.BaseElementState = xmlBlueprint.Element("BaseElementState").Value;
+
+ var describeContext = DescribeElementsContext.Empty;
+ var descriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, blueprint.BaseElementTypeName);
+ var baseElement = _elementManager.ActivateElement(descriptor);
+ baseElement.Data = ElementDataHelper.Deserialize(blueprint.BaseElementState);
+ baseElement.ExportableData = ElementDataHelper.Deserialize(xmlBlueprint.Attribute("BaseExportableData").Value);
+
+ return new { Blueprint = blueprint, BaseElement = baseElement };
}
catch (Exception ex) {
Logger.Error(ex, "Error while importing custom element '{0}'.", typeName);
throw;
}
- }
+
+ }).ToList();
+
+
+ var baseElements = blueprintEntries.Select(e => e.BaseElement).ToList();
+ var importContentSession = new ImportContentSession(_orchardServices.ContentManager);
+ var importLayoutContext = new ImportLayoutContext {
+ Session = new ImportContentSessionWrapper(importContentSession)
+ };
+ _elementManager.Importing(baseElements, importLayoutContext);
+ _elementManager.Imported(baseElements, importLayoutContext);
+ _elementManager.ImportCompleted(baseElements, importLayoutContext);
+
+ foreach (var blueprintEntry in blueprintEntries)
+ blueprintEntry.Blueprint.BaseElementState = blueprintEntry.BaseElement.Data.Serialize();
+
}
private ElementBlueprint GetOrCreateElement(string typeName) {