From 76c38c7f9b5a255fa8b547e1a3a31788eb3b4512 Mon Sep 17 00:00:00 2001 From: Diatrex Date: Mon, 30 Mar 2020 13:22:22 +0300 Subject: [PATCH] #1151 Delete sub categories when deleting a parent category [delete all subcats] --- .../src/Category/CategoryRepository.php | 33 +++++++++++++++++++ .../Contract/CategoryRepositoryInterface.php | 2 ++ .../Controller/Admin/CategoryController.php | 1 - 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/addons/default/visiosoft/cats-module/src/Category/CategoryRepository.php b/addons/default/visiosoft/cats-module/src/Category/CategoryRepository.php index 6db0b6ae5..d9462ec2a 100644 --- a/addons/default/visiosoft/cats-module/src/Category/CategoryRepository.php +++ b/addons/default/visiosoft/cats-module/src/Category/CategoryRepository.php @@ -67,5 +67,38 @@ class CategoryRepository extends EntryRepository implements CategoryRepositoryIn public function DeleteCategories($id) { $this->model->find($id)->delete(); + + $this->deleteSubcategories($id); + } + + public function deleteSubcategories($id) + { + // Get all subcategories + $allSubcategories = array(); + $subcategories = $this->getSubCatById($id); + if (count($subcategories)) { + foreach ($subcategories as $subcategory) { + $allSubcategories[$subcategory->id] = ['id' => $subcategory->id, 'processed' => false]; + } + do { + $unprocessedCategories = array_filter($allSubcategories, function ($unprocessedCategory) { + return $unprocessedCategory['processed'] === false; + }); + foreach ($unprocessedCategories as $unprocessedCategory) { + $subcategories = $this->getSubCatById($unprocessedCategory['id']); + foreach ($subcategories as $subcategory) { + $allSubcategories[$subcategory->id] = ['id' => $subcategory->id, 'processed' => false]; + } + $allSubcategories[$unprocessedCategory['id']]['processed'] = true; + } + } while (count($unprocessedCategories)); + + // Delete all subcategories + $whereIn = array(); + foreach ($allSubcategories as $category) { + $whereIn[] = $category['id']; + } + $this->newQuery()->whereIn('id', $whereIn)->delete(); + } } } diff --git a/addons/default/visiosoft/cats-module/src/Category/Contract/CategoryRepositoryInterface.php b/addons/default/visiosoft/cats-module/src/Category/Contract/CategoryRepositoryInterface.php index 38d128225..00b82a02f 100644 --- a/addons/default/visiosoft/cats-module/src/Category/Contract/CategoryRepositoryInterface.php +++ b/addons/default/visiosoft/cats-module/src/Category/Contract/CategoryRepositoryInterface.php @@ -21,4 +21,6 @@ interface CategoryRepositoryInterface extends EntryRepositoryInterface public function getCategories(); public function DeleteCategories($id); + + public function deleteSubcategories($id); } diff --git a/addons/default/visiosoft/cats-module/src/Http/Controller/Admin/CategoryController.php b/addons/default/visiosoft/cats-module/src/Http/Controller/Admin/CategoryController.php index 59ed1653f..b8f501a3c 100644 --- a/addons/default/visiosoft/cats-module/src/Http/Controller/Admin/CategoryController.php +++ b/addons/default/visiosoft/cats-module/src/Http/Controller/Admin/CategoryController.php @@ -209,5 +209,4 @@ class CategoryController extends AdminController return redirect('admin/cats')->with('success', [$deletedCatsCount . ' categories has been deleted.']); } - }