/// <summary> /// Restores the nodes. /// </summary> /// <param name="sitemap">The sitemap.</param> /// <param name="parentNode">The parent node.</param> /// <param name="childNodes">The child nodes.</param> private void RestoreTheNodes(Sitemap sitemap, SitemapNode parentNode, IEnumerable <SitemapNode> childNodes) { foreach (var node in childNodes) { var restoredNode = new SitemapNode { Sitemap = sitemap, ParentNode = parentNode, Title = node.Title, UsePageTitleAsNodeTitle = node.UsePageTitleAsNodeTitle, Macro = node.Macro, }; if (node.Page != null) { var node1 = node; var page = repository.FirstOrDefault <PageProperties>(properties => properties.Id == node1.Page.Id && !properties.IsDeleted); restoredNode.Page = page; restoredNode.Url = page != null ? null : node.Url; restoredNode.UrlHash = page != null ? null : node.UrlHash; } else { restoredNode.Page = null; restoredNode.Url = node.Url; restoredNode.UrlHash = node.UrlHash; } repository.Save(restoredNode); foreach (var translation in node.Translations) { var translation1 = translation; var language = repository.FirstOrDefault <Language>(l => l.Id == translation1.Language.Id && !l.IsDeleted); if (language == null) { continue; } var restoredTranslation = new SitemapNodeTranslation { Node = restoredNode, Language = language, Title = translation.Title, UsePageTitleAsNodeTitle = translation.UsePageTitleAsNodeTitle, Macro = translation.Macro }; if (restoredNode.Page == null) { restoredTranslation.Url = restoredNode.Url; restoredTranslation.UrlHash = restoredNode.Url.UrlHash(); } repository.Save(restoredTranslation); } RestoreTheNodes(sitemap, restoredNode, node.ChildNodes); } }
/// <summary> /// Updates page sitemap nodes. /// </summary> private void UpdateSitemapNodes(DeletePageViewModel model, PageProperties page, IList<SitemapNode> sitemapNodes, Dictionary<Sitemap, bool> sitemaps, List<Language> languages, IList<SitemapNode> updatedNodes, IList<SitemapNode> deletedNodes) { if (sitemapNodes != null) { // Archive sitemaps before update. sitemaps.Select(pair => pair.Key).ToList().ForEach(sitemap => sitemapService.ArchiveSitemap(sitemap.Id)); foreach (var node in sitemapNodes) { if (!node.IsDeleted) { if (model.UpdateSitemap && sitemaps[node.Sitemap]) { // Delete sitemap node. sitemapService.DeleteNode(node, ref deletedNodes); } else { // Unlink sitemap node. if (node.Page != null && node.Page.Id == page.Id) { node.Page = null; node.Title = node.UsePageTitleAsNodeTitle ? page.Title : node.Title; node.Url = page.PageUrl; node.UrlHash = page.PageUrlHash; repository.Save(node); updatedNodes.Add(node); IEnumerable<PageTranslationViewModel> pageTranslations; if (page.LanguageGroupIdentifier.HasValue && !page.LanguageGroupIdentifier.Value.HasDefaultValue()) { pageTranslations = GetPageTranslations(page.LanguageGroupIdentifier.Value); } else { pageTranslations = new PageTranslationViewModel[0]; } // Assigned node URL and title is taken from default language, if such exists. var defaultPageTranslation = pageTranslations.FirstOrDefault(p => !p.LanguageId.HasValue); if (defaultPageTranslation != null) { node.Url = defaultPageTranslation.PageUrl; node.UrlHash = defaultPageTranslation.PageUrlHash; if (node.UsePageTitleAsNodeTitle) { node.Title = defaultPageTranslation.Title; } } // Update sitemap node translations. if (node.Translations == null) { node.Translations = new List<SitemapNodeTranslation>(); } node.Translations.ForEach( t => { var pageTranslation = GetPageTranslation(pageTranslations, t.Language.Id, node, page); if (t.UsePageTitleAsNodeTitle) { t.Title = pageTranslation.Title; } t.UsePageTitleAsNodeTitle = false; t.Url = pageTranslation.PageUrl; t.UrlHash = pageTranslation.PageUrlHash; }); // Create non-existing node translations for each language. languages.Where(language => node.Translations.All(nt => nt.Language.Id != language.Id)) .ForEach(language => { var pageTranslation = GetPageTranslation(pageTranslations, language.Id, node, page); var nodeTranslation = new SitemapNodeTranslation { Language = language, Node = node, UsePageTitleAsNodeTitle = false, Title = pageTranslation.Title, Url = pageTranslation.PageUrl, UrlHash = pageTranslation.PageUrlHash }; node.Translations.Add(nodeTranslation); }); } } } } } }
/// <summary> /// Saves the translations. /// </summary> /// <param name="translationUpdatedInDb"></param> /// <param name="sitemapNode">The sitemap node.</param> /// <param name="node">The node.</param> /// <param name="translationList"></param> private void SaveTranslations(out bool translationUpdatedInDb, SitemapNode sitemapNode, SitemapNodeViewModel node, List <SitemapNodeTranslation> translationList) { translationUpdatedInDb = false; var translations = translationList == null ? Repository.AsQueryable <SitemapNodeTranslation>().Where(translation => translation.Node.Id == sitemapNode.Id).ToList() : translationList.Where(translation => translation.Node.Id == sitemapNode.Id).ToList(); foreach (var model in node.Translations) { var saveIt = false; var translation = translations.FirstOrDefault(t => t.Id == model.Id); if (translation == null) { translation = translations.FirstOrDefault(t => t.Language.Id == model.LanguageId); if (translation != null) { throw new InvalidDataException(string.Format("Node {0} translation to language {1} already exists.", sitemapNode.Id, model.LanguageId)); } saveIt = true; translation = new SitemapNodeTranslation { Node = sitemapNode, Language = Repository.AsProxy <Language>(model.LanguageId), Title = model.Title, Macro = CmsConfiguration.EnableMacros ? model.Macro : null, UsePageTitleAsNodeTitle = model.UsePageTitleAsNodeTitle }; if (sitemapNode.Page == null) { translation.UsePageTitleAsNodeTitle = false; translation.Url = model.Url; translation.UrlHash = model.Url.UrlHash(); } } else { if (translation.Version != model.Version) { throw new ConcurrentDataException(translation); } if (translation.Title != model.Title) { saveIt = true; translation.Title = model.Title; } if (CmsConfiguration.EnableMacros && translation.Macro != model.Macro) { saveIt = true; translation.Macro = model.Macro; } if (sitemapNode.Page == null) { if (translation.Url != model.Url || translation.UsePageTitleAsNodeTitle) { saveIt = true; translation.UsePageTitleAsNodeTitle = false; translation.Url = model.Url; translation.UrlHash = model.Url.UrlHash(); } } else { if (translation.Url != null || translation.UrlHash != null) { saveIt = true; translation.Url = null; translation.UrlHash = null; } if (translation.UsePageTitleAsNodeTitle != model.UsePageTitleAsNodeTitle) { saveIt = true; translation.UsePageTitleAsNodeTitle = model.UsePageTitleAsNodeTitle; } } } if (saveIt) { Repository.Save(translation); translationUpdatedInDb = true; } } }
/// <summary> /// Restores the nodes. /// </summary> /// <param name="sitemap">The sitemap.</param> /// <param name="parentNode">The parent node.</param> /// <param name="childNodes">The child nodes.</param> private void RestoreTheNodes(Sitemap sitemap, SitemapNode parentNode, IEnumerable<SitemapNode> childNodes) { foreach (var node in childNodes) { var restoredNode = new SitemapNode { Sitemap = sitemap, ParentNode = parentNode, Title = node.Title, UsePageTitleAsNodeTitle = node.UsePageTitleAsNodeTitle, Macro = node.Macro, }; if (node.Page != null) { var node1 = node; var page = repository.FirstOrDefault<PageProperties>(properties => properties.Id == node1.Page.Id && !properties.IsDeleted); restoredNode.Page = page; restoredNode.Url = page != null ? null : node.Url; restoredNode.UrlHash = page != null ? null : node.UrlHash; } else { restoredNode.Page = null; restoredNode.Url = node.Url; restoredNode.UrlHash = node.UrlHash; } repository.Save(restoredNode); foreach (var translation in node.Translations) { var translation1 = translation; var language = repository.FirstOrDefault<Language>(l => l.Id == translation1.Language.Id && !l.IsDeleted); if (language == null) { continue; } var restoredTranslation = new SitemapNodeTranslation { Node = restoredNode, Language = language, Title = translation.Title, UsePageTitleAsNodeTitle = translation.UsePageTitleAsNodeTitle, Macro = translation.Macro }; if (restoredNode.Page == null) { restoredTranslation.Url = restoredNode.Url; restoredTranslation.UrlHash = restoredNode.Url.UrlHash(); } repository.Save(restoredTranslation); } RestoreTheNodes(sitemap, restoredNode, node.ChildNodes); } }
/// <summary> /// Updates page sitemap nodes. /// </summary> private void UpdateSitemapNodes(DeletePageViewModel model, PageProperties page, IList <SitemapNode> sitemapNodes, Dictionary <Sitemap, bool> sitemaps, List <Language> languages, IList <SitemapNode> updatedNodes, IList <SitemapNode> deletedNodes) { if (sitemapNodes != null) { // Archive sitemaps before update. sitemaps.Select(pair => pair.Key).ToList().ForEach(sitemap => sitemapService.ArchiveSitemap(sitemap.Id)); foreach (var node in sitemapNodes) { if (!node.IsDeleted) { if (model.UpdateSitemap && sitemaps[node.Sitemap]) { // Delete sitemap node. sitemapService.DeleteNode(node, ref deletedNodes); } else { // Unlink sitemap node. if (node.Page != null && node.Page.Id == page.Id) { node.Page = null; node.Title = node.UsePageTitleAsNodeTitle ? page.Title : node.Title; node.Url = page.PageUrl; node.UrlHash = page.PageUrlHash; repository.Save(node); updatedNodes.Add(node); IEnumerable <PageTranslationViewModel> pageTranslations; if (page.LanguageGroupIdentifier.HasValue && !page.LanguageGroupIdentifier.Value.HasDefaultValue()) { pageTranslations = GetPageTranslations(page.LanguageGroupIdentifier.Value); } else { pageTranslations = new PageTranslationViewModel[0]; } // Assigned node URL and title is taken from default language, if such exists. var defaultPageTranslation = pageTranslations.FirstOrDefault(p => !p.LanguageId.HasValue); if (defaultPageTranslation != null) { node.Url = defaultPageTranslation.PageUrl; node.UrlHash = defaultPageTranslation.PageUrlHash; if (node.UsePageTitleAsNodeTitle) { node.Title = defaultPageTranslation.Title; } } // Update sitemap node translations. if (node.Translations == null) { node.Translations = new List <SitemapNodeTranslation>(); } node.Translations.ForEach( t => { var pageTranslation = GetPageTranslation(pageTranslations, t.Language.Id, node, page); if (t.UsePageTitleAsNodeTitle) { t.Title = pageTranslation.Title; } t.UsePageTitleAsNodeTitle = false; t.Url = pageTranslation.PageUrl; t.UrlHash = pageTranslation.PageUrlHash; }); // Create non-existing node translations for each language. languages.Where(language => node.Translations.All(nt => nt.Language.Id != language.Id)) .ForEach(language => { var pageTranslation = GetPageTranslation(pageTranslations, language.Id, node, page); var nodeTranslation = new SitemapNodeTranslation { Language = language, Node = node, UsePageTitleAsNodeTitle = false, Title = pageTranslation.Title, Url = pageTranslation.PageUrl, UrlHash = pageTranslation.PageUrlHash }; node.Translations.Add(nodeTranslation); }); } } } } } }