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; }