Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        /// <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);
                                    });
                            }
                        }
                    }
                }
            }
        }