public IActionResult EditPage(int?itemID) { HttpContext.Items["pageID"] = AdminPanelPages.EditPage; if (!itemID.HasValue) { return(Redirect($"{HttpContext.Request.Path}?pageID={(int)AdminPanelPages.Pages}")); } UsualPage page = db.UsualPages.FirstOrDefault(up => up.ID == itemID.Value); if (page == null) { return(Redirect($"{HttpContext.Request.Path}?pageID={(int)AdminPanelPages.Pages}")); } // Получаем список ID страниц, которые зависят от текущей LinkedList <int> idList = PagesManagementFunctions.GetDependentPageIDs(db, page); // Для блокировки выбора страницы-родителя в представлении, если текущая страница - главная HttpContext.Items["isMainPage"] = page.RequestPath.Equals("/", StringComparison.Ordinal); PageModel model = PagesManagementFunctions.PageToPageModel(page); HttpContext.Items["UsualPages"] = db.UsualPages.AsNoTracking().Where(up => !idList.Contains(up.ID)).ToArray(); HttpContext.Items["Templates"] = db.Templates.AsNoTracking().ToArray(); return(View("Pages/EditPage", model)); }
public IActionResult UsualPage(UsualPage usualPage) { Template template = db.Templates.AsNoTracking().FirstOrDefault(t => t.ID == usualPage.TemplateId); if (template != null) { return(View(template.TemplatePath, usualPage)); } return(Content(usualPage.Content)); }
public static bool HasMainPage(CMSDatabase db) { UsualPage usualPage = db.UsualPages.FirstOrDefault(up => up.RequestPath.Equals("/", StringComparison.Ordinal)); if (usualPage == null) { return(false); } return(true); }
public IActionResult GetVisitorActions(int?visitorID) { if (!visitorID.HasValue) { return(Content(string.Empty)); } Visitor visitor = db.Visitors.AsNoTracking().FirstOrDefault(v => v.ID == visitorID.Value); if (visitor == null) { return(Content(string.Empty)); } List <VisitedPage> visitedPages = db.VisitedPages.AsNoTracking().Where(vp => vp.VisitorId == visitorID.Value).ToList(); visitedPages.Reverse(); IVisitorsLocalization localization = HttpContext.RequestServices.GetRequiredService <IVisitorsLocalization>(); StringBuilder contentBuilder = new StringBuilder(); if (visitedPages.Count > 0) { contentBuilder.Append($"<p>{localization.ActionsOfUser} {visitor.IPAdress}:</p>"); } foreach (var visitedPage in visitedPages) { switch (visitedPage.PageType) { case PageType.Usual: UsualPage usualPage = db.UsualPages.AsNoTracking().FirstOrDefault(up => up.ID == visitedPage.VisitedPageId); if (usualPage != null) { contentBuilder.Append($"<p>{localization.VisitedUsualPage}: <b>{usualPage.PageName} (ID-{usualPage.ID.ToString()})</b></p>\n"); } break; case PageType.Category: CategoryPage categoryPage = db.CategoryPages.AsNoTracking().FirstOrDefault(cp => cp.ID == visitedPage.VisitedPageId); if (categoryPage != null) { contentBuilder.Append($"<p>{localization.VisitedCategoryPage}: <b>{categoryPage.PageName} (ID-{categoryPage.ID.ToString()})</b></p>\n"); } break; case PageType.Product: ProductPage productPage = db.ProductPages.AsNoTracking().FirstOrDefault(pp => pp.ID == visitedPage.VisitedPageId); if (productPage != null) { contentBuilder.Append($"<p>{localization.VisitedProductPage}: <b>{productPage.PageName} (ID-{productPage.ID.ToString()})</b></p>\n"); } break; } } return(Content(contentBuilder.ToString())); }
public static LinkedList <int> GetDependentPageIDs(CMSDatabase db, UsualPage page, LinkedList <int> idList = null) { if (idList == null) { idList = new LinkedList <int>(); } UsualPage[] usualPages = usualPages = db.UsualPages.Where(up => up.PreviousPageID.HasValue && up.PreviousPageID == page.ID).ToArray(); foreach (var up in usualPages) { GetDependentPageIDs(db, up, idList); } idList.AddLast(page.ID); db.Entry(page).State = EntityState.Detached; return(idList); }
public static Page PageModelToPage(CMSDatabase db, PageModel model, HttpContext context) { if (model == null) { return(null); } if (!model.PageType.HasValue) { return(null); } if (string.IsNullOrEmpty(model.Title) || string.IsNullOrEmpty(model.PageName)) { return(null); } Page page = null; switch (model.PageType.Value) { case PageType.Usual: UsualPage usualPage = new UsualPage(); page = usualPage; // Главной страницей может быть только та страница, у которой стоит галка isMainPage на форме, // тип которой == PageType.Usual и которая не имеет страницы-родителя. // Так же в БД не должно быть страницы, Url которой == "/" if (model.IsMainPage && !model.PreviousPageID.HasValue && !HasMainPage(db)) { model.Alias = "index"; } // Если потенциальная главная страница не прошла какое-нибудь из условий, описанных выше, то // возвращаем пользователю сообщение об ошибке else if (model.IsMainPage) { return(null); } if (model.PreviousPageID.HasValue) { usualPage.PreviousPage = db.UsualPages.FirstOrDefault(up => up.ID == model.PreviousPageID.Value); if (usualPage.PreviousPage == null) { usualPage.PreviousPageID = null; } } if (usualPage.PreviousPage == null || usualPage.PreviousPage.RequestPath.Equals("/", StringComparison.Ordinal)) { usualPage.RequestPath = "/"; } else { usualPage.RequestPath = $"{usualPage.PreviousPage.RequestPath}/"; } break; case PageType.Category: // Т.к. категория не может быть главной страницей if (model.IsMainPage) { return(null); } CategoryPage categoryPage = new CategoryPage(); page = categoryPage; if (model.PreviousPageID.HasValue) { categoryPage.PreviousPage = db.UsualPages.FirstOrDefault(up => up.ID == model.PreviousPageID.Value); if (categoryPage.PreviousPage == null) { categoryPage.PreviousPageID = null; } } if (categoryPage.PreviousPage == null || categoryPage.PreviousPage.RequestPath.Equals("/", StringComparison.Ordinal)) { categoryPage.RequestPath = "/"; } else { categoryPage.RequestPath = $"{categoryPage.PreviousPage.RequestPath}/"; } break; case PageType.Product: // Т.к. продукт не может быть главной страницей if (model.IsMainPage) { return(null); } // Продукт всегда должен иметь страницу-родителя в виде категории if (!model.PreviousPageID.HasValue) { return(null); } ProductPage productPage = new ProductPage(); productPage.PreviousPage = db.CategoryPages.FirstOrDefault(cp => cp.ID == model.PreviousPageID); // ← if (productPage.PreviousPage == null) { return(null); } page = productPage; productPage.Price = model.Price; productPage.OldPrice = model.OldPrice; productPage.Barcode = model.Barcode; productPage.ShortDescription = model.ShortDescription; productPage.SpecialProduct = model.SpecialProduct; productPage.RequestPath = $"{productPage.PreviousPage.RequestPath}/"; productPage.LastUpdate = DateTime.Now; break; default: return(null); } page.Title = model.Title; page.PageName = model.PageName; // Если псевдоним страницы не указан, то переводим в транслит имя страницы // Если же псевдоним указан, то просто проверяем его на корректность if (string.IsNullOrEmpty(model.Alias)) { page.Alias = OtherFunctions.GetCorrectName(model.PageName, context); } else { page.Alias = OtherFunctions.GetCorrectName(model.Alias, context); } // Если псевдоним содержал только некорректные символы (то есть после проверок он равен null), // тогда возвращаем пользователю сообщение об ошибке if (string.IsNullOrEmpty(page.Alias)) { return(null); } if (page.RequestPath.Equals("/") && page.Alias.Equals("index", StringComparison.Ordinal) && !model.IsMainPage) { page.Alias = "ind"; } if (model.ID.HasValue) { page.ID = model.ID.Value; } if (!model.IsMainPage) { page.RequestPath += page.Alias; SetUniqueAliasName(db, page); } // Проверка на то, не присвоен ли запрещенный url текущей странице IHostingEnvironment env = context.RequestServices.GetRequiredService <IHostingEnvironment>(); for (LinkedListNode <string> it = env.GetForbiddenUrls().First; it != null; it = it.Next) { if (page.RequestPath.Equals(it.Value, StringComparison.OrdinalIgnoreCase)) { page.Alias += "_page"; page.RequestPath += "_page"; SetUniqueAliasName(db, page); it = env.GetForbiddenUrls().First; } } page.RequestPathHash = OtherFunctions.GetHashFromString(page.RequestPath); page.BreadcrumbsHtml = GetBreadcrumbsHTML(page); page.Content = model.Content; if (model.TemplateId.HasValue) { page.Template = db.Templates.FirstOrDefault(t => t.ID == model.TemplateId); } page.Published = model.Published; page.PageDescription = model.PageDescription; page.PageKeywords = model.PageKeywords; page.IsIndex = model.IsIndex; page.IsFollow = model.IsFollow; // Вставляем тег <p>, если стоит галка if (page is ProductPage pp && model.AddParagraphTag) { pp.Content = GetContentWithParagraphTag(pp.Content); pp.ShortDescription = GetContentWithParagraphTag(pp.ShortDescription); } return(page); }