/// <summary> /// Maps a region to the given data entity. /// </summary> /// <typeparam name="T">The model type</typeparam> /// <param name="model">The model</param> /// <param name="page">The data entity</param> /// <param name="region">The region to map</param> /// <param name="regionType">The region type</param> /// <param name="regionId">The region id</param> /// <param name="sortOrder">The optional sort order</param> private void MapRegion <T>(T model, Data.Page page, object region, Extend.RegionType regionType, string regionId, int sortOrder = 0) where T : Models.Page <T> { // Now map all of the fields for (var n = 0; n < regionType.Fields.Count; n++) { var fieldDef = regionType.Fields[n]; var fieldType = App.Fields.GetByShorthand(fieldDef.Type); if (fieldType == null) { fieldType = App.Fields.GetByType(fieldDef.Type); } if (fieldType != null) { object fieldValue = null; if (regionType.Fields.Count == 1) { // Get the field value for simple region fieldValue = region; //GetSimpleValue(model, regionId); } else { // Get the field value for complex region fieldValue = GetComplexValue(region, fieldDef.Id); // GetComplexValue(model, regionId, fieldDef.Id); } // Check that the returned value matches the type specified // for the page type, otherwise deserialization won't work // when the model is retrieved from the database. if (fieldValue.GetType() != fieldType.Type) { throw new ArgumentException("Given page field value does not match the configured page type"); } // Check if we have the current field in the database already var field = page.Fields .SingleOrDefault(f => f.RegionId == regionId && f.FieldId == fieldDef.Id && f.SortOrder == sortOrder); // If not, create a new field if (field == null) { field = new Data.PageField() { PageId = page.Id, RegionId = regionId, FieldId = fieldDef.Id }; db.PageFields.Add(field); } // Update field info & value field.CLRType = fieldType.CLRType; field.SortOrder = sortOrder; field.Value = Module.Serializer.Serialize(fieldValue); } } }
/// <summary> /// Adds a simple single field value to a collection region. /// </summary> /// <typeparam name="T">The model type</typeparam> /// <param name="model">The model</param> /// <param name="regionId">The region id</param> /// <param name="field">The field</param> private void AddSimpleValue <T>(T model, string regionId, Data.PageField field) where T : Models.Page <T> { var type = App.Fields.GetByType(field.CLRType); if (type != null) { if (model is Models.DynamicPage) { ((IList)((IDictionary <string, object>)((Models.DynamicPage)(object) model).Regions)[regionId]).Add( Module.Serializer.Deserialize(type.Type, field.Value)); } else { ((IList)model.GetType().GetTypeInfo().GetProperty(regionId, App.PropertyBindings).GetValue(model)).Add( Module.Serializer.Deserialize(type.Type, field.Value)); } } }
/// <summary> /// Sets the value of a complex region. /// </summary> /// <typeparam name="T">The model</typeparam> /// <param name="model">The model</param> /// <param name="regionId">The region id</param> /// <param name="fieldId">The field id</param> /// <param name="field">The field</param> private void SetComplexValue <T>(T model, string regionId, string fieldId, Data.PageField field) where T : Models.PageModel <T> { var type = App.Fields.GetByType(field.CLRType); if (type != null) { if (model is Models.PageModel) { ((IDictionary <string, object>)((IDictionary <string, object>)((Models.PageModel)(object) model).Regions)[regionId])[fieldId] = Module.Serializer.Deserialize(type.Type, field.Value); } else { var obj = model.GetType().GetTypeInfo().GetProperty(regionId, App.PropertyBindings).GetValue(model); if (obj != null) { obj.GetType().GetTypeInfo().GetProperty(fieldId, App.PropertyBindings).SetValue(obj, Module.Serializer.Deserialize(type.Type, field.Value)); } } } }