From d2fdf7b6474f5ed2c7a7d4b0957855b19259c58e Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Wed, 15 Mar 2017 23:22:33 +0100 Subject: [PATCH] Check if MediaPicker is configured as single or multiple and give back appropriate result for each (IPublishedContent vs IEnumerable) --- .../MediaPickerPropertyConverter.cs | 108 +++++++++++++++--- 1 file changed, 90 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs index 02363a5575..69de94952b 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs @@ -8,8 +8,10 @@ // -------------------------------------------------------------------------------------------------------------------- using System; - +using System.Collections.Generic; +using System.Linq; using Umbraco.Core; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -21,12 +23,72 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// The media picker property value converter. /// [DefaultPropertyValueConverter] - [PropertyValueType(typeof(IPublishedContent))] - [PropertyValueCache(PropertyCacheValue.Object, PropertyCacheLevel.ContentCache)] - [PropertyValueCache(PropertyCacheValue.Source, PropertyCacheLevel.Content)] - [PropertyValueCache(PropertyCacheValue.XPath, PropertyCacheLevel.Content)] - public class MediaPickerPropertyConverter : PropertyValueConverterBase + public class MediaPickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta { + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return IsMultipleDataType(propertyType.DataTypeId) ? typeof(IEnumerable) : typeof(IPublishedContent); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + + /// + /// The is multiple data type. + /// + /// + /// The data type id. + /// + /// + /// The . + /// + private bool IsMultipleDataType(int dataTypeId) + { + var multipleItems = false; + + try + { + var dts = ApplicationContext.Current.Services.DataTypeService; + + var multiPickerPreValues = + dts.GetPreValuesCollectionByDataTypeId(dataTypeId).PreValuesAsDictionary; + + var multiPickerPreValue = multiPickerPreValues.FirstOrDefault(x => string.Equals(x.Key, "multiPicker", StringComparison.InvariantCultureIgnoreCase)).Value; + + var attemptConvert = multiPickerPreValue.Value.TryConvertTo(); + + if (attemptConvert.Success) + { + multipleItems = attemptConvert.Result; + } + } + catch (Exception ex) + { + LogHelper.Error(string.Format("Error finding multipleItems data type prevalue on data type Id {0}", dataTypeId), ex); + } + + return multipleItems; + } + /// /// Checks if this converter can convert the property editor and registers if it can. /// @@ -62,13 +124,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) { - var attemptConvertInt = source.TryConvertTo(); - if (attemptConvertInt.Success) - return attemptConvertInt.Result; - var attemptConvertUdi = source.TryConvertTo(); - if (attemptConvertUdi.Success) - return attemptConvertUdi.Result; - return null; + var nodeIds = source.ToString() + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .Select(Udi.Parse) + .ToArray(); + return nodeIds; } /// @@ -93,12 +153,24 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters return null; } - Udi udi; - if (Udi.TryParse(source.ToString(), out udi)) + var udis = (Udi[])source; + var mediaItems = new List(); + if (udis.Any()) { - var media = udi.ToPublishedContent(); - if (media != null) - return media; + foreach (var udi in udis) + { + var item = udi.ToPublishedContent(); + if (item != null) + mediaItems.Add(item); + } + if (IsMultipleDataType(propertyType.DataTypeId)) + { + return mediaItems; + } + else + { + return mediaItems.FirstOrDefault(); + } } return source;