mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-04-05 21:01:35 +08:00
Fix Issue 8121: ElementWrapperPartDriver (#8125)
Prevent data being lost when overwriting data during subsequent import/export events.
This commit is contained in:
parent
533eb411e9
commit
33002234fe
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Diagnostics.Eventing.Reader;
|
||||
using System.Linq;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Drivers;
|
||||
@ -91,11 +90,10 @@ namespace Orchard.Layouts.Drivers {
|
||||
|
||||
protected override void Exported(ElementWrapperPart part, ExportContentContext context) {
|
||||
var describeContext = CreateDescribeContext(part);
|
||||
var descriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, part.ElementTypeName);
|
||||
var data = ElementDataHelper.Deserialize(part.ElementData);
|
||||
var element = _elementManager.ActivateElement(descriptor, e => e.Data = data);
|
||||
|
||||
_elementManager.Exported(new[] { element }, new ExportLayoutContext());
|
||||
// Deserialize element from the version set in the Exporting method
|
||||
var currentContextValue = context.Element(part.PartDefinition.Name).Value;
|
||||
var element = _serializer.Deserialize(currentContextValue, describeContext);
|
||||
_elementManager.Exported(new[] {element}, new ExportLayoutContext());
|
||||
var exportableData = _serializer.Serialize(element);
|
||||
|
||||
context.Element(part.PartDefinition.Name).SetValue(exportableData);
|
||||
@ -108,22 +106,38 @@ namespace Orchard.Layouts.Drivers {
|
||||
}
|
||||
|
||||
protected override void Imported(ElementWrapperPart part, ImportContentContext context) {
|
||||
HandleImportEvent(part, context, (describeContext, element) => {
|
||||
HandleSecondaryImportEvent(part, context, (describeContext, element) => {
|
||||
_elementManager.Imported(new[] { element }, new ImportLayoutContext { Session = new ImportContentContextWrapper(context) });
|
||||
});
|
||||
}
|
||||
|
||||
protected override void ImportCompleted(ElementWrapperPart part, ImportContentContext context) {
|
||||
HandleImportEvent(part, context, (describeContext, element) => {
|
||||
HandleSecondaryImportEvent(part, context, (describeContext, element) => {
|
||||
_elementManager.ImportCompleted(new[] { element }, new ImportLayoutContext { Session = new ImportContentContextWrapper(context) });
|
||||
});
|
||||
}
|
||||
|
||||
private void HandleSecondaryImportEvent(ElementWrapperPart part, ImportContentContext context, Action<DescribeElementsContext, Element> callback) {
|
||||
var root = context.Data.Element(part.PartDefinition.Name);
|
||||
if (root == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var describeContext = CreateDescribeContext(part);
|
||||
// Deserialize element from the data set in previous Import events
|
||||
var descriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, part.ElementTypeName);
|
||||
var data = ElementDataHelper.Deserialize(part.ElementData);
|
||||
var element = _elementManager.ActivateElement(descriptor, e => e.Data = data);
|
||||
|
||||
callback(describeContext, element);
|
||||
part.ElementData = element.Data.Serialize();
|
||||
}
|
||||
|
||||
private void HandleImportEvent(ElementWrapperPart part, ImportContentContext context, Action<DescribeElementsContext, Element> callback) {
|
||||
var root = context.Data.Element(part.PartDefinition.Name);
|
||||
|
||||
if (root == null)
|
||||
if (root == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var exportedData = root.Value;
|
||||
var describeContext = CreateDescribeContext(part);
|
||||
|
Loading…
Reference in New Issue
Block a user