Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo 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);
                                    });
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        /// <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;
                }
            }
        }
Exemplo n.º 4
0
        /// <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);
            }
        }
Exemplo n.º 5
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);
                                });
                            }
                        }
                    }
                }
            }
        }