diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs index 29b203d..e6c0607 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs @@ -1,15 +1,9 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Net.Mime; -using System.Text; -using System.Threading.Tasks; -using System.Web.Http.ModelBinding; using Archetype.Umbraco.Models; using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.PublishedContent; namespace Archetype.Umbraco.Extensions { @@ -28,6 +22,32 @@ namespace Archetype.Umbraco.Extensions _app = ApplicationContext.Current; } + + internal Models.Archetype DeserializeJsonToArchetype(string sourceJson, PreValueCollection dataTypePreValues) + { + try + { + var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); + + try + { + // Get list of configured properties and their types and map them to the deserialized archetype model + var preValue = GetArchetypePreValueFromPreValuesCollection(dataTypePreValues); + RetrieveAdditionalProperties(ref archetype, preValue); + } + catch (Exception ex) + { + } + + return archetype; + } + catch + { + return new Models.Archetype(); + } + + } + internal Models.Archetype DeserializeJsonToArchetype(string sourceJson, int dataTypeId) { try @@ -72,6 +92,14 @@ namespace Archetype.Umbraco.Extensions }) as ArchetypePreValue; } + private ArchetypePreValue GetArchetypePreValueFromPreValuesCollection(PreValueCollection dataTypePreValues) + { + var preValueAsString = dataTypePreValues.PreValuesAsDictionary.First().Value.Value; + var preValue = JsonConvert.DeserializeObject(preValueAsString, _jsonSettings); + return preValue; + } + + private IDataTypeDefinition GetDataTypeByGuid(Guid guid) { return (IDataTypeDefinition) ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem( @@ -96,6 +124,7 @@ namespace Archetype.Umbraco.Extensions var propertyAlias = property.Alias; foreach ( var propertyInst in fieldsetInst.Properties.Where(x => x.Alias == propertyAlias)) { + propertyInst.DataTypeGuid = property.DataTypeGuid.ToString(); propertyInst.DataTypeId = GetDataTypeByGuid(property.DataTypeGuid).Id; propertyInst.PropertyEditorAlias = property.PropertyEditorAlias; } diff --git a/app/Umbraco/Umbraco.Archetype/Models/Property.cs b/app/Umbraco/Umbraco.Archetype/Models/Property.cs index a3c4522..902e434 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Property.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/Property.cs @@ -28,9 +28,6 @@ namespace Archetype.Umbraco.Models public T GetValue() { - // If the value is of type T, just return it - if (Value is T) - return (T)Value; // Try Umbraco's PropertyValueConverters var converters = UmbracoContext.Current != null ? PropertyValueConvertersResolver.Current.Converters : Enumerable.Empty(); @@ -41,6 +38,10 @@ namespace Archetype.Umbraco.Models return convertedAttempt.Result; } + // If the value is of type T, just return it + if (Value is T) + return (T)Value; + // No PropertyValueConverters matched, so try a regular type conversion var convertAttempt2 = Value.TryConvertTo(); if (convertAttempt2.Success) diff --git a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs index 1546863..58da5eb 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs @@ -42,8 +42,8 @@ namespace Archetype.Umbraco.PropertyConverters var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(source.ToString(), (propertyType != null ? propertyType.DataTypeId : -1)); - return archetype; + return archetype; } - } + } } \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs index eda1e23..d790e64 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Archetype.Umbraco.Extensions; using ClientDependency.Core; using Newtonsoft.Json; using Umbraco.Core; @@ -48,20 +49,14 @@ namespace Archetype.Umbraco.PropertyEditors protected JsonSerializerSettings _jsonSettings; public ArchetypePropertyValueEditor(PropertyValueEditor wrapped) - : base(wrapped) - { - var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver(); - dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; - - _jsonSettings = new JsonSerializerSettings { ContractResolver = dcr }; - } + : base(wrapped) { } public override string ConvertDbToString(Property property, PropertyType propertyType, IDataTypeService dataTypeService) { if (property.Value == null) return string.Empty; - var archetype = JsonConvert.DeserializeObject(property.Value.ToString(), _jsonSettings); + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId); foreach (var fieldset in archetype.Fieldsets) { @@ -101,13 +96,12 @@ namespace Archetype.Umbraco.PropertyEditors return archetype; } - - public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) + public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) { if (editorValue.Value == null) return string.Empty; - var archetype = JsonConvert.DeserializeObject(editorValue.Value.ToString(), _jsonSettings); + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(editorValue.Value.ToString(), editorValue.PreValues); foreach (var fieldset in archetype.Fieldsets) {