/// <summary> /// Gets the page translation from page translations list, which is most compatible with node translation: /// if page translation exists, take page translations /// if page translation does not exist, take default language translation /// if default language translation does not exist, take node's data /// </summary> /// <param name="pageTranslations">The page translations.</param> /// <param name="nodeLanguage">The node language.</param> /// <param name="node">The node.</param> /// <returns></returns> private PageTranslationViewModel GetPageTranslation(IEnumerable<PageTranslationViewModel> pageTranslations, Guid nodeLanguage, SitemapNode node, Page page) { var pageTranslation = pageTranslations.FirstOrDefault(p => p.LanguageId == nodeLanguage); if (pageTranslation == null) { pageTranslation = pageTranslations.FirstOrDefault(p => !p.LanguageId.HasValue); } if (pageTranslation == null && page != null) { pageTranslation = new PageTranslationViewModel { Title = page.Title, PageUrl = page.PageUrl, PageUrlHash = page.PageUrlHash }; } if (pageTranslation == null) { pageTranslation = new PageTranslationViewModel { Title = node.Title, PageUrl = node.Url, PageUrlHash = node.UrlHash }; } return pageTranslation; }
/// <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); }); } } } } } }