/// <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); } } } } } }
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); }
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); }
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); }
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."); } }