productModel = new Product(); $this->categoryModel = new Category(); $this->reviewModel = new Review(); } public function catalog(): void { $this->requireAuth(); $user = $this->getCurrentUser(); $isAdmin = $this->isAdmin(); $filters = [ 'category_id' => (int) $this->getQuery('category', 0), 'search' => $this->getQuery('search', ''), 'min_price' => (int) $this->getQuery('min_price', 0), 'max_price' => (int) $this->getQuery('max_price', 1000000), 'colors' => $this->getQuery('colors', []), 'materials' => $this->getQuery('materials', []) ]; // Для админа по умолчанию показываем все товары (включая недоступные) // Для обычных пользователей - только доступные $showAll = $isAdmin && $this->getQuery('show_all') !== '0'; $categories = $this->categoryModel->getActive(); $products = ($isAdmin && $showAll) ? $this->productModel->getAllForAdmin(true) : $this->productModel->getAvailable($filters); $availableColors = $this->productModel->getAvailableColors(); $availableMaterials = $this->productModel->getAvailableMaterials(); $subcategories = []; if ($filters['category_id'] > 0) { $subcategories = $this->categoryModel->getChildren($filters['category_id']); } $this->view('products/catalog', [ 'user' => $user, 'isLoggedIn' => true, 'isAdmin' => $isAdmin, 'categories' => $categories, 'subcategories' => $subcategories, 'products' => $products, 'filters' => $filters, 'showAll' => $showAll, 'availableColors' => $availableColors, 'availableMaterials' => $availableMaterials, 'success' => $this->getQuery('success'), 'error' => $this->getQuery('error') ]); } public function show(int $id): void { $this->requireAuth(); $product = $this->productModel->findWithCategory($id); if (!$product || (!$product['is_available'] && !$this->isAdmin())) { $this->redirect('/catalog?error=product_not_found'); return; } $similarProducts = $this->productModel->getSimilar( $id, $product['category_id'] ); // Load reviews $reviews = $this->reviewModel->getByProduct($id, true); // Check if current user has already reviewed $user = $this->getCurrentUser(); $userReview = null; if ($user && !$this->isAdmin()) { $userReview = $this->reviewModel->getByUser($user['id'], $id); } $this->view('products/show', [ 'product' => $product, 'similarProducts' => $similarProducts, 'reviews' => $reviews, 'userReview' => $userReview, 'user' => $user, 'isLoggedIn' => true, 'isAdmin' => $this->isAdmin() ]); } }