public static void AddProduct(CMSDatabase db, PageModel model, int?previousPageID, HttpContext context, out bool successfullyCompleted) { if (model == null) { successfullyCompleted = false; return; } model.PageType = PageType.Product; model.PreviousPageID = previousPageID; ProductPage productPage = PagesManagementFunctions.PageModelToPage(db, model, context) as ProductPage; if (productPage == null) { successfullyCompleted = false; return; } ++productPage.PreviousPage.ProductsCount; productPage.PreviousPage.LastProductTemplate = productPage.Template; db.ProductPages.Add(productPage); db.SaveChanges(); model.ID = productPage.ID; successfullyCompleted = true; LogManagementFunctions.AddAdminPanelLog( db: db, context: context, info: $"{productPage.PageName} (ID-{productPage.ID.ToString()}): {(context.Items["LogLocalization"] as IAdminPanelLogLocalization)?.ProductAdded}" ); }
public static void AddPage(CMSDatabase db, PageModel model, HttpContext context, out bool successfullyCompleted) { Page page = PagesManagementFunctions.PageModelToPage(db, model, context); if (page == null) { successfullyCompleted = false; return; } db.Add(page); db.SaveChanges(); model.ID = page.ID; successfullyCompleted = true; LogManagementFunctions.AddAdminPanelLog( db: db, context: context, info: $"{page.PageName} (ID-{page.ID.ToString()}): " + (page is UsualPage ? (context.Items["LogLocalization"] as IAdminPanelLogLocalization)?.PageAdded : (context.Items["LogLocalization"] as IAdminPanelLogLocalization)?.CategoryAdded) ); }
public static void EditProduct(CMSDatabase db, PageModel model, int?productID, HttpContext context, out bool successfullyCompleted) { if (model == null || !productID.HasValue) { successfullyCompleted = false; return; } model.PageType = PageType.Product; ProductPage editableProduct = db.ProductPages.AsNoTracking().FirstOrDefault(pp => pp.ID == productID.Value); if (editableProduct == null) { successfullyCompleted = false; return; } model.ID = editableProduct.ID; model.PreviousPageID = editableProduct.PreviousPageID; ProductPage editedProduct = PagesManagementFunctions.PageModelToPage(db, model, context) as ProductPage; if (editedProduct == null) { successfullyCompleted = false; return; } editedProduct.PreviousPage.LastProductTemplate = editedProduct.Template; db.ProductPages.Update(editedProduct); db.SaveChanges(); // Изменяем имена изображений продукта, если изменился псевдоним страницы if (!editableProduct.Alias.Equals(editedProduct.Alias, StringComparison.Ordinal)) { IHostingEnvironment env = context.RequestServices.GetRequiredService <IHostingEnvironment>(); string pathToImages = $"{env.GetProductsImagesFolderFullPath()}{editedProduct.ID}/"; if (Directory.Exists(pathToImages)) { string oldName = editableProduct.Alias; string newName = editedProduct.Alias; Regex imageChecker = new Regex($"{oldName}(_\\d+)?.jpg$"); string[] oldImagesNames = Directory.GetFiles(pathToImages, $"*{oldName}*.jpg"); string[] imagePaths = (from img in oldImagesNames where imageChecker.IsMatch(img) select img).ToArray(); // Можно было бы заменить разом имена всем изображениям через перебор в цикле, но // проблема в том, что путь до папки с изображениями может содержать старое название // изображения. В итоге замена имени через File.Move(старый_путь, старый_путь.Replace(oldName, newName)) // может привести к переносу изображений в другую директорию. LinkedList <KeyValuePair <string, string> > renameErrors = new LinkedList <KeyValuePair <string, string> >(); for (int i = 0; i < imagePaths.Length; ++i) { string oldImageName = imagePaths[i].Substring(pathToImages.Length, imagePaths[i].Length - pathToImages.Length - 4); string newImageName = oldImageName.Replace(oldName, newName); try { ImagesManagementFunctions.RenameImageAndDependencies( db: db, env: env, pathToImages: pathToImages, oldImageName: oldImageName, newImageName: newImageName, imageExtension: ".jpg", saveChangesInDB: false ); } catch (IOException) { // Добавляем все ошибки переименования в список для второй попытки. Например, старое название было // "Название" и мы переименовали страницу на "Название_2", но у товара было несколько картинок, // соответственно при ренейминге будет попытка присвоить первой картинке название Название_2, что приведет // к ошибке, т.к. картинка с таким названием уже существует. Поэтому после первого прохода сделаем второй, // что поможет избежать этих ошибок переименования renameErrors.AddLast(new KeyValuePair <string, string>(oldImageName, newImageName)); } } if (renameErrors.Count > 0) { foreach (var e in renameErrors) { ImagesManagementFunctions.RenameImageAndDependencies( db: db, env: env, pathToImages: pathToImages, oldImageName: e.Key, newImageName: e.Value, imageExtension: ".jpg", saveChangesInDB: false ); } } db.SaveChanges(); } } successfullyCompleted = true; LogManagementFunctions.AddAdminPanelLog( db: db, context: context, info: $"{editableProduct.PageName} (ID-{editableProduct.ID.ToString()}): {(context.Items["LogLocalization"] as IAdminPanelLogLocalization)?.ProductEdited}" ); }
public static void EditPage(CMSDatabase db, Model model, HttpContext context, out bool successfullyCompleted) { if (!model.itemID.HasValue || model.PageModel == null || !model.PageType.HasValue) { successfullyCompleted = false; return; } model.PageModel.PageType = model.PageType; bool isMainPage = false; model.PageModel.IsMainPage = false; Page editablePage = null; switch (model.PageModel.PageType) { case PageType.Usual: editablePage = db.UsualPages.AsNoTracking().FirstOrDefault(up => up.ID == model.itemID); if (editablePage == null) { successfullyCompleted = false; return; } model.PageModel.ID = editablePage.ID; isMainPage = editablePage.RequestPath.Equals("/", StringComparison.Ordinal); break; case PageType.Category: editablePage = db.CategoryPages.AsNoTracking().FirstOrDefault(cp => cp.ID == model.itemID); if (editablePage == null) { successfullyCompleted = false; return; } model.PageModel.ID = editablePage.ID; break; default: successfullyCompleted = false; return; } model.PageModel.PageType = model.PageModel.PageType.Value; Page editedPage = PagesManagementFunctions.PageModelToPage(db, model.PageModel, context); if (editedPage != null) { if (editedPage is UsualPage up) { if (isMainPage) { up.Alias = "index"; up.RequestPath = "/"; up.RequestPathHash = OtherFunctions.GetHashFromString(up.RequestPath); up.PreviousPage = null; } // Если родителем страницы является сама страница или зависимая страница, то возвращаем сообщение об ошибке if (up.PreviousPage != null && PagesManagementFunctions.GetDependentPageIDs(db, up).Contains(up.PreviousPage.ID)) { successfullyCompleted = false; return; } } else if (editedPage is CategoryPage cp) { cp.ProductsCount = (editablePage as CategoryPage).ProductsCount; cp.LastProductTemplateID = (editablePage as CategoryPage).LastProductTemplateID; } } else { successfullyCompleted = false; return; } db.Update(editedPage); // Обновляем все зависимые страницы, если изменилось имя страницы и/или url страницы if (!editablePage.PageName.Equals(editedPage.PageName, StringComparison.InvariantCulture) || !editablePage.RequestPath.Equals(editedPage.RequestPath, StringComparison.Ordinal)) { if (editedPage is UsualPage) { List <UsualPage> usualPages = db.UsualPages.Where(p => p.PreviousPageID == editedPage.ID).ToList(); List <CategoryPage> categoryPages = db.CategoryPages.Where(p => p.PreviousPageID == editedPage.ID).ToList(); foreach (var u_page in usualPages) { RefreshPageAndDependencies(db, u_page); } foreach (var c_page in categoryPages) { RefreshPageAndDependencies(db, c_page); } } if (editedPage is CategoryPage) { List <ProductPage> productPages = db.ProductPages.Where(p => p.PreviousPageID == editedPage.ID).ToList(); foreach (var p_page in productPages) { RefreshPageAndDependencies(db, p_page); } } } db.SaveChanges(); successfullyCompleted = true; LogManagementFunctions.AddAdminPanelLog( db: db, context: context, info: $"{editablePage.PageName} (ID-{editablePage.ID.ToString()}): " + (editablePage is UsualPage ? (context.Items["LogLocalization"] as IAdminPanelLogLocalization)?.PageEdited : (context.Items["LogLocalization"] as IAdminPanelLogLocalization)?.CategoryEdited) ); }