D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
home
/
forge
/
re-viewers.com
/
app
/
Http
/
Controllers
/
Filename :
FrontendController.php
back
Copy
<?php namespace App\Http\Controllers; use App\Models\Brand; use App\Models\Category; use App\Models\Comment; use App\Models\Rating; use App\Models\Review; use App\Models\Setting; use App\Models\Slider; use App\Models\ContactList; use App\Models\ContactSub; use Illuminate\Http\Request; class FrontendController extends Controller { // 🏠 الصفحة الرئيسية public function index(Request $request) { // 🔹 السلايدر $sliders = Slider::where('status', 1) ->orderBy('id', 'desc') ->take(5) ->get(); // 🔹 التصنيفات $categories = Category::where('status', 1) ->whereNull('parent_id') ->with(['reviews' => function ($q) { $q->presentable() ->orderBy('rate_avg', 'desc') ->orderBy('total_views', 'desc') ->take(12); }]) ->orderBy('id', 'desc') ->get(); // 🔹 أحدث المنتجات $products = Review::presentable() ->orderBy('created_at', 'desc') ->orderBy('id', 'desc') ->paginate(9); // ✅ دعم التقييم للمستخدم المسجل أو الزائر foreach ($products as $product) { $product->user_rating = Rating::where('product_id', $product->id) ->when(auth()->check(), fn($q) => $q->where('user_id', auth()->id())) ->when(!auth()->check(), fn($q) => $q->where('ip_address', $request->ip())) ->value('rating'); } // ✅ نفس المنطق داخل الكاتيجوريز foreach ($categories as $category) { foreach ($category->reviews as $review) { $review->user_rating = Rating::where('product_id', $review->id) ->when(auth()->check(), fn($q) => $q->where('user_id', auth()->id())) ->when(!auth()->check(), fn($q) => $q->where('ip_address', $request->ip())) ->value('rating'); } } return view('frontend.pages.index', compact('sliders', 'categories', 'products')); } // 🏷️ العلامات التجارية public function brands() { $brands = Brand::orderBy('brand_name')->get(); return view('frontend.pages.brands.index', compact('brands')); } public function brandProducts(Request $request, $brand_id) { // 🔹 جلب كل منتجات العلامة التجارية $products = Review::where('brand_id', $brand_id) ->where('status', 1) ->orderBy('created_at', 'desc') ->paginate(30); // ✅ جلب تقييم المستخدم الحالي أو الزائر حسب IP foreach ($products as $product) { $product->user_rating = Rating::where('product_id', $product->id) ->when(auth()->check(), fn($q) => $q->where('user_id', auth()->id())) ->when(!auth()->check(), fn($q) => $q->where('ip_address', $request->ip())) ->value('rating'); } return view('frontend.pages.brands.products', compact('products')); } // 📂 تصنيف المنتجات public function category($id) { $category = Category::with('children.children')->findOrFail($id); $categoryIds = $this->getAllCategoryIds($category); $products = Review::where(function ($q) use ($categoryIds) { $q->whereIn('category_id', $categoryIds) ->orWhereIn('subcategory_id', $categoryIds) ->orWhereIn('subsubcategory_id', $categoryIds); })->where('status', 1)->paginate(12); $subcategories = $category->children()->where('status', 1)->get(); foreach ($products as $product) { $product->user_rating = auth()->check() ? Rating::where('product_id', $product->id) ->where('user_id', auth()->id()) ->value('rating') : null; } return view('frontend.pages.category.index', compact('category', 'products', 'subcategories')); } // 🌀 دالة داخلية لجلب جميع الـ IDs للأقسام الفرعية private function getAllCategoryIds($category) { $ids = collect([$category->id]); foreach ($category->children as $child) { $ids = $ids->merge($this->getAllCategoryIds($child)); } return $ids->toArray(); } // 🛍️ صفحة المنتج public function product($id) { $product = Review::findOrFail($id); // زيادة عدد المشاهدات $viewKey = 'product_viewed_' . $product->id; if (!session()->has($viewKey)) { $product->increment('total_views'); session()->put($viewKey, true); } // تقييم المستخدم الحالي $userRating = auth()->check() ? Rating::where('product_id', $product->id) ->where('user_id', auth()->id()) ->value('rating') : null; // منتجات مشابهة $relatedProducts = Review::where('category_id', $product->category_id) ->where('id', '!=', $product->id) ->where('status', 1) ->latest() ->take(6) ->get(); foreach ($relatedProducts as $related) { $related->user_rating = auth()->check() ? Rating::where('product_id', $related->id) ->where('user_id', auth()->id()) ->value('rating') : null; } // الأقسام الخاصة بالـ Subnavbar $category = Category::find($product->subsubcategory_id ?? $product->subcategory_id ?? $product->category_id); if ($category) { if (is_null($category->parent_id)) { $subcategories = $category->children()->where('status', 1)->get(); $subsubcategories = collect(); } elseif ($category->parent && is_null($category->parent->parent_id)) { $subcategories = $category->children()->where('status', 1)->get(); $subsubcategories = collect(); } else { $subcategories = collect(); $subsubcategories = Category::where('parent_id', $category->parent_id) ->where('status', 1) ->get(); } } else { $subcategories = collect(); $subsubcategories = collect(); } $comments = Comment::where('product_id', $product->id)->latest()->get(); return view('frontend.pages.products.index', compact( 'product', 'relatedProducts', 'userRating', 'comments', 'subcategories', 'subsubcategories', 'category' )); } // 💬 حفظ التعليق public function storeComment(Request $request, $id) { $request->validate([ 'comment_text' => 'required|string|min:3', 'email' => 'nullable|email|max:150', ]); $product = Review::findOrFail($id); Comment::create([ 'product_id' => $product->id, 'user_id' => auth()->check() ? auth()->id() : null, 'email' => auth()->check() ? auth()->user()->email : $request->email, 'comment_text' => $request->comment_text, ]); return redirect()->route('product.show', $product->id) ->with('success', 'تم إضافة تعليقك بنجاح ✅'); } // ⭐ التقييم public function rate(Request $request, $id) { $request->validate([ 'rating' => 'required|integer|min:1|max:5', ]); if (!auth()->check()) { return response()->json([ 'status' => 'error', 'message' => 'يرجى تسجيل الدخول لتقييم المنتج 🔒', ], 403); } $product = Review::findOrFail($id); $userId = auth()->id(); $existing = Rating::where('product_id', $product->id) ->where('user_id', $userId) ->first(); if ($existing) { $existing->update(['rating' => $request->rating]); } else { Rating::create([ 'product_id' => $product->id, 'user_id' => $userId, 'rating' => $request->rating, ]); } $product->total_rate = Rating::where('product_id', $product->id)->sum('rating'); $count = Rating::where('product_id', $product->id)->count(); $product->rate_avg = round($product->total_rate / $count, 1); $product->featured = $product->rate_avg >= 4 ? 1 : 0; $product->save(); return response()->json([ 'status' => 'success', 'message' => $existing ? 'تم تعديل تقييمك بنجاح ✅' : 'شكراً! تم تسجيل تقييمك ✅', 'rate_avg' => $product->rate_avg, 'total_rate' => $product->total_rate, ]); } // 📞 صفحة تواصل معنا public function contact() { $subjects = ContactSub::all(); return view('frontend.pages.contact.index', compact('subjects')); } public function sendContact(Request $request) { $request->validate([ 'contact_name' => 'required|string|max:255', 'contact_email' => 'required|email', 'contact_subject'=> 'required|integer', 'contact_msg' => 'required|string|min:10', ]); ContactList::create($request->only(['contact_name','contact_email','contact_subject','contact_msg'])); return redirect()->route('contact')->with('success', 'شكراً! تم إرسال رسالتك بنجاح ✅'); } // ℹ️ صفحات ثابتة public function about() { $settings = Setting::first(); return view('frontend.pages.about.index', compact('settings')); } public function faq() { $settings = Setting::first(); return view('frontend.pages.faq.index', compact('settings')); } public function terms() { $settings = Setting::first(); return view('frontend.pages.terms.index', compact('settings')); } public function privacy() { $settings = Setting::first(); return view('frontend.pages.privacy.index', compact('settings')); } // 🆕 أحدث المنتجات public function latestProducts() { $products = Review::where('status', 1) ->orderBy('created_at', 'desc') ->paginate(9); foreach ($products as $product) { $product->user_rating = auth()->check() ? Rating::where('product_id', $product->id) ->where('user_id', auth()->id()) ->value('rating') : null; } return view('frontend.pages.products.list', compact('products')) ->with('title', 'أحدث المنتجات'); } // 🏆 الأكثر تقييماً public function topRatedProducts() { $products = Review::where('status', 1) ->where('rate_avg', '>', 0) ->orderBy('rate_avg', 'desc') ->paginate(9); foreach ($products as $product) { $product->user_rating = auth()->check() ? Rating::where('product_id', $product->id) ->where('user_id', auth()->id()) ->value('rating') : null; } return view('frontend.pages.products.list', compact('products')) ->with('title', 'الأكثر تقييماً'); } // 👁️🗨️ الأكثر مشاهدة public function mostViewedProducts() { $products = Review::where('status', 1) ->where('total_views', '>', 0) ->orderBy('total_views', 'desc') ->paginate(9); foreach ($products as $product) { $product->user_rating = auth()->check() ? Rating::where('product_id', $product->id) ->where('user_id', auth()->id()) ->value('rating') : null; } return view('frontend.pages.products.list', compact('products')) ->with('title', 'الأكثر مشاهدة'); } // 🧭 الفلترة العامة public function filterProducts(Request $request, $scope = null, $id = null) { $filter = $request->query('filter'); $query = Review::query()->where('status', 1)->presentable(); if ($scope && $id) { if ($scope === 'category') { $query->where('category_id', $id); } elseif ($scope === 'subcategory') { $query->where('subcategory_id', $id); } elseif ($scope === 'subsubcategory') { $query->where('subsubcategory_id', $id); } } switch ($filter) { case 'top-rated': $query->orderBy('rate_avg', 'desc'); $title = 'الأكثر تقييماً'; break; case 'most-viewed': $query->orderBy('total_views', 'desc'); $title = 'الأكثر مشاهدة'; break; default: $query->orderBy('created_at', 'desc'); $title = 'أحدث المنتجات'; break; } $products = $query->paginate(9); foreach ($products as $product) { $product->user_rating = auth()->check() ? Rating::where('product_id', $product->id) ->where('user_id', auth()->id()) ->value('rating') : null; } return view('frontend.pages.products.list', compact('products', 'title')); } // ✏️ تحديث التعليق public function updateComment(Request $request, $id) { $request->validate([ 'comment_text' => 'required|string|min:3', ]); $comment = Comment::findOrFail($id); if (auth()->id() !== $comment->user_id) { return response()->json([ 'status' => 'error', 'message' => 'غير مصرح لك بتعديل هذا التعليق ❌', ], 403); } $comment->update(['comment_text' => $request->comment_text]); return response()->json([ 'status' => 'success', 'message' => 'تم تعديل التعليق بنجاح ✅', 'new_text' => $comment->comment_text, ]); } // 🗑️ حذف التعليق public function deleteComment($id) { $comment = Comment::findOrFail($id); if (auth()->id() !== $comment->user_id) { return response()->json([ 'status' => 'error', 'message' => 'غير مصرح لك بحذف هذا التعليق ❌', ], 403); } $comment->delete(); return response()->json([ 'status' => 'success', 'message' => 'تم حذف التعليق بنجاح 🗑️', ]); } }