示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        public static bool HasMainPage(CMSDatabase db)
        {
            UsualPage usualPage = db.UsualPages.FirstOrDefault(up => up.RequestPath.Equals("/", StringComparison.Ordinal));

            if (usualPage == null)
            {
                return(false);
            }
            return(true);
        }
示例#4
0
        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()));
        }
示例#5
0
 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);
 }
示例#6
0
        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);
        }