Exemplo n.º 1
0
        /// <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);
                }
            }
        }
Exemplo n.º 2
0
        /// <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));
                }
            }
        }
Exemplo n.º 3
0
        /// <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));
                    }
                }
            }
        }