docs/api/source-system.library.cart.cart.html
| 1: | <?php |
| 2: | namespace Opencart\System\Library\Cart; |
| 3: | /** |
| 4: | * Class Cart |
| 5: | * |
| 6: | * @package Opencart\System\Library\Cart |
| 7: | */ |
| 8: | class Cart { |
| 9: | /** |
| 10: | * @var object |
| 11: | */ |
| 12: | private object $db; |
| 13: | /** |
| 14: | * @var object |
| 15: | */ |
| 16: | private object $config; |
| 17: | /** |
| 18: | * @var object |
| 19: | */ |
| 20: | private object $customer; |
| 21: | /** |
| 22: | * @var object |
| 23: | */ |
| 24: | private object $session; |
| 25: | /** |
| 26: | * @var object |
| 27: | */ |
| 28: | private object $tax; |
| 29: | /** |
| 30: | * @var object |
| 31: | */ |
| 32: | private object $weight; |
| 33: | /** |
| 34: | * @var array<int, array<string, mixed>> |
| 35: | */ |
| 36: | private array $data = []; |
| 37: | |
| 38: | /** |
| 39: | * Constructor |
| 40: | * |
| 41: | * @param \Opencart\System\Engine\Registry $registry |
| 42: | */ |
| 43: | public function __construct(\Opencart\System\Engine\Registry $registry) { |
| 44: | $this->db = $registry->get('db'); |
| 45: | $this->config = $registry->get('config'); |
| 46: | $this->customer = $registry->get('customer'); |
| 47: | $this->session = $registry->get('session'); |
| 48: | $this->tax = $registry->get('tax'); |
| 49: | $this->weight = $registry->get('weight'); |
| 50: | |
| 51: | // Remove all the expired carts with no customer ID |
| 52: | $this->db->query("DELETE FROM " . DB\_PREFIX . "cart WHERE (api\_id > '0' OR customer\_id = '0') AND date\_added < DATE_SUB(NOW(), INTERVAL 1 HOUR)"); |
| 53: | |
| 54: | if ($this->customer->isLogged()) { |
| 55: | // We want to change the session ID on all the old items in the customers cart |
| 56: | $this->db->query("UPDATE " . DB\_PREFIX . "cart SET session\_id = '" . $this->db->escape($this->session->getId()) . "' WHERE api_id = '0' AND customer_id = '" . (int)$this->customer->getId() . "'"); |
| 57: | |
| 58: | // Once the customer is logged in we want to update the customers cart |
| 59: | $cart_query = $this->db->query("SELECT * FROM " . DB\_PREFIX . "cart WHERE api\_id = '0' AND customer\_id = '0' AND session\_id = '" . $this->db->escape($this->session->getId()) . "'"); |
| 60: | |
| 61: | foreach ($cart_query->rows as $cart) { |
| 62: | $this->db->query("DELETE FROM " . DB\_PREFIX . "cart WHERE cart\_id = '" . (int)$cart['cart_id'] . "'"); |
| 63: | |
| 64: | // The advantage of using $this->add is that it will check if the products already exist and increase the quantity if necessary. |
| 65: | $this->add($cart['product_id'], $cart['quantity'], json_decode($cart['option'], true), $cart['subscription_plan_id'], $cart['override'], $cart['price']); |
| 66: | } |
| 67: | } |
| 68: | |
| 69: | // Populate the cart data |
| 70: | $this->data = $this->getProducts(); |
| 71: | } |
| 72: | |
| 73: | /** |
| 74: | * getProducts |
| 75: | * |
| 76: | * @return array<int, array<string, mixed>> |
| 77: | */ |
| 78: | public function getProducts(): array { |
| 79: | if (!$this->data) { |
| 80: | $cart_query = $this->db->query("SELECT * FROM " . DB\_PREFIX . "cart WHERE api\_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'"); |
| 81: | |
| 82: | foreach ($cart_query->rows as $cart) { |
| 83: | $stock = true; |
| 84: | |
| 85: | $product_query = $this->db->query("SELECT * FROM " . DB\_PREFIX . "product\_to\_store p2s LEFT JOIN " . DB\_PREFIX . "product p ON (p2s.product\_id = p.product\_id) LEFT JOIN " . DB\_PREFIX . "product\_description pd ON (p.product\_id = pd.product\_id) WHERE p2s.store\_id = '" . (int)$this->config->get('config_store_id') . "' AND p2s.product_id = '" . (int)$cart['product_id'] . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'"); |
| 86: | |
| 87: | if ($product_query->num_rows && ($cart['quantity'] > 0)) { |
| 88: | $option_price = 0; |
| 89: | $option_points = 0; |
| 90: | $option_weight = 0; |
| 91: | |
| 92: | $option_data = []; |
| 93: | |
| 94: | $product_options = (array)json_decode($cart['option'], true); |
| 95: | |
| 96: | // Merge variant code with options |
| 97: | $variant = json_decode($product_query->row['variant'], true); |
| 98: | |
| 99: | if ($variant) { |
| 100: | foreach ($variant as $key => $value) { |
| 101: | $product_options[$key] = $value; |
| 102: | } |
| 103: | } |
| 104: | |
| 105: | foreach ($product_options as $product_option_id => $value) { |
| 106: | if (!$product_query->row['master_id']) { |
| 107: | $product_id = $cart['product_id']; |
| 108: | } else { |
| 109: | $product_id = $product_query->row['master_id']; |
| 110: | } |
| 111: | |
| 112: | $option_query = $this->db->query("SELECT po.product_option_id, po.option_id, od.name, o.type FROM " . DB\_PREFIX . "product\_option po LEFT JOIN " . DB\_PREFIX . "option o ON (po.option\_id = o.option\_id) LEFT JOIN " . DB\_PREFIX . "option\_description od ON (o.option\_id = od.option\_id) WHERE po.product\_option\_id = '" . (int)$product_option_id . "' AND po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$this->config->get('config_language_id') . "'"); |
| 113: | |
| 114: | if ($option_query->num_rows) { |
| 115: | if ($option_query->row['type'] == 'select' || $option_query->row['type'] == 'radio') { |
| 116: | $option_value_query = $this->db->query("SELECT pov.option_value_id, ovd.name, pov.quantity, pov.subtract, pov.price, pov.price_prefix, pov.points, pov.points_prefix, pov.weight, pov.weight_prefix FROM " . DB\_PREFIX . "product\_option\_value pov LEFT JOIN " . DB\_PREFIX . "option\_value ov ON (pov.option\_value\_id = ov.option\_value\_id) LEFT JOIN " . DB\_PREFIX . "option\_value\_description ovd ON (ov.option\_value\_id = ovd.option\_value\_id) WHERE pov.product\_option\_value\_id = '" . (int)$value . "' AND pov.product_option_id = '" . (int)$product_option_id . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); |
| 117: | |
| 118: | if ($option_value_query->num_rows) { |
| 119: | if ($option_value_query->row['price_prefix'] == '+') { |
| 120: | $option_price += $option_value_query->row['price']; |
| 121: | } elseif ($option_value_query->row['price_prefix'] == '-') { |
| 122: | $option_price -= $option_value_query->row['price']; |
| 123: | } |
| 124: | |
| 125: | if ($option_value_query->row['points_prefix'] == '+') { |
| 126: | $option_points += $option_value_query->row['points']; |
| 127: | } elseif ($option_value_query->row['points_prefix'] == '-') { |
| 128: | $option_points -= $option_value_query->row['points']; |
| 129: | } |
| 130: | |
| 131: | if ($option_value_query->row['weight_prefix'] == '+') { |
| 132: | $option_weight += $option_value_query->row['weight']; |
| 133: | } elseif ($option_value_query->row['weight_prefix'] == '-') { |
| 134: | $option_weight -= $option_value_query->row['weight']; |
| 135: | } |
| 136: | |
| 137: | if ($option_value_query->row['subtract'] && (!$option_value_query->row['quantity'] || ($option_value_query->row['quantity'] < $cart['quantity']))) { |
| 138: | $stock = false; |
| 139: | } |
| 140: | |
| 141: | $option_data[] = [ |
| 142: | 'product_option_id' => $product_option_id, |
| 143: | 'product_option_value_id' => $value, |
| 144: | 'option_id' => $option_query->row['option_id'], |
| 145: | 'option_value_id' => $option_value_query->row['option_value_id'], |
| 146: | 'name' => $option_query->row['name'], |
| 147: | 'value' => $option_value_query->row['name'], |
| 148: | 'type' => $option_query->row['type'], |
| 149: | 'quantity' => $option_value_query->row['quantity'], |
| 150: | 'subtract' => $option_value_query->row['subtract'], |
| 151: | 'price' => $option_value_query->row['price'], |
| 152: | 'price_prefix' => $option_value_query->row['price_prefix'], |
| 153: | 'points' => $option_value_query->row['points'], |
| 154: | 'points_prefix' => $option_value_query->row['points_prefix'], |
| 155: | 'weight' => $option_value_query->row['weight'], |
| 156: | 'weight_prefix' => $option_value_query->row['weight_prefix'] |
| 157: | ]; |
| 158: | } |
| 159: | } elseif ($option_query->row['type'] == 'checkbox' && is_array($value)) { |
| 160: | foreach ($value as $product_option_value_id) { |
| 161: | $option_value_query = $this->db->query("SELECT pov.option_value_id, pov.quantity, pov.subtract, pov.price, pov.price_prefix, pov.points, pov.points_prefix, pov.weight, pov.weight_prefix, ovd.name FROM " . DB\_PREFIX . "product\_option\_value pov LEFT JOIN " . DB\_PREFIX . "option\_value\_description ovd ON (pov.option\_value\_id = ovd.option_value_id) WHERE pov.product_option_value_id = '" . (int)$product_option_value_id . "' AND pov.product_option_id = '" . (int)$product_option_id . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); |
| 162: | |
| 163: | if ($option_value_query->num_rows) { |
| 164: | if ($option_value_query->row['price_prefix'] == '+') { |
| 165: | $option_price += $option_value_query->row['price']; |
| 166: | } elseif ($option_value_query->row['price_prefix'] == '-') { |
| 167: | $option_price -= $option_value_query->row['price']; |
| 168: | } |
| 169: | |
| 170: | if ($option_value_query->row['points_prefix'] == '+') { |
| 171: | $option_points += $option_value_query->row['points']; |
| 172: | } elseif ($option_value_query->row['points_prefix'] == '-') { |
| 173: | $option_points -= $option_value_query->row['points']; |
| 174: | } |
| 175: | |
| 176: | if ($option_value_query->row['weight_prefix'] == '+') { |
| 177: | $option_weight += $option_value_query->row['weight']; |
| 178: | } elseif ($option_value_query->row['weight_prefix'] == '-') { |
| 179: | $option_weight -= $option_value_query->row['weight']; |
| 180: | } |
| 181: | |
| 182: | if ($option_value_query->row['subtract'] && (!$option_value_query->row['quantity'] || ($option_value_query->row['quantity'] < $cart['quantity']))) { |
| 183: | $stock = false; |
| 184: | } |
| 185: | |
| 186: | $option_data[] = [ |
| 187: | 'product_option_id' => $product_option_id, |
| 188: | 'product_option_value_id' => $product_option_value_id, |
| 189: | 'option_id' => $option_query->row['option_id'], |
| 190: | 'option_value_id' => $option_value_query->row['option_value_id'], |
| 191: | 'name' => $option_query->row['name'], |
| 192: | 'value' => $option_value_query->row['name'], |
| 193: | 'type' => $option_query->row['type'], |
| 194: | 'quantity' => $option_value_query->row['quantity'], |
| 195: | 'subtract' => $option_value_query->row['subtract'], |
| 196: | 'price' => $option_value_query->row['price'], |
| 197: | 'price_prefix' => $option_value_query->row['price_prefix'], |
| 198: | 'points' => $option_value_query->row['points'], |
| 199: | 'points_prefix' => $option_value_query->row['points_prefix'], |
| 200: | 'weight' => $option_value_query->row['weight'], |
| 201: | 'weight_prefix' => $option_value_query->row['weight_prefix'] |
| 202: | ]; |
| 203: | } |
| 204: | } |
| 205: | } elseif ($option_query->row['type'] == 'text' || $option_query->row['type'] == 'textarea' || $option_query->row['type'] == 'file' || $option_query->row['type'] == 'date' || $option_query->row['type'] == 'datetime' || $option_query->row['type'] == 'time') { |
| 206: | $option_data[] = [ |
| 207: | 'product_option_id' => $product_option_id, |
| 208: | 'product_option_value_id' => '', |
| 209: | 'option_id' => $option_query->row['option_id'], |
| 210: | 'option_value_id' => '', |
| 211: | 'name' => $option_query->row['name'], |
| 212: | 'value' => $value, |
| 213: | 'type' => $option_query->row['type'], |
| 214: | 'quantity' => '', |
| 215: | 'subtract' => '', |
| 216: | 'price' => '', |
| 217: | 'price_prefix' => '', |
| 218: | 'points' => '', |
| 219: | 'points_prefix' => '', |
| 220: | 'weight' => '', |
| 221: | 'weight_prefix' => '' |
| 222: | ]; |
| 223: | } |
| 224: | } |
| 225: | } |
| 226: | |
| 227: | $price = $product_query->row['price']; |
| 228: | |
| 229: | // Product Discounts |
| 230: | $discount_quantity = 0; |
| 231: | |
| 232: | foreach ($cart_query->rows as $cart_2) { |
| 233: | if ($cart_2['product_id'] == $cart['product_id']) { |
| 234: | $discount_quantity += $cart_2['quantity']; |
| 235: | } |
| 236: | } |
| 237: | |
| 238: | $product_discount_query = $this->db->query("SELECT price FROM " . DB\_PREFIX . "product\_discount WHERE product\_id = '" . (int)$cart['product_id'] . "' AND customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND quantity <= '" . (int)$discount_quantity . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity DESC, priority ASC, price ASC LIMIT 1"); |
| 239: | |
| 240: | if ($product_discount_query->num_rows) { |
| 241: | $price = $product_discount_query->row['price']; |
| 242: | } |
| 243: | |
| 244: | // Product Specials |
| 245: | $product_special_query = $this->db->query("SELECT price FROM " . DB\_PREFIX . "product\_special WHERE product\_id = '" . (int)$cart['product_id'] . "' AND customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1"); |
| 246: | |
| 247: | if ($product_special_query->num_rows) { |
| 248: | $price = $product_special_query->row['price']; |
| 249: | } |
| 250: | |
| 251: | $product_total = 0; |
| 252: | |
| 253: | foreach ($cart_query->rows as $cart_2) { |
| 254: | if ($cart_2['product_id'] == $cart['product_id']) { |
| 255: | $product_total += $cart_2['quantity']; |
| 256: | } |
| 257: | } |
| 258: | |
| 259: | if ($product_query->row['minimum'] > $product_total) { |
| 260: | $minimum = false; |
| 261: | } else { |
| 262: | $minimum = true; |
| 263: | } |
| 264: | |
| 265: | // Reward Points |
| 266: | $product_reward_query = $this->db->query("SELECT points FROM " . DB\_PREFIX . "product\_reward WHERE product\_id = '" . (int)$cart['product_id'] . "' AND customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "'"); |
| 267: | |
| 268: | if ($product_reward_query->num_rows) { |
| 269: | $reward = $product_reward_query->row['points']; |
| 270: | } else { |
| 271: | $reward = 0; |
| 272: | } |
| 273: | |
| 274: | // Downloads |
| 275: | $download_data = []; |
| 276: | |
| 277: | $download_query = $this->db->query("SELECT * FROM " . DB\_PREFIX . "product\_to\_download p2d LEFT JOIN " . DB\_PREFIX . "download d ON (p2d.download\_id = d.download\_id) LEFT JOIN " . DB\_PREFIX . "download\_description dd ON (d.download\_id = dd.download\_id) WHERE p2d.product\_id = '" . (int)$cart['product_id'] . "' AND dd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); |
| 278: | |
| 279: | foreach ($download_query->rows as $download) { |
| 280: | $download_data[] = [ |
| 281: | 'download_id' => $download['download_id'], |
| 282: | 'name' => $download['name'], |
| 283: | 'filename' => $download['filename'], |
| 284: | 'mask' => $download['mask'] |
| 285: | ]; |
| 286: | } |
| 287: | |
| 288: | // Stock |
| 289: | if (!$product_query->row['quantity'] || ($product_query->row['quantity'] < $cart['quantity'])) { |
| 290: | $stock = false; |
| 291: | } |
| 292: | |
| 293: | $subscription_data = []; |
| 294: | |
| 295: | $subscription_query = $this->db->query("SELECT * FROM " . DB\_PREFIX . "product\_subscription ps LEFT JOIN " . DB\_PREFIX . "subscription\_plan sp ON (ps.subscription\_plan\_id = sp.subscription\_plan\_id) LEFT JOIN " . DB\_PREFIX . "subscription\_plan\_description spd ON (sp.subscription\_plan\_id = spd.subscription\_plan\_id) WHERE ps.product\_id = '" . (int)$cart['product_id'] . "' AND ps.subscription_plan_id = '" . (int)$cart['subscription_plan_id'] . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND spd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND sp.status = '1'"); |
| 296: | |
| 297: | if ($subscription_query->num_rows) { |
| 298: | $price = $subscription_query->row['price']; |
| 299: | |
| 300: | if ($subscription_query->row['trial_status']) { |
| 301: | $price = $subscription_query->row['trial_price']; |
| 302: | } |
| 303: | |
| 304: | $subscription_data = [ |
| 305: | 'subscription_plan_id' => $subscription_query->row['subscription_plan_id'], |
| 306: | 'name' => $subscription_query->row['name'], |
| 307: | 'trial_price' => $subscription_query->row['trial_price'], |
| 308: | 'trial_frequency' => $subscription_query->row['trial_frequency'], |
| 309: | 'trial_cycle' => $subscription_query->row['trial_cycle'], |
| 310: | 'trial_duration' => $subscription_query->row['trial_duration'], |
| 311: | 'trial_remaining' => $subscription_query->row['trial_duration'], |
| 312: | 'trial_status' => $subscription_query->row['trial_status'], |
| 313: | 'price' => $subscription_query->row['price'], |
| 314: | 'frequency' => $subscription_query->row['frequency'], |
| 315: | 'cycle' => $subscription_query->row['cycle'], |
| 316: | 'duration' => $subscription_query->row['duration'], |
| 317: | 'remaining' => $subscription_query->row['duration'] |
| 318: | ]; |
| 319: | } |
| 320: | |
| 321: | if ($cart['override']) { |
| 322: | $price = $cart['price']; |
| 323: | } |
| 324: | |
| 325: | $this->data[$cart['cart_id']] = [ |
| 326: | 'cart_id' => $cart['cart_id'], |
| 327: | 'product_id' => $product_query->row['product_id'], |
| 328: | 'master_id' => $product_query->row['master_id'], |
| 329: | 'name' => $product_query->row['name'], |
| 330: | 'model' => $product_query->row['model'], |
| 331: | 'shipping' => $product_query->row['shipping'], |
| 332: | 'image' => $product_query->row['image'], |
| 333: | 'option' => $option_data, |
| 334: | 'subscription' => $subscription_data, |
| 335: | 'download' => $download_data, |
| 336: | 'quantity' => $cart['quantity'], |
| 337: | 'minimum' => $minimum, |
| 338: | 'subtract' => $product_query->row['subtract'], |
| 339: | 'stock' => $stock, |
| 340: | 'price' => ($price + $option_price), |
| 341: | 'total' => ($price + $option_price) * $cart['quantity'], |
| 342: | 'reward' => $reward * $cart['quantity'], |
| 343: | 'points' => ($product_query->row['points'] ? ($product_query->row['points'] + $option_points) * $cart['quantity'] : 0), |
| 344: | 'tax_class_id' => $product_query->row['tax_class_id'], |
| 345: | 'weight' => ($product_query->row['weight'] + $option_weight) * $cart['quantity'], |
| 346: | 'weight_class_id' => $product_query->row['weight_class_id'], |
| 347: | 'length' => $product_query->row['length'], |
| 348: | 'width' => $product_query->row['width'], |
| 349: | 'height' => $product_query->row['height'], |
| 350: | 'length_class_id' => $product_query->row['length_class_id'] |
| 351: | ]; |
| 352: | } else { |
| 353: | $this->remove($cart['cart_id']); |
| 354: | } |
| 355: | } |
| 356: | } |
| 357: | |
| 358: | return $this->data; |
| 359: | } |
| 360: | |
| 361: | /** |
| 362: | * Add |
| 363: | * |
| 364: | * @param int $product_id |
| 365: | * @param int $quantity |
| 366: | * @param array<mixed> $option |
| 367: | * @param int $subscription_plan_id |
| 368: | * @param bool $override |
| 369: | * @param float $price |
| 370: | * |
| 371: | * @return void |
| 372: | */ |
| 373: | public function add(int $product_id, int $quantity = 1, array $option = [], int $subscription_plan_id = 0, bool $override = false, float $price = 0): void { |
| 374: | $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB\_PREFIX . "cart WHERE api\_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' AND product_id = '" . (int)$product_id . "' AND subscription_plan_id = '" . (int)$subscription_plan_id . "' AND option = '" . $this->db->escape(json_encode($option)) . "'"); |
| 375: | |
| 376: | if (!$query->row['total']) { |
| 377: | $this->db->query("INSERT INTO " . DB\_PREFIX . "cart SET api\_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "', customer_id = '" . (int)$this->customer->getId() . "', session_id = '" . $this->db->escape($this->session->getId()) . "', product_id = '" . (int)$product_id . "', subscription_plan_id = '" . (int)$subscription_plan_id . "', option = '" . $this->db->escape(json_encode($option)) . "', quantity = '" . (int)$quantity . "', override = '" . (bool)$override . "', price = '" . (float)($override ? $price : 0) . "', date_added = NOW()"); |
| 378: | } else { |
| 379: | $this->db->query("UPDATE " . DB\_PREFIX . "cart SET quantity = (quantity + " . (int)$quantity . ") WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' AND product_id = '" . (int)$product_id . "' AND subscription_plan_id = '" . (int)$subscription_plan_id . "' AND option = '" . $this->db->escape(json_encode($option)) . "'"); |
| 380: | } |
| 381: | |
| 382: | // Clear cart data |
| 383: | $this->data = []; |
| 384: | |
| 385: | // Populate the cart data |
| 386: | $this->data = $this->getProducts(); |
| 387: | } |
| 388: | |
| 389: | /** |
| 390: | * Update |
| 391: | * |
| 392: | * @param int $cart_id |
| 393: | * @param int $quantity |
| 394: | * |
| 395: | * @return void |
| 396: | */ |
| 397: | public function update(int $cart_id, int $quantity): void { |
| 398: | $this->db->query("UPDATE " . DB\_PREFIX . "cart SET quantity = '" . (int)$quantity . "' WHERE cart_id = '" . (int)$cart_id . "' AND api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'"); |
| 399: | |
| 400: | // Clear cart data |
| 401: | $this->data = []; |
| 402: | |
| 403: | // Populate the cart data |
| 404: | $this->data = $this->getProducts(); |
| 405: | } |
| 406: | |
| 407: | /** |
| 408: | * Has |
| 409: | * |
| 410: | * @param int $cart_id |
| 411: | * |
| 412: | * @return bool |
| 413: | */ |
| 414: | public function has(int $cart_id): bool { |
| 415: | return isset($this->data[$cart_id]); |
| 416: | } |
| 417: | |
| 418: | /** |
| 419: | * Remove |
| 420: | * |
| 421: | * @param int $cart_id |
| 422: | * |
| 423: | * @return void |
| 424: | */ |
| 425: | public function remove(int $cart_id): void { |
| 426: | $this->db->query("DELETE FROM " . DB\_PREFIX . "cart WHERE cart\_id = '" . (int)$cart_id . "' AND api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'"); |
| 427: | |
| 428: | unset($this->data[$cart_id]); |
| 429: | } |
| 430: | |
| 431: | /** |
| 432: | * Clear |
| 433: | * |
| 434: | * @return void |
| 435: | */ |
| 436: | public function clear(): void { |
| 437: | $this->db->query("DELETE FROM " . DB\_PREFIX . "cart WHERE api\_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'"); |
| 438: | |
| 439: | $this->data = []; |
| 440: | } |
| 441: | |
| 442: | /** |
| 443: | * getSubscriptions |
| 444: | * |
| 445: | * @return array<int, array<string, mixed>> |
| 446: | */ |
| 447: | public function getSubscriptions(): array { |
| 448: | $product_data = []; |
| 449: | |
| 450: | foreach ($this->getProducts() as $value) { |
| 451: | if ($value['subscription']) { |
| 452: | $product_data[] = $value; |
| 453: | } |
| 454: | } |
| 455: | |
| 456: | return $product_data; |
| 457: | } |
| 458: | |
| 459: | /** |
| 460: | * getWeight |
| 461: | * |
| 462: | * @return float |
| 463: | */ |
| 464: | public function getWeight(): float { |
| 465: | $weight = 0; |
| 466: | |
| 467: | foreach ($this->getProducts() as $product) { |
| 468: | if ($product['shipping']) { |
| 469: | $weight += $this->weight->convert($product['weight'], $product['weight_class_id'], $this->config->get('config_weight_class_id')); |
| 470: | } |
| 471: | } |
| 472: | |
| 473: | return $weight; |
| 474: | } |
| 475: | |
| 476: | /** |
| 477: | * getSubTotal |
| 478: | * |
| 479: | * @return float |
| 480: | */ |
| 481: | public function getSubTotal(): float { |
| 482: | $total = 0; |
| 483: | |
| 484: | foreach ($this->getProducts() as $product) { |
| 485: | $total += $product['total']; |
| 486: | } |
| 487: | |
| 488: | return $total; |
| 489: | } |
| 490: | |
| 491: | /** |
| 492: | * getTaxes |
| 493: | * |
| 494: | * @return array<int, float> |
| 495: | */ |
| 496: | public function getTaxes(): array { |
| 497: | $tax_data = []; |
| 498: | |
| 499: | foreach ($this->getProducts() as $product) { |
| 500: | if ($product['tax_class_id']) { |
| 501: | $tax_rates = $this->tax->getRates($product['price'], $product['tax_class_id']); |
| 502: | |
| 503: | foreach ($tax_rates as $tax_rate) { |
| 504: | if (!isset($tax_data[$tax_rate['tax_rate_id']])) { |
| 505: | $tax_data[$tax_rate['tax_rate_id']] = ($tax_rate['amount'] * $product['quantity']); |
| 506: | } else { |
| 507: | $tax_data[$tax_rate['tax_rate_id']] += ($tax_rate['amount'] * $product['quantity']); |
| 508: | } |
| 509: | } |
| 510: | } |
| 511: | } |
| 512: | |
| 513: | return $tax_data; |
| 514: | } |
| 515: | |
| 516: | /** |
| 517: | * getTotal |
| 518: | * |
| 519: | * @return float |
| 520: | */ |
| 521: | public function getTotal(): float { |
| 522: | $total = 0; |
| 523: | |
| 524: | foreach ($this->getProducts() as $product) { |
| 525: | $total += $this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')) * $product['quantity']; |
| 526: | } |
| 527: | |
| 528: | return $total; |
| 529: | } |
| 530: | |
| 531: | /** |
| 532: | * countProducts |
| 533: | * |
| 534: | * @return int |
| 535: | */ |
| 536: | public function countProducts(): int { |
| 537: | $product_total = 0; |
| 538: | |
| 539: | $products = $this->getProducts(); |
| 540: | |
| 541: | foreach ($products as $product) { |
| 542: | $product_total += $product['quantity']; |
| 543: | } |
| 544: | |
| 545: | return $product_total; |
| 546: | } |
| 547: | |
| 548: | /** |
| 549: | * hadProducts |
| 550: | * |
| 551: | * @return bool |
| 552: | */ |
| 553: | public function hasProducts(): bool { |
| 554: | return (bool)count($this->getProducts()); |
| 555: | } |
| 556: | |
| 557: | /** |
| 558: | * hasSubscription |
| 559: | * |
| 560: | * @return bool |
| 561: | */ |
| 562: | public function hasSubscription(): bool { |
| 563: | return (bool)count($this->getSubscriptions()); |
| 564: | } |
| 565: | |
| 566: | /** |
| 567: | * hasStock |
| 568: | * |
| 569: | * @return bool |
| 570: | */ |
| 571: | public function hasStock(): bool { |
| 572: | foreach ($this->getProducts() as $product) { |
| 573: | if (!$product['stock']) { |
| 574: | return false; |
| 575: | } |
| 576: | } |
| 577: | |
| 578: | return true; |
| 579: | } |
| 580: | |
| 581: | /** |
| 582: | * hasShipping |
| 583: | * |
| 584: | * @return bool |
| 585: | */ |
| 586: | public function hasShipping(): bool { |
| 587: | foreach ($this->getProducts() as $product) { |
| 588: | if ($product['shipping']) { |
| 589: | return true; |
| 590: | } |
| 591: | } |
| 592: | |
| 593: | return false; |
| 594: | } |
| 595: | |
| 596: | /** |
| 597: | * hasDownload |
| 598: | * |
| 599: | * @return bool |
| 600: | */ |
| 601: | public function hasDownload(): bool { |
| 602: | foreach ($this->getProducts() as $product) { |
| 603: | if ($product['download']) { |
| 604: | return true; |
| 605: | } |
| 606: | } |
| 607: | |
| 608: | return false; |
| 609: | } |
| 610: | } |
| 611: | |
OpenCart API API documentation generated by ApiGen dev-master