productModel = new Product(); $this->categoryModel = new Category(); } /** * Каталог товаров */ 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') === '1'; // Получаем данные $categories = $this->categoryModel->getActive(); $products = $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, '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'] ); $this->view('products/show', [ 'product' => $product, 'similarProducts' => $similarProducts, 'user' => $this->getCurrentUser(), 'isAdmin' => $this->isAdmin() ]); } }