File: /home/armgroup/libs/app/Http/Controllers/Admin/CategoryController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class CategoryController extends Controller
{
public function __construct()
{
$this->middleware('permission:manage categories');
}
public function index()
{
return view('admin.categories.index');
}
public function create(Request $request)
{
$type = categoryExists($request->type);
$categories = Category::where('type', $type['className'])->select('id', 'name')->get();
$parent = $request->parent;
if ($parent && ! in_array($parent, $categories->pluck('id')->toArray())) {
abort(404);
}
return view('admin.categories.create', compact('categories', 'type', 'parent'));
}
public function edit(Category $category)
{
$type = $category->getCategoryType();
$categories = Category::where('type', $category->type)
->where('id', '<>', $category->id)
->select('id', 'name')
->get();
return view('admin.categories.edit', compact('category', 'categories', 'type'));
}
public function destroy(Category $category)
{
DB::transaction(function () use ($category) {
$this->clearProducts($category->getAllChildren()->push($category));
$category->delete();
});
$this->removeCachedCategories();
$this->doneMessage("دستهبندی $category->name با موفقیت حذف شد");
return back();
}
private function clearProducts($categories)
{
foreach ($categories as $category) {
$products = $category->products();
if ($products->count()) {
$products->update(['status' => false]);
$product_ids = $products->pluck('id')->toArray();
DB::table('attribute_product')->whereIn('product_id', $product_ids)->delete();
DB::table('option_product')->whereIn('product_id', $product_ids)->delete();
}
}
}
public function showCategories($slug)
{
$type = categoryExists($slug);
$categories = Category::where('type', $type['className'])
->whereNull('parent_id')
->select('id', 'name', 'slug', 'status')
->get();
return view('admin.categories.showCategories', compact('categories', 'type'));
}
public function ajax($id)
{
if (! request()->ajax()) {
abort(404);
}
$category = Category::with('children')->findOrFail($id);
$data = view('admin.categories.ajax', [
'categories' => $category->children,
'name' => $category->name,
'level' => request('level') + 1,
'typeSlug' => request('typeSlug'),
'parent' => $category->id,
])->render();
return response()->json($data);
}
private function removeCachedCategories()
{
Cache::forget('product-categories');
Cache::forget('article-categories');
}
}