diff --git a/src/Umbraco.Core/Services/EntityXmlSerializer.cs b/src/Umbraco.Core/Services/EntityXmlSerializer.cs
index f7af0ed858..8f13ab42d7 100644
--- a/src/Umbraco.Core/Services/EntityXmlSerializer.cs
+++ b/src/Umbraco.Core/Services/EntityXmlSerializer.cs
@@ -127,6 +127,81 @@ namespace Umbraco.Core.Services
return xElement;
}
+ ///
+ /// Exports an item to xml as an
+ ///
+ ///
+ /// Content type to export
+ /// containing the xml representation of the IContentType object
+ public XElement Serialize(IDataTypeService dataTypeService, IContentType contentType)
+ {
+ var info = new XElement("Info",
+ new XElement("Name", contentType.Name),
+ new XElement("Alias", contentType.Alias),
+ new XElement("Icon", contentType.Icon),
+ new XElement("Thumbnail", contentType.Thumbnail),
+ new XElement("Description", contentType.Description),
+ new XElement("AllowAtRoot", contentType.AllowedAsRoot.ToString()),
+ new XElement("IsListView", contentType.IsContainer.ToString()));
+
+ var masterContentType = contentType.CompositionAliases().FirstOrDefault();
+ if (masterContentType != null)
+ info.Add(new XElement("Master", masterContentType));
+
+ var allowedTemplates = new XElement("AllowedTemplates");
+ foreach (var template in contentType.AllowedTemplates)
+ {
+ allowedTemplates.Add(new XElement("Template", template.Alias));
+ }
+ info.Add(allowedTemplates);
+ if (contentType.DefaultTemplate != null && contentType.DefaultTemplate.Id != 0)
+ info.Add(new XElement("DefaultTemplate", contentType.DefaultTemplate.Alias));
+ else
+ info.Add(new XElement("DefaultTemplate", ""));
+
+ var structure = new XElement("Structure");
+ foreach (var allowedType in contentType.AllowedContentTypes)
+ {
+ structure.Add(new XElement("DocumentType", allowedType.Alias));
+ }
+
+ var genericProperties = new XElement("GenericProperties");
+ foreach (var propertyType in contentType.PropertyTypes)
+ {
+ var definition = dataTypeService.GetDataTypeDefinitionById(propertyType.DataTypeDefinitionId);
+
+ var propertyGroup = propertyType.PropertyGroupId == null
+ ? null
+ : contentType.PropertyGroups.FirstOrDefault(x => x.Id == propertyType.PropertyGroupId.Value);
+
+ var genericProperty = new XElement("GenericProperty",
+ new XElement("Name", propertyType.Name),
+ new XElement("Alias", propertyType.Alias),
+ new XElement("Type", propertyType.PropertyEditorAlias),
+ new XElement("Definition", definition.Key),
+ new XElement("Tab", propertyGroup == null ? "" : propertyGroup.Name),
+ new XElement("Mandatory", propertyType.Mandatory.ToString()),
+ new XElement("Validation", propertyType.ValidationRegExp),
+ new XElement("Description", new XCData(propertyType.Description)));
+ genericProperties.Add(genericProperty);
+ }
+
+ var tabs = new XElement("Tabs");
+ foreach (var propertyGroup in contentType.PropertyGroups)
+ {
+ var tab = new XElement("Tab",
+ new XElement("Id", propertyGroup.Id.ToString(CultureInfo.InvariantCulture)),
+ new XElement("Caption", propertyGroup.Name));
+ tabs.Add(tab);
+ }
+
+ return new XElement("DocumentType",
+ info,
+ structure,
+ genericProperties,
+ tabs);
+ }
+
///
/// Used by Media Export to recursively add children
///
diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs
index 0d495104a3..96b7303ae0 100644
--- a/src/Umbraco.Core/Services/PackagingService.cs
+++ b/src/Umbraco.Core/Services/PackagingService.cs
@@ -72,14 +72,16 @@ namespace Umbraco.Core.Services
public XElement Export(IContent content, bool deep = false, bool raiseEvents = true)
{
var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : content.ContentType.Alias.ToSafeAliasWithForcingCheck();
- var exporter = new EntityXmlSerializer();
- var xml = exporter.Serialize(_contentService, _dataTypeService, content, deep);
-
+
if (raiseEvents)
{
if (ExportingContent.IsRaisedEventCancelled(new ExportEventArgs(content, nodeName), this))
return new XElement(nodeName);
}
+
+ var exporter = new EntityXmlSerializer();
+ var xml = exporter.Serialize(_contentService, _dataTypeService, content, deep);
+
if(raiseEvents)
ExportedContent.RaiseEvent(new ExportEventArgs(content, xml, false), this);
@@ -272,70 +274,8 @@ namespace Umbraco.Core.Services
return new XElement("DocumentType");
}
- var info = new XElement("Info",
- new XElement("Name", contentType.Name),
- new XElement("Alias", contentType.Alias),
- new XElement("Icon", contentType.Icon),
- new XElement("Thumbnail", contentType.Thumbnail),
- new XElement("Description", contentType.Description),
- new XElement("AllowAtRoot", contentType.AllowedAsRoot.ToString()));
-
- var masterContentType = contentType.CompositionAliases().FirstOrDefault();
- if (masterContentType != null)
- info.Add(new XElement("Master", masterContentType));
-
- var allowedTemplates = new XElement("AllowedTemplates");
- foreach (var template in contentType.AllowedTemplates)
- {
- allowedTemplates.Add(new XElement("Template", template.Alias));
- }
- info.Add(allowedTemplates);
- if (contentType.DefaultTemplate != null && contentType.DefaultTemplate.Id != 0)
- info.Add(new XElement("DefaultTemplate", contentType.DefaultTemplate.Alias));
- else
- info.Add(new XElement("DefaultTemplate", ""));
-
- var structure = new XElement("Structure");
- foreach (var allowedType in contentType.AllowedContentTypes)
- {
- structure.Add(new XElement("DocumentType", allowedType.Alias));
- }
-
- var genericProperties = new XElement("GenericProperties");
- foreach (var propertyType in contentType.PropertyTypes)
- {
- var definition = _dataTypeService.GetDataTypeDefinitionById(propertyType.DataTypeDefinitionId);
-
- var propertyGroup = propertyType.PropertyGroupId == null
- ? null
- : contentType.PropertyGroups.FirstOrDefault(x => x.Id == propertyType.PropertyGroupId.Value);
-
- var genericProperty = new XElement("GenericProperty",
- new XElement("Name", propertyType.Name),
- new XElement("Alias", propertyType.Alias),
- new XElement("Type", propertyType.PropertyEditorAlias),
- new XElement("Definition", definition.Key),
- new XElement("Tab", propertyGroup == null ? "" : propertyGroup.Name),
- new XElement("Mandatory", propertyType.Mandatory.ToString()),
- new XElement("Validation", propertyType.ValidationRegExp),
- new XElement("Description", new XCData(propertyType.Description)));
- genericProperties.Add(genericProperty);
- }
-
- var tabs = new XElement("Tabs");
- foreach (var propertyGroup in contentType.PropertyGroups)
- {
- var tab = new XElement("Tab",
- new XElement("Id", propertyGroup.Id.ToString(CultureInfo.InvariantCulture)),
- new XElement("Caption", propertyGroup.Name));
- tabs.Add(tab);
- }
-
- var xml = new XElement("DocumentType",
- info,
- structure,
- genericProperties,
- tabs);
+ var exporter = new EntityXmlSerializer();
+ var xml = exporter.Serialize(_dataTypeService, contentType);
if (raiseEvents)
ExportedContentType.RaiseEvent(new ExportEventArgs(contentType, xml, false), this);
@@ -464,8 +404,13 @@ namespace Umbraco.Core.Services
contentType.Thumbnail = infoElement.Element("Thumbnail").Value;
contentType.Description = infoElement.Element("Description").Value;
//NOTE AllowAtRoot is a new property in the package xml so we need to verify it exists before using it.
- if (infoElement.Element("AllowAtRoot") != null)
- contentType.AllowedAsRoot = infoElement.Element("AllowAtRoot").Value.ToLowerInvariant().Equals("true");
+ var allowAtRoot = infoElement.Element("AllowAtRoot");
+ if (allowAtRoot != null)
+ contentType.AllowedAsRoot = allowAtRoot.Value.InvariantEquals("true");
+ //NOTE IsListView is a new property in the package xml so we need to verify it exists before using it.
+ var isListView = infoElement.Element("IsListView");
+ if (isListView != null)
+ contentType.IsContainer = isListView.Value.InvariantEquals("true");
UpdateContentTypesAllowedTemplates(contentType, infoElement.Element("AllowedTemplates"), defaultTemplateElement);
UpdateContentTypesTabs(contentType, documentType.Element("Tabs"));
diff --git a/src/umbraco.cms/businesslogic/web/DocumentType.cs b/src/umbraco.cms/businesslogic/web/DocumentType.cs
index 2138504539..dcdb91a885 100644
--- a/src/umbraco.cms/businesslogic/web/DocumentType.cs
+++ b/src/umbraco.cms/businesslogic/web/DocumentType.cs
@@ -8,6 +8,7 @@ using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Caching;
using umbraco.BusinessLogic;
+using Umbraco.Core.Services;
using umbraco.DataLayer;
using System.Collections.Generic;
using Umbraco.Core;
@@ -470,87 +471,12 @@ namespace umbraco.cms.businesslogic.web
public XmlElement ToXml(XmlDocument xd)
{
- XmlElement doc = xd.CreateElement("DocumentType");
+ var exporter = new EntityXmlSerializer();
+ var xml = exporter.Serialize(ApplicationContext.Current.Services.DataTypeService, _contentType);
- // info section
- XmlElement info = xd.CreateElement("Info");
- doc.AppendChild(info);
- info.AppendChild(XmlHelper.AddTextNode(xd, "Name", GetRawText()));
- info.AppendChild(XmlHelper.AddTextNode(xd, "Alias", Alias));
- info.AppendChild(XmlHelper.AddTextNode(xd, "Icon", IconUrl));
- info.AppendChild(XmlHelper.AddTextNode(xd, "Thumbnail", Thumbnail));
- info.AppendChild(XmlHelper.AddTextNode(xd, "Description", GetRawDescription()));
- info.AppendChild(XmlHelper.AddTextNode(xd, "AllowAtRoot", AllowAtRoot.ToString()));
-
- //TODO: Add support for mixins!
- if (this.MasterContentType > 0)
- {
- DocumentType dt = new DocumentType(this.MasterContentType);
-
- if (dt != null)
- info.AppendChild(XmlHelper.AddTextNode(xd, "Master", dt.Alias));
- }
-
-
- // templates
- XmlElement allowed = xd.CreateElement("AllowedTemplates");
- foreach (template.Template t in allowedTemplates)
- allowed.AppendChild(XmlHelper.AddTextNode(xd, "Template", t.Alias));
- info.AppendChild(allowed);
- if (DefaultTemplate != 0)
- info.AppendChild(
- XmlHelper.AddTextNode(xd, "DefaultTemplate", new template.Template(DefaultTemplate).Alias));
- else
- info.AppendChild(XmlHelper.AddTextNode(xd, "DefaultTemplate", ""));
-
- // structure
- XmlElement structure = xd.CreateElement("Structure");
- doc.AppendChild(structure);
-
- foreach (int cc in AllowedChildContentTypeIDs.ToList())
- structure.AppendChild(XmlHelper.AddTextNode(xd, "DocumentType", new DocumentType(cc).Alias));
-
- // generic properties
- XmlElement pts = xd.CreateElement("GenericProperties");
- foreach (PropertyType pt in PropertyTypes)
- {
- //only add properties that aren't from master doctype
- if (pt.ContentTypeId == this.Id)
- {
- XmlElement ptx = xd.CreateElement("GenericProperty");
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Name", pt.GetRawName()));
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Alias", pt.Alias));
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Type", pt.DataTypeDefinition.DataType.Id.ToString()));
-
- //Datatype definition guid was added in v4 to enable datatype imports
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Definition", pt.DataTypeDefinition.UniqueId.ToString()));
-
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Tab", Tab.GetRawCaptionById(pt.TabId)));
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Mandatory", pt.Mandatory.ToString()));
- ptx.AppendChild(XmlHelper.AddTextNode(xd, "Validation", pt.ValidationRegExp));
- ptx.AppendChild(XmlHelper.AddCDataNode(xd, "Description", pt.GetRawDescription()));
- pts.AppendChild(ptx);
- }
- }
- doc.AppendChild(pts);
-
- // tabs
- var tabs = xd.CreateElement("Tabs");
-
- foreach (var propertyTypeGroup in PropertyTypeGroups)
- {
- //only add tabs that aren't from a master doctype
- if (propertyTypeGroup.ContentTypeId == this.Id)
- {
- var tabx = xd.CreateElement("Tab");
- tabx.AppendChild(XmlHelper.AddTextNode(xd, "Id", propertyTypeGroup.Id.ToString()));
- tabx.AppendChild(XmlHelper.AddTextNode(xd, "Caption", propertyTypeGroup.Name));
- tabx.AppendChild(XmlHelper.AddTextNode(xd, "SortOrder", propertyTypeGroup.SortOrder.ToString()));
- tabs.AppendChild(tabx);
- }
- }
-
- doc.AppendChild(tabs);
+ //convert the Linq to Xml structure to the old .net xml structure
+ var xNode = xml.GetXmlNode();
+ var doc = (XmlElement)xd.ImportNode(xNode, true);
return doc;
}