File: //home/bk/__backup/api/Cart.php
<?php
require_once('Mgc.php');
class Cart extends Mgc {
/*Выбираем содержимое корзины*/
public function get_cart() {
$cart = new stdClass();
$cart->purchases = array();
$cart->total_price = 0;
$cart->total_products = 0;
$cart->coupon = null;
$cart->discount = 0;
$cart->coupon_discount = 0;
// Берем из сессии список variant_id=>amount
if(!empty($_SESSION['shopping_cart'])) {
$session_items = $_SESSION['shopping_cart'];
$variants = $this->variants->get_variants(array('id'=>array_keys($session_items)));
if(!empty($variants)) {
foreach($variants as $variant) {
$num_opt[$variant->product_id] = $this->features->get_option($variant->product_id,25);
$items[$variant->id] = new stdClass();
$variant->price = ($variant->opt_price>0 && !empty($num_opt[$variant->product_id]->value) && ($num_opt[$variant->product_id]->value<=$session_items[$variant->id] || $this->products->check_opt($variant))?$variant->opt_price:$variant->price);
// var_dump( $this->products->get_opt($variant) );
$items[$variant->id]->variant = $variant;
$items[$variant->id]->amount = $session_items[$variant->id];
$products_ids[] = $variant->product_id;
}
$products = array();
foreach($this->products->get_products(array('id'=>$products_ids, 'limit' => count($products_ids))) as $p) {
$products[$p->id]=$p;
if(!isset($num_opt[$p->id]))
$num_opt[$p->id] = $this->features->get_option($p->id,25);
$products[$p->id]->num_opt = !empty($num_opt[$p->id]->value)?(int)$num_opt[$p->id]->value:0;
}
$images = $this->products->get_images(array('product_id'=>$products_ids));
foreach($images as $image) {
$products[$image->product_id]->images[$image->id] = $image;
}
$opt = 0;
// Пользовательская скидка
$cart->discount = 0;
if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id']))) {
$cart->discount = $user->discount;
/**
* BAD
*/
if($user->group_id ==4){
$opt = 1;
}
}
foreach($items as $variant_id=>$item) {
$purchase = null;
if(!empty($products[$item->variant->product_id])) {
$purchase = new stdClass();
$purchase->product = $products[$item->variant->product_id];
$purchase->variant = $item->variant;
$purchase->amount = $item->amount;
$cart->purchases[] = $purchase;
if(!empty($products[$item->variant->product_id]->num_opt) && $products[$item->variant->product_id]->num_opt<=$item->amount){
$opt = 1;
}
$cart->total_price += ($opt && $item->variant->opt_price>0?$item->variant->opt_price:$item->variant->price)*$item->amount;
$cart->total_products += $item->amount;
}
}
$cart->total_price *= (100-$cart->discount)/100;
// Скидка по купону
if(isset($_SESSION['coupon_code'])) {
$cart->coupon = $this->coupons->get_coupon($_SESSION['coupon_code']);
if($cart->coupon && $cart->coupon->valid && $cart->total_price>=$cart->coupon->min_order_price) {
if($cart->coupon->type=='absolute') {
// Абсолютная скидка не более суммы заказа
$cart->coupon_discount = $cart->total_price>$cart->coupon->value?$cart->coupon->value:$cart->total_price;
$cart->total_price = max(0, $cart->total_price-$cart->coupon->value);
$cart->coupon->coupon_percent = round(100-($cart->total_price*100)/($cart->total_price+$cart->coupon->value),2);
} else {
$cart->coupon->coupon_percent = $cart->coupon->value;
$cart->coupon_discount = $cart->total_price * ($cart->coupon->value)/100;
$cart->total_price = $cart->total_price-$cart->coupon_discount;
}
} else {
unset($_SESSION['coupon_code']);
}
}
}
}
return $cart;
}
/*Добавление товара в корзину*/
public function add_item($variant_id, $amount = 1) {
// Выберем товар из базы, заодно убедившись в его существовании
$variant = $this->variants->get_variant($variant_id);
// Если товар существует, добавим его в корзину
if(!empty($variant) && ($variant->stock>0 || $this->settings->is_preorder)) {
$amount = max(1, $amount);
if(isset($_SESSION['shopping_cart'][$variant_id])) {
$amount = max(1, $amount+$_SESSION['shopping_cart'][$variant_id]);
}
// Не дадим больше чем на складе
$amount = min($amount, ($variant->stock ? $variant->stock : min($this->settings->max_order_amount, $amount)));
$_SESSION['shopping_cart'][$variant_id] = intval($amount);
}
}
/*Обновление товара в корзине*/
public function update_item($variant_id, $amount = 1) {
// Выберем товар из базы, заодно убедившись в его существовании
$variant = $this->variants->get_variant($variant_id);
// Если товар существует, добавим его в корзину
if(!empty($variant) && ($variant->stock>0 || $this->settings->is_preorder)) {
$amount = max(1, $amount);
// Не дадим больше чем на складе
$amount = min($amount, ($variant->stock ? $variant->stock : min($this->settings->max_order_amount, $amount)));
$_SESSION['shopping_cart'][$variant_id] = intval($amount);
}
}
/*Удаление товара из корзины*/
public function delete_item($variant_id) {
unset($_SESSION['shopping_cart'][$variant_id]);
}
/*Очистка корзины*/
public function empty_cart() {
unset($_SESSION['shopping_cart']);
unset($_SESSION['coupon_code']);
}
/*Применение купона в корзине*/
public function apply_coupon($coupon_code) {
$coupon = $this->coupons->get_coupon((string)$coupon_code);
if($coupon && $coupon->valid) {
$_SESSION['coupon_code'] = $coupon->code;
} else {
unset($_SESSION['coupon_code']);
}
}
}