diff --git a/src/Umbraco.Web/Extensions/UdiExtensions.cs b/src/Umbraco.Web/Extensions/UdiExtensions.cs new file mode 100644 index 0000000000..c814d63b8c --- /dev/null +++ b/src/Umbraco.Web/Extensions/UdiExtensions.cs @@ -0,0 +1,43 @@ +using Umbraco.Core; +using Umbraco.Core.Models; + +namespace Umbraco.Web.Extensions +{ + public static class UdiExtensions + { + /// + /// An extension method to easily acquire a typed version of content, media or member item for a given Udi + /// + /// + /// An item if the item is a Document, Media or Member + public static IPublishedContent ToPublishedContent(this Udi udi) + { + Udi identifier; + if (Udi.TryParse(udi.ToString(), out identifier) == false) + return null; + + var guidUdi = GuidUdi.Parse(udi.ToString()); + var umbracoType = Constants.UdiEntityType.ToUmbracoObjectType(identifier.EntityType); + + var umbracoHelper = new UmbracoHelper(UmbracoContext.Current); + var entityService = ApplicationContext.Current.Services.EntityService; + switch (umbracoType) + { + case UmbracoObjectTypes.Document: + return umbracoHelper.TypedContent(guidUdi.Guid); + case UmbracoObjectTypes.Media: + var mediaAttempt = entityService.GetIdForKey(guidUdi.Guid, umbracoType); + if (mediaAttempt.Success) + return umbracoHelper.TypedMedia(mediaAttempt.Result); + break; + case UmbracoObjectTypes.Member: + var memberAttempt = entityService.GetIdForKey(guidUdi.Guid, umbracoType); + if (memberAttempt.Success) + return umbracoHelper.TypedMember(memberAttempt.Result); + break; + } + + return null; + } + } +} diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs index 71e559a734..9fdd28ec94 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs @@ -16,6 +16,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Extensions; namespace Umbraco.Web.PropertyEditors.ValueConverters { @@ -121,12 +122,12 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters } break; case Constants.PropertyEditors.ContentPicker2Alias: - GuidUdi sourceUdi; - if (GuidUdi.TryParse(source.ToString(), out sourceUdi)) + Udi udi; + if (Udi.TryParse(source.ToString(), out udi)) { - var helper = new UmbracoHelper(UmbracoContext.Current); - content = helper.TypedContent(sourceUdi.Guid); - return content; + content = udi.ToPublishedContent(); + if (content != null) + return content; } break; } diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs index dce303f75e..02363a5575 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs @@ -13,6 +13,7 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Extensions; namespace Umbraco.Web.PropertyEditors.ValueConverters { @@ -92,19 +93,14 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters return null; } - if (UmbracoContext.Current != null) + Udi udi; + if (Udi.TryParse(source.ToString(), out udi)) { - GuidUdi sourceUdi; - if (GuidUdi.TryParse(source.ToString(), out sourceUdi)) - { - var helper = new UmbracoHelper(UmbracoContext.Current); - var mediaAttempt = ApplicationContext.Current.Services.EntityService.GetIdForKey(sourceUdi.Guid, UmbracoObjectTypes.Media); - if (mediaAttempt.Success) - { - return helper.TypedMedia(mediaAttempt.Result); - } - } + var media = udi.ToPublishedContent(); + if (media != null) + return media; } + return source; } } diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs index 9e4ec3a315..b955e8ab66 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs @@ -1,9 +1,9 @@ -using System; -using Umbraco.Core; +using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Extensions; using Umbraco.Web.Security; namespace Umbraco.Web.PropertyEditors.ValueConverters @@ -56,16 +56,12 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters } break; case Constants.PropertyEditors.MemberPicker2Alias: - GuidUdi sourceUdi; - if (GuidUdi.TryParse(source.ToString(), out sourceUdi)) + Udi udi; + if (Udi.TryParse(source.ToString(), out udi)) { - var helper = new UmbracoHelper(UmbracoContext.Current); - var memberAttempt = ApplicationContext.Current.Services.EntityService.GetIdForKey(sourceUdi.Guid, UmbracoObjectTypes.Member); - if (memberAttempt.Success) - { - member = helper.TypedMember(memberAttempt.Result); + member = udi.ToPublishedContent(); + if (member != null) return member; - } } break; } diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs index 286d8e6cf8..e421cb03a6 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs @@ -17,6 +17,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Core.PropertyEditors.ValueConverters; +using Umbraco.Web.Extensions; namespace Umbraco.Web.PropertyEditors.ValueConverters { @@ -165,24 +166,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters if (udis.Length > 0) { - var objectType = UmbracoObjectTypes.Unknown; - foreach (var udi in udis) { - GuidUdi sourceUdi; - if (GuidUdi.TryParse(udi.ToString(), out sourceUdi)) - { - var umbHelper = new UmbracoHelper(UmbracoContext.Current); - var multiNodeTreePickerItem = - GetPublishedContent(sourceUdi.Guid, ref objectType, UmbracoObjectTypes.Document, umbHelper.TypedContent) - ?? GetPublishedContent(sourceUdi.Guid, ref objectType, UmbracoObjectTypes.Media, umbHelper.TypedMedia) - ?? GetPublishedContent(sourceUdi.Guid, ref objectType, UmbracoObjectTypes.Member, umbHelper.TypedMember); - - if (multiNodeTreePickerItem != null) - { - multiNodeTreePicker.Add(multiNodeTreePickerItem); - } - } + var item = udi.ToPublishedContent(); + if (item != null) + multiNodeTreePicker.Add(item); } } //TODO: Get rid of this Yield thing @@ -222,37 +210,5 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters } return content; } - - /// - /// Attempt to get an IPublishedContent instance based on ID and content type - /// - /// The element UDI's Guid - /// The type of content being requested - /// The type of content expected/supported by - /// A function to fetch content of type - /// The requested content, or null if either it does not exist or does not match - private IPublishedContent GetPublishedContent(Guid sourceUdi, ref UmbracoObjectTypes actualType, UmbracoObjectTypes expectedType, Func contentFetcher) - { - // is the actual type supported by the content fetcher? - if (actualType != UmbracoObjectTypes.Unknown && actualType != expectedType) - { - // no, return null - return null; - } - - // attempt to get the content - IPublishedContent content = null; - var contentAttempt = ApplicationContext.Current.Services.EntityService.GetIdForKey(sourceUdi, expectedType); - if (contentAttempt.Success) - { - content = contentFetcher(contentAttempt.Result); - if (content != null) - { - // if we found the content, assign the expected type to the actual type so we don't have to keep looking for other types of content - actualType = expectedType; - } - } - return content; - } } } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 5e8627e6fa..08d487edf8 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -321,6 +321,7 @@ +