/// <summary>
        /// Saves all of the regions from the source model into the destination.
        /// </summary>
        /// <param name="src">The source</param>
        /// <param name="dest">The destination</param>
        private void SaveRegions(SiteContentEditModel src, Piranha.Models.DynamicSiteContent dest)
        {
            var modelRegions = (IDictionary <string, object>)dest.Regions;

            foreach (var region in src.Regions)
            {
                if (region is PageEditRegion)
                {
                    if (!modelRegions.ContainsKey(region.Id))
                    {
                        modelRegions[region.Id] = Piranha.Models.DynamicSiteContent.CreateRegion(api, dest.TypeId, region.Id);
                    }

                    var reg = (PageEditRegion)region;

                    if (reg.FieldSet.Count == 1)
                    {
                        modelRegions[region.Id] = reg.FieldSet[0].Value;
                    }
                    else
                    {
                        var modelFields = (IDictionary <string, object>)modelRegions[region.Id];

                        foreach (var field in reg.FieldSet)
                        {
                            modelFields[field.Id] = field.Value;
                        }
                    }
                }
                else
                {
                    if (modelRegions.ContainsKey(region.Id))
                    {
                        var list = (Piranha.Models.IRegionList)modelRegions[region.Id];
                        var reg  = (PageEditRegionCollection)region;

                        // At this point we clear the values and rebuild them
                        list.Clear();

                        foreach (var set in reg.FieldSets)
                        {
                            if (set.Count == 1)
                            {
                                list.Add(set[0].Value);
                            }
                            else
                            {
                                var modelFields = (IDictionary <string, object>)Piranha.Models.DynamicSiteContent.CreateRegion(api, dest.TypeId, region.Id);

                                foreach (var field in set)
                                {
                                    modelFields[field.Id] = field.Value;
                                }
                                list.Add(modelFields);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public async Task <StatusMessage> SaveContent(SiteContentEditModel model)
        {
            try
            {
                await _service.SaveContent(model);
            }
            catch (ValidationException e)
            {
                // Validation did not succeed
                return(new StatusMessage
                {
                    Type = StatusMessage.Error,
                    Body = e.Message
                });
            }
            catch
            {
                return(new StatusMessage
                {
                    Type = StatusMessage.Error,
                    Body = _localizer.Site["An error occured while saving the site"]
                });
            }

            return(new StatusMessage
            {
                Type = StatusMessage.Success,
                Body = _localizer.Site["The site was successfully saved"]
            });
        }
 /// <summary>
 /// Refreshes the model after an unsuccessful save.
 /// </summary>
 public SiteContentEditModel Refresh(SiteContentEditModel model)
 {
     if (!string.IsNullOrWhiteSpace(model.TypeId))
     {
         model.SiteType = api.SiteTypes.GetById(model.TypeId);
     }
     return(model);
 }
Ejemplo n.º 4
0
 public IActionResult SaveContent(SiteContentEditModel model)
 {
     if (service.Save(model))
     {
         SuccessMessage("The site content has been saved.");
         return(RedirectToAction("EditContent", new { id = model.Id }));
     }
     else
     {
         ErrorMessage("The site content could not be saved.", false);
         return(View("EditContent", service.Refresh(model)));
     }
 }
        /// <summary>
        /// Loads all of the regions from the source model into the destination.
        /// </summary>
        /// <param name="src">The source</param>
        /// <param name="dest">The destination</param>
        private void LoadRegions(Piranha.Models.DynamicSiteContent src, SiteContentEditModel dest)
        {
            if (dest.SiteType != null)
            {
                foreach (var region in dest.SiteType.Regions)
                {
                    var regions = (IDictionary <string, object>)src.Regions;

                    if (regions.ContainsKey(region.Id))
                    {
                        var editRegion = CreateRegion(region, regions[region.Id]);
                        dest.Regions.Add(editRegion);
                    }
                }
            }
        }
        /// <summary>
        /// Saves the site content model.
        /// </summary>
        /// <param name="model">The site content edit model</param>
        /// <returns>If the model was successfully saved</returns>
        public bool Save(SiteContentEditModel model)
        {
            var site = api.Sites.GetContentById(model.Id);

            if (site == null)
            {
                site = Piranha.Models.DynamicSiteContent.Create(api, model.TypeId);
            }

            Module.Mapper.Map <SiteContentEditModel, Piranha.Models.SiteContentBase>(model, site);
            SaveRegions(model, site);

            api.Sites.SaveContent(model.Id, site);
            model.Id = site.Id;

            return(true);
        }
Ejemplo n.º 7
0
        private SiteContentEditModel Transform(DynamicSiteContent site)
        {
            var type = App.SiteTypes.GetById(site.TypeId);

            var model = new SiteContentEditModel
            {
                Id        = site.Id,
                TypeId    = site.TypeId,
                Title     = site.Title,
                UseBlocks = false
            };

            foreach (var regionType in type.Regions)
            {
                var region = new RegionModel
                {
                    Meta = new RegionMeta
                    {
                        Id           = regionType.Id,
                        Name         = regionType.Title,
                        Description  = regionType.Description,
                        Placeholder  = regionType.ListTitlePlaceholder,
                        IsCollection = regionType.Collection,
                        Expanded     = regionType.ListExpand,
                        Icon         = regionType.Icon,
                        Display      = regionType.Display.ToString().ToLower()
                    }
                };
                var regionListModel = ((IDictionary <string, object>)site.Regions)[regionType.Id];

                if (!regionType.Collection)
                {
                    var regionModel = (IRegionList)Activator.CreateInstance(typeof(RegionList <>).MakeGenericType(regionListModel.GetType()));
                    regionModel.Add(regionListModel);
                    regionListModel = regionModel;
                }

                foreach (var regionModel in (IEnumerable)regionListModel)
                {
                    var regionItem = new RegionItemModel();

                    foreach (var fieldType in regionType.Fields)
                    {
                        var appFieldType = App.Fields.GetByType(fieldType.Type);

                        var field = new FieldModel
                        {
                            Meta = new FieldMeta
                            {
                                Id          = fieldType.Id,
                                Name        = fieldType.Title,
                                Component   = appFieldType.Component,
                                Placeholder = fieldType.Placeholder,
                                IsHalfWidth = fieldType.Options.HasFlag(FieldOption.HalfWidth),
                                Description = fieldType.Description
                            }
                        };

                        if (typeof(SelectFieldBase).IsAssignableFrom(appFieldType.Type))
                        {
                            foreach (var item in ((SelectFieldBase)Activator.CreateInstance(appFieldType.Type)).Items)
                            {
                                field.Meta.Options.Add(Convert.ToInt32(item.Value), item.Title);
                            }
                        }

                        if (regionType.Fields.Count > 1)
                        {
                            field.Model = (IField)((IDictionary <string, object>)regionModel)[fieldType.Id];

                            if (regionType.ListTitleField == fieldType.Id)
                            {
                                regionItem.Title        = field.Model.GetTitle();
                                field.Meta.NotifyChange = true;
                            }
                        }
                        else
                        {
                            field.Model             = (IField)regionModel;
                            field.Meta.NotifyChange = true;
                            regionItem.Title        = field.Model.GetTitle();
                        }
                        regionItem.Fields.Add(field);
                    }

                    if (string.IsNullOrWhiteSpace(regionItem.Title))
                    {
                        regionItem.Title = "...";
                    }

                    region.Items.Add(regionItem);
                }
                model.Regions.Add(region);
            }
            return(model);
        }
Ejemplo n.º 8
0
        public async Task SaveContent(SiteContentEditModel model)
        {
            var siteType = App.SiteTypes.GetById(model.TypeId);

            if (siteType != null)
            {
                if (model.Id == Guid.Empty)
                {
                    model.Id = Guid.NewGuid();
                }

                var site = await _api.Sites.GetContentByIdAsync(model.Id);

                if (site == null)
                {
                    site = await _factory.CreateAsync <DynamicSiteContent>(siteType);

                    site.Id = model.Id;
                }

                site.TypeId = model.TypeId;
                site.Title  = model.Title;

                // Save regions
                foreach (var region in siteType.Regions)
                {
                    var modelRegion = model.Regions
                                      .FirstOrDefault(r => r.Meta.Id == region.Id);

                    if (region.Collection)
                    {
                        var listRegion = (IRegionList)((IDictionary <string, object>)site.Regions)[region.Id];

                        listRegion.Clear();

                        foreach (var item in modelRegion.Items)
                        {
                            if (region.Fields.Count == 1)
                            {
                                listRegion.Add(item.Fields[0].Model);
                            }
                            else
                            {
                                var postRegion = new ExpandoObject();

                                foreach (var field in region.Fields)
                                {
                                    var modelField = item.Fields
                                                     .FirstOrDefault(f => f.Meta.Id == field.Id);
                                    ((IDictionary <string, object>)postRegion)[field.Id] = modelField.Model;
                                }
                                listRegion.Add(postRegion);
                            }
                        }
                    }
                    else
                    {
                        var postRegion = ((IDictionary <string, object>)site.Regions)[region.Id];

                        if (region.Fields.Count == 1)
                        {
                            ((IDictionary <string, object>)site.Regions)[region.Id] =
                                modelRegion.Items[0].Fields[0].Model;
                        }
                        else
                        {
                            foreach (var field in region.Fields)
                            {
                                var modelField = modelRegion.Items[0].Fields
                                                 .FirstOrDefault(f => f.Meta.Id == field.Id);
                                ((IDictionary <string, object>)postRegion)[field.Id] = modelField.Model;
                            }
                        }
                    }
                }

                // Save site
                await _api.Sites.SaveContentAsync(model.Id, site);
            }
            else
            {
                throw new ValidationException("Invalid Post Type.");
            }
        }