cartModel = new Cart(); $this->productModel = new Product(); } /** * Страница корзины */ public function index(): void { $this->requireAuth(); $user = $this->getCurrentUser(); $cartItems = $this->cartModel->getUserCart($user['id']); $totals = $this->cartModel->getCartTotal($user['id']); $this->view('cart/checkout', [ 'user' => $user, 'cartItems' => $cartItems, 'totalQuantity' => $totals['quantity'], 'totalAmount' => $totals['amount'] ]); } /** * Добавить товар в корзину */ public function add(): void { if (!$this->isAuthenticated()) { $this->json([ 'success' => false, 'message' => 'Требуется авторизация' ]); return; } $productId = (int) $this->getPost('product_id', 0); $quantity = (int) $this->getPost('quantity', 1); $userId = $this->getCurrentUser()['id']; if ($productId <= 0) { $this->json([ 'success' => false, 'message' => 'Неверный товар' ]); return; } // Проверяем наличие товара $product = $this->productModel->find($productId); if (!$product || !$product['is_available']) { $this->json([ 'success' => false, 'message' => 'Товар не найден' ]); return; } // Проверяем количество на складе $cartItem = $this->cartModel->getItem($userId, $productId); $currentQty = $cartItem ? $cartItem['quantity'] : 0; $newQty = $currentQty + $quantity; if ($newQty > $product['stock_quantity']) { $this->json([ 'success' => false, 'message' => 'Недостаточно товара на складе' ]); return; } // Добавляем в корзину $result = $this->cartModel->addItem($userId, $productId, $quantity); if ($result) { $cartCount = $this->cartModel->getCount($userId); $this->json([ 'success' => true, 'cart_count' => $cartCount, 'message' => 'Товар добавлен в корзину' ]); } else { $this->json([ 'success' => false, 'message' => 'Ошибка при добавлении в корзину' ]); } } /** * Обновить количество товара */ public function update(): void { if (!$this->isAuthenticated()) { $this->json([ 'success' => false, 'message' => 'Требуется авторизация' ]); return; } $productId = (int) $this->getPost('product_id', 0); $quantity = (int) $this->getPost('quantity', 1); $userId = $this->getCurrentUser()['id']; if ($quantity <= 0) { // Если количество 0 или меньше - удаляем $this->cartModel->removeItem($userId, $productId); $cartCount = $this->cartModel->getCount($userId); $this->json([ 'success' => true, 'cart_count' => $cartCount ]); return; } // Проверяем наличие на складе $product = $this->productModel->find($productId); if (!$product || $quantity > $product['stock_quantity']) { $this->json([ 'success' => false, 'message' => 'Недостаточно товара на складе' ]); return; } $result = $this->cartModel->updateQuantity($userId, $productId, $quantity); if ($result) { $totals = $this->cartModel->getCartTotal($userId); $this->json([ 'success' => true, 'cart_count' => $totals['quantity'], 'total_amount' => $totals['amount'] ]); } else { $this->json([ 'success' => false, 'message' => 'Ошибка при обновлении' ]); } } /** * Удалить товар из корзины */ public function remove(): void { if (!$this->isAuthenticated()) { $this->json([ 'success' => false, 'message' => 'Требуется авторизация' ]); return; } $productId = (int) $this->getPost('product_id', 0); $userId = $this->getCurrentUser()['id']; $result = $this->cartModel->removeItem($userId, $productId); if ($result) { $cartCount = $this->cartModel->getCount($userId); $this->json([ 'success' => true, 'cart_count' => $cartCount ]); } else { $this->json([ 'success' => false, 'message' => 'Ошибка при удалении' ]); } } /** * Получить количество товаров в корзине */ public function count(): void { if (!$this->isAuthenticated()) { $this->json([ 'success' => true, 'cart_count' => 0 ]); return; } $userId = $this->getCurrentUser()['id']; $count = $this->cartModel->getCount($userId); $this->json([ 'success' => true, 'cart_count' => $count ]); } }