/// <summary> /// Deal with change of master page zone admin type from static to editable or configurable. /// </summary> /// <param name="existingMasterPageZone">Existing master page zone.</param> /// <param name="masterPageZone">Updated master page zone.</param> /// <param name="unitOfWork">Unit of work.</param> private void ChangeAdminTypeFromStatic(MasterPageZone existingMasterPageZone, MasterPageZone masterPageZone, IUnitOfWork unitOfWork) { // Create page zones required by editable master page zones, that would not have existed for a static master page zone List <PageZone> pageZones = new List <PageZone>(); List <Page> pages = _pageRepository.ListPagesByMasterPage(existingMasterPageZone.TenantId, existingMasterPageZone.MasterPageId, unitOfWork); foreach (Page page in pages) { pageZones.Add(new PageZone { TenantId = existingMasterPageZone.TenantId, PageId = page.PageId, MasterPageId = existingMasterPageZone.MasterPageId, MasterPageZoneId = existingMasterPageZone.MasterPageZoneId }); } if (pageZones.Count > 0) { // Create page zones _pageRepository.CreatePageZones(existingMasterPageZone.TenantId, pageZones, unitOfWork); // Now get back created page zones, so that newly allocated page zone identifiers are populated pageZones = _pageRepository.ListPageZonesByMasterPageZoneId(existingMasterPageZone.TenantId, existingMasterPageZone.MasterPageId, existingMasterPageZone.MasterPageZoneId, unitOfWork); } // Create page zone elements required by editable master page zones, that would not have existed for a static master page zone List <PageZoneElement> pageZoneElements = new List <PageZoneElement>(); foreach (PageZone pageZone in pageZones) { foreach (MasterPageZoneElement masterPageZoneElement in existingMasterPageZone.MasterPageZoneElements) { long elementId = _elementService.Copy(existingMasterPageZone.TenantId, masterPageZoneElement.Element.ElementId, existingMasterPageZone.TenantId, masterPageZoneElement.Element.ElementTypeId, unitOfWork); PageZoneElement pageZoneElement = new PageZoneElement { TenantId = existingMasterPageZone.TenantId, PageId = pageZone.PageId, PageZoneId = pageZone.PageZoneId, ElementId = elementId }; if (masterPageZone.AdminType == MasterPageZoneAdminType.Editable) { pageZoneElement.MasterPageId = masterPageZoneElement.MasterPageId; pageZoneElement.MasterPageZoneId = masterPageZoneElement.MasterPageZoneId; pageZoneElement.MasterPageZoneElementId = masterPageZoneElement.MasterPageZoneElementId; } if (masterPageZone.AdminType == MasterPageZoneAdminType.Configurable) { pageZoneElement.SortOrder = masterPageZoneElement.SortOrder; } pageZoneElements.Add(pageZoneElement); } } if (pageZoneElements.Count > 0) { _pageRepository.CreatePageZoneElements(existingMasterPageZone.TenantId, pageZoneElements, unitOfWork); } }
public async Task <IActionResult> ReadPageZoneElement(long tenantId, long pageId, long pageZoneId, long pageZoneElementId) { PageZoneElement pageZoneElement = await _pageService.ReadPageZoneElementAsync(tenantId, pageId, pageZoneId, pageZoneElementId); if (pageZoneElement == null) { return(NotFound()); } return(Ok(pageZoneElement)); }
public async Task <PageZoneElement> ReadPageZoneElementAsync(long tenantId, long pageId, long pageZoneId, long pageZoneElementId) { using (SqlConnection connection = new SqlConnection(_options.Value.SqlConnectionString)) { connection.Open(); PageZoneElement pageZoneElement = await connection.QueryFirstOrDefaultAsync <PageZoneElement>( @"SELECT cms.PageZoneElement.TenantId, cms.PageZoneElement.PageId, cms.PageZoneElement.PageZoneId, cms.PageZoneElement.PageZoneElementId, cms.PageZoneElement.SortOrder, cms.Element.ElementTypeId, cms.PageZoneElement.ElementId, cms.PageZoneElement.MasterPageId, cms.PageZoneElement.MasterPageZoneId, cms.PageZoneElement.MasterPageZoneElementId FROM cms.PageZoneElement INNER JOIN cms.Element ON cms.PageZoneElement.TenantId = cms.Element.TenantId AND cms.PageZoneElement.ElementId = cms.Element.ElementId WHERE cms.PageZoneElement.TenantId = @TenantId AND cms.PageZoneElement.PageId = @PageId AND cms.PageZoneElement.PageZoneId = @PageZoneId AND cms.PageZoneElement.PageZoneElementId = @PageZoneElementId", new { TenantId = tenantId, PageId = pageId, PageZoneId = pageZoneId, PageZoneElementId = pageZoneElementId } ); return(pageZoneElement); } }
/// <summary> /// Updates single zone within a master page. /// </summary> /// <param name="masterPageZone">The updated master page zone.</param> /// <param name="unitOfWork">Unit of work.</param> public void UpdateZone(MasterPageZone masterPageZone, IUnitOfWork unitOfWork = null) { // If we don't have a unit of work in place, create one now so that we can rollback all changes in case of failure IUnitOfWork localUnitOfWork = unitOfWork == null?_unitOfWorkFactory.CreateUnitOfWork() : null; // Do the page update try { // Perform validation _masterPageValidator.ValidateUpdateZone(masterPageZone); // Prepare master page zone for update (e.g. set correct sort orders etc) PrepareMasterPageZone(masterPageZone); // Get zone as it currently stands MasterPageZone existingMasterPageZone = ReadZone(masterPageZone.TenantId, masterPageZone.MasterPageId, masterPageZone.MasterPageZoneId, unitOfWork ?? localUnitOfWork); // Check if master page zone admin type has changed? if (existingMasterPageZone.AdminType != masterPageZone.AdminType) { ProcessAdminTypeChange(existingMasterPageZone, masterPageZone, unitOfWork ?? localUnitOfWork); } // Action performed depends on admin type of master zone HashSet <long> removedElements = null; if (masterPageZone.AdminType == MasterPageZoneAdminType.Static || masterPageZone.AdminType == MasterPageZoneAdminType.Configurable) { // Get elements that may be removed removedElements = GetRemovedElementsForStaticOrConfigurableMasterPageZone(existingMasterPageZone, masterPageZone); } else if (masterPageZone.AdminType == MasterPageZoneAdminType.Editable) { // Get elements that may be removed and master page zone element identifiers that will be removed HashSet <long> removedMasterPageZoneElementIds = GetRemovedMasterPageZoneElementIds(existingMasterPageZone, masterPageZone); removedElements = GetRemovedElementsForEditableMasterPageZone(existingMasterPageZone, masterPageZone, removedMasterPageZoneElementIds, unitOfWork ?? localUnitOfWork); // Finally, remove page zone elements that reference the master page zone element identifiers that will be removed if (removedMasterPageZoneElementIds.Count > 0) { _masterPageRepository.DeletePageZoneElementsByMasterPageZoneElementIds(masterPageZone.TenantId, masterPageZone.MasterPageId, masterPageZone.MasterPageZoneId, removedMasterPageZoneElementIds.ToList(), unitOfWork ?? localUnitOfWork); } } // Create any new elements CreateNewElements(masterPageZone, unitOfWork ?? localUnitOfWork); // Do the update _masterPageRepository.UpdateZone(masterPageZone, unitOfWork ?? localUnitOfWork); // Post update actions if (masterPageZone.AdminType == MasterPageZoneAdminType.Editable) { // Get all of the page zones associated with the updated master page zone List <PageZone> pageZones = _pageRepository.ListPageZonesByMasterPageZoneId(masterPageZone.TenantId, masterPageZone.MasterPageId, masterPageZone.MasterPageZoneId, unitOfWork ?? localUnitOfWork); // Get identifiers of master page zone elements that are newly created MasterPageZone newMasterPageZone = ReadZone(masterPageZone.TenantId, masterPageZone.MasterPageId, masterPageZone.MasterPageZoneId, unitOfWork ?? localUnitOfWork); Dictionary <long, MasterPageZoneElement> newMasterPageZoneElements = GetNewMasterPageZoneElementIds(existingMasterPageZone, newMasterPageZone); // Construct new page zone elements (including copies of elements specified in new master page zone elements) List <PageZoneElement> pageZoneElements = new List <PageZoneElement>(); foreach (KeyValuePair <long, MasterPageZoneElement> kvp in newMasterPageZoneElements) { foreach (PageZone pageZone in pageZones) { long elementId = _elementService.Copy(kvp.Value.TenantId, kvp.Value.ElementId, kvp.Value.TenantId, kvp.Value.Element.ElementTypeId, unitOfWork ?? localUnitOfWork); PageZoneElement pageZoneElement = new PageZoneElement { TenantId = pageZone.TenantId, PageId = pageZone.PageId, PageZoneId = pageZone.PageZoneId, MasterPageId = kvp.Value.MasterPageId, MasterPageZoneId = kvp.Value.MasterPageZoneId, MasterPageZoneElementId = kvp.Value.MasterPageZoneElementId, SortOrder = null, ElementId = elementId }; pageZoneElements.Add(pageZoneElement); } } // Create page zone elements if (pageZoneElements.Count > 0) { _pageRepository.CreatePageZoneElements(masterPageZone.TenantId, pageZoneElements, unitOfWork ?? localUnitOfWork); } } // Remove elements if they are no longer in-use if (removedElements != null) { DeleteElementsThatAreNoLongerInUse(masterPageZone.TenantId, removedElements, unitOfWork ?? localUnitOfWork); } // Commit work if local unit of work in place if (localUnitOfWork != null) { localUnitOfWork.Commit(); } } catch (ValidationErrorException) { if (localUnitOfWork != null) { localUnitOfWork.Rollback(); } throw; } catch (Exception ex) { if (localUnitOfWork != null) { localUnitOfWork.Rollback(); } throw new ValidationErrorException(new ValidationError(null, ApplicationResource.UnexpectedErrorMessage), ex); } }