Improved formatting of layout JSON data in exported recipe files using CDATA. Fixes #5822.

This commit is contained in:
Daniel Stolt
2016-03-30 19:52:33 +02:00
parent bbca767be2
commit 9d8272fdd5

View File

@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Newtonsoft.Json;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
@@ -146,21 +148,27 @@ namespace Orchard.Layouts.Drivers {
}
}
context.Element(part.PartDefinition.Name).SetElementValue("LayoutData", part.LayoutData);
context.Element(part.PartDefinition.Name).Add(new XElement("LayoutData", new XCData(WriteFormattedLayoutData(part.LayoutData))));
}
protected override void Exported(LayoutPart part, ExportContentContext context) {
protected override void Exported(LayoutPart part, ExportContentContext context)
{
_layoutManager.Exported(new ExportLayoutContext { Layout = part });
context.Element(part.PartDefinition.Name).SetElementValue("LayoutData", part.LayoutData);
context.Element(part.PartDefinition.Name).Add(new XElement("LayoutData", new XCData(WriteFormattedLayoutData(part.LayoutData))));
}
protected override void Importing(LayoutPart part, ImportContentContext context) {
HandleImportEvent(part, context, importLayoutContext => {
context.ImportChildEl(part.PartDefinition.Name, "LayoutData", s => {
part.LayoutData = s;
HandleImportEvent(part, context, importLayoutContext =>
{
var layoutDataElement = context.Data.Element(part.PartDefinition.Name).Element("LayoutData");
if (layoutDataElement.FirstNode is XCData)
part.LayoutData = ReadFormattedLayoutData(((XCData)layoutDataElement.FirstNode).Value);
else
part.LayoutData = layoutDataElement.Value;
_layoutManager.Importing(importLayoutContext);
});
context.ImportAttribute(part.PartDefinition.Name, "TemplateId", s => part.TemplateId = GetTemplateId(context, s));
});
@@ -193,5 +201,19 @@ namespace Orchard.Layouts.Drivers {
var template = context.GetItemFromSession(templateIdentity);
return template != null ? template.Id : default(int?);
}
private string WriteFormattedLayoutData(string layoutDataString)
{
var layoutData = JsonConvert.DeserializeObject(layoutDataString);
var formattedLayoutData = JsonConvert.SerializeObject(layoutData, Formatting.Indented);
return $"\n{formattedLayoutData}\n";
}
private string ReadFormattedLayoutData(string formattedLayoutData)
{
var layoutData = JsonConvert.DeserializeObject(formattedLayoutData);
var layoutDataString = JsonConvert.SerializeObject(layoutData, Formatting.None);
return layoutDataString;
}
}
}