From 736b4cb4ae2aea2464203682cc0dd4334fdfd6ac Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 21 Sep 2012 14:55:34 -0700 Subject: [PATCH] #19003: Fixing import/export when alias already exists on a different content type Work Item: 19003 --HG-- branch : 1.x --- .../ContentManagement/DefaultContentManager.cs | 2 +- .../ContentManagement/ImportContentSession.cs | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index 419dadcb2..3b88dbcf1 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -580,7 +580,7 @@ namespace Orchard.ContentManagement { var identity = elementId.Value; var status = element.Attribute("Status"); - var item = importContentSession.Get(identity); + var item = importContentSession.Get(identity, XmlConvert.DecodeName(element.Name.LocalName)); if (item == null) { item = New(XmlConvert.DecodeName(element.Name.LocalName)); if (status != null && status.Value == "Draft") { diff --git a/src/Orchard/ContentManagement/ImportContentSession.cs b/src/Orchard/ContentManagement/ImportContentSession.cs index a0fcdf1eb..9d2f7dc3b 100644 --- a/src/Orchard/ContentManagement/ImportContentSession.cs +++ b/src/Orchard/ContentManagement/ImportContentSession.cs @@ -24,12 +24,20 @@ namespace Orchard.ContentManagement { _contentTypes[contentIdentity] = contentType; } - public ContentItem Get(string id) { + public ContentItem Get(string id, string contentTypeHint = null) { var contentIdentity = new ContentIdentity(id); // lookup in local cache - if (_identities.ContainsKey(contentIdentity)) - return _contentManager.Get(_identities[contentIdentity], VersionOptions.DraftRequired); + if (_identities.ContainsKey(contentIdentity)) { + var result = _contentManager.Get(_identities[contentIdentity], VersionOptions.DraftRequired); + + // if two identities are conflicting, then ensure that there types are the same + // e.g., importing a blog as home page (alias=) and the current home page is a page, the blog + // won't be imported, and blog posts will be attached to the page + if (contentTypeHint == null || result.ContentType == contentTypeHint) { + return result; + } + } // no result ? then check if there are some more content items to load from the db if(_lastIndex != int.MaxValue) { @@ -79,8 +87,8 @@ namespace Orchard.ContentManagement { } var contentItem = _contentManager.Create(_contentTypes[contentIdentity], VersionOptions.Draft); - _identities.Add(contentIdentity, contentItem.Id); - _contentItemIds.Add(contentItem.Id, contentIdentity); + _identities[contentIdentity] = contentItem.Id; + _contentItemIds[contentItem.Id] = contentIdentity; return contentItem; }