File: /home/armgroup/libs/app/Http/Controllers/Admin/ProductController.php
<?php
namespace App\Http\Controllers\Admin;
use App\DataTables\ProductsDataTable;
use App\Http\Controllers\Controller;
use App\Models\Category;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class ProductController extends Controller
{
public function __construct()
{
$this->middleware('permission:manage products');
}
public function index(ProductsDataTable $dataTable)
{
$categories = Category::doesntHave('children')
->where('type', Product::class)
->select('id', 'name')
->get();
return $dataTable->render('admin.products.index', compact('categories'));
}
public function create(Request $request)
{
$request->validate([
'category' => ['required', Rule::exists('categories', 'id')->where(function ($query) {
return $query->where('type', Product::class);
})],
]);
$category = Category::findOrFail($request->category);
if ($category->children()->count()) {
return redirect()->route('admin.products.selectCategory');
}
return view('admin.products.create', compact('category'));
}
public function edit(Product $product)
{
if ($product->categories()->count() == 0) {
return redirect()->route('admin.products.selectCategory', ['product' => $product->id]);
}
return view('admin.products.edit', compact('product'));
}
public function destroy(Product $product)
{
DB::transaction(function () use ($product) {
$product->categories()->detach();
$product->comments()->delete();
$product->favorites()->delete();
$product->images()->delete();
$product->delete();
});
$this->doneMessage("{$product->name} حذف شد");
return back();
}
public function selectCategory(Request $request)
{
$request->validate(['product' => 'nullable|exists:products,id']);
$categories = Category::select('id', 'name', 'slug')
->withCount('activeChildren')
->whereNull('parent_id')
->where('type', Product::class)
->get();
$product = null;
if ($request->product) {
$product = Product::findOrFail($request->product);
}
return view('admin.products.select-category', compact('categories', 'product'));
}
}