/home2/mshostin/carnival.ms-hostingladz.com/app/Http/Controllers/Vendor/VendorProductController.php
<?php
namespace App\Http\Controllers\Vendor;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Product;
use App\Models\Category;
use App\Models\Subcategory;
use App\Models\Variant;
use App\Models\Feature;
use App\Models\ProductVariantImage;
use App\Models\ProductVariant;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use App\Services\ProductService;
use App\Traits\ImageTrait;
class VendorProductController extends Controller
{
use ImageTrait;
protected $productService;
public function __construct(ProductService $productService)
{
$this->productService = $productService;
}
public function index()
{
$categories = Category::where('type', 'ecommerce')->get();
$variants = Variant::all();
$products = Product::orderBy('id', 'DESC')->where('user_id', Auth::id())->get();
return view('dashboard.vendor.products.index', compact('products', 'variants', 'categories'));
}
public function create()
{
$variants = Variant::all();
$categories = Category::all();
// Get features for the first category or all features if no category selected
$firstCategory = $categories->first();
$features = $firstCategory ? Feature::where('category_id', $firstCategory->id)->where('status', 1)->get() : collect();
return view('dashboard.vendor.products.create', compact('categories', 'variants', 'features'));
}
// public function store(Request $request)
// {
// // dd($request->all());
// $request->validate([
// 'title' => 'required',
// 'category_id' => 'required',
// 'description' => 'required',
// 'old_price' => 'required',
// 'new_price' => 'required',
// 'status' => 'required',
// 'variant_id' => 'required|array',
// 'variant_id.*' => 'exists:variants,id',
// ]);
// $data = $request->all();
// // Check if variant_images are present in the request
// if ($request->hasFile('variant_images')) {
// $data['variant_images'] = $request->file('variant_images');
// } else {
// // If no variant images are uploaded, set an empty array
// $data['variant_images'] = [];
// }
// $product = $this->productService->createProduct($data);
// if ($product) {
// $products = Product::where('user_id', Auth::id())->get();
// $view = view('dashboard.vendor.products.table', compact('products'))->render();
// return response()->json(['message' => 'Product created successfully', 'table_html' => $view], 200);
// } else {
// return response()->json(['error' => 'Failed to create Product'], 500);
// }
// }
public function store(Request $request)
{
// dd($request->all());
$request->validate([
'title' => 'required',
'category_id' => 'required',
'description' => 'required',
'old_price' => 'required',
'new_price' => 'required',
'status' => 'required',
'variant_id' => 'required|array',
'variant_id.*' => 'exists:variants,id',
'features' => 'nullable|array',
'features.*' => 'exists:features,id',
]);
$data = $request->all();
$image = $this->uploadImage($request->file('image'), 'productImage');
$data['image'] = $image;
$product = $this->productService->createProduct($data);
if ($product) {
// Attach features to the product
if ($request->has('features')) {
$product->features()->attach($request->features);
}
$products = Product::where('user_id', Auth::id())->get();
$view = view('dashboard.vendor.products.table', compact('products'))->render();
return response()->json(['message' => 'Product created successfully', 'table_html' => $view], 200);
} else {
return response()->json(['error' => 'Failed to create Product'], 500);
}
}
public function show($id)
{
$product = Product::findOrFail($id);
return view('dashboard.vendor.products.show', compact('product'));
}
public function edit($id)
{
$product = Product::with('category', 'product_variant', 'subcategory', 'features')->findOrFail($id);
$categories = Category::where('type', 'ecommerce')->get();
// $variants = Variant::all();
$variants = Variant::where('category_id', $product->category_id)->get();
$selectedVariants = $product->variants->pluck('id')->toArray();
$subcat = Subcategory::where('category_id', $product->category_id)->get();
// Get features for the product's category
$features = Feature::where('category_id', $product->category_id)->where('status', 1)->get();
$selectedFeatures = $product->features->pluck('id')->toArray();
return view('dashboard.vendor.products.edit', compact('product', 'categories', 'variants', 'subcat', 'selectedVariants', 'features', 'selectedFeatures'));
}
public function update(Request $request, $id)
{
$request->validate([
'title' => 'required',
'category_id' => 'required',
'description' => 'required',
'old_price' => 'required',
'new_price' => 'required',
'status' => 'required',
'features' => 'nullable|array',
'features.*' => 'exists:features,id',
// 'variant_id' => 'required|array',
// 'variant_id.*' => 'exists:variants,id',
]);
$product = Product::findOrFail($id);
// Prepare data for update
$data = $request->all();
// Check if variant_images are present in the request
if ($request->hasFile('variant_images')) {
$data['variant_images'] = $request->file('variant_images');
} else {
// If no variant images are uploaded, set an empty array
$data['variant_images'] = [];
}
// Update product attributes and handle variants
$updatedProduct = $this->productService->updateProduct($product, $data);
if ($updatedProduct) {
// Sync features with the product
if ($request->has('features')) {
$product->features()->sync($request->features);
} else {
$product->features()->detach();
}
$products = Product::where('user_id', Auth::id())->get();
$view = view('dashboard.vendor.products.table', compact('products'))->render();
return response()->json(['message' => 'Product updated successfully', 'table_html' => $view], 200);
} else {
return response()->json(['error' => 'Failed to update Product'], 500);
}
// return redirect()->route('products.index')->with('success', 'Product updated successfully.');
}
public function destroy($id)
{
$product = Product::findOrFail($id);
$product->delete();
return redirect()->route('products.index')->with('success', 'Product deleted successfully.');
}
public function getsubCategories($categoryId)
{
// Fetch subcategories based on the provided package ID
$data['subcategories'] = Subcategory::where('category_id', $categoryId)->get();
$data['varients'] = Variant::where('category_id', $categoryId)->get();
// Return subcategories as JSON response
return response()->json($data);
}
public function getFeaturesByCategory($categoryId)
{
$features = Feature::where('category_id', $categoryId)->where('status', 1)->get();
return response()->json($features);
}
}