1: <?php
2: namespace Opencart\Catalog\Model\Checkout;
3: /**
4: * Class Cart
5: *
6: * @package Opencart\Catalog\Model\Checkout
7: */
8: class Cart extends \Opencart\System\Engine\Model {
9: /**
10: * Get Products
11: *
12: * @return array<int, array<string, mixed>>
13: */
14: public function getProducts(): array {
15: $this->load->model('tool/image');
16: $this->load->model('tool/upload');
17:
18: // Products
19: $product_data = [];
20:
21: $products = $this->cart->getProducts();
22:
23: foreach ($products as $product) {
24: if ($product['image'] && is_file(DIR_IMAGE . html_entity_decode($product['image'], ENT_QUOTES, 'UTF-8'))) {
25: $image = $product['image'];
26: } else {
27: $image = 'placeholder.png';
28: }
29:
30: $option_data = [];
31:
32: foreach ($product['option'] as $option) {
33: if ($option['type'] != 'file') {
34: $value = $option['value'];
35: } else {
36: $upload_info = $this->model_tool_upload->getUploadByCode($option['value']);
37:
38: if ($upload_info) {
39: $value = $upload_info['name'];
40: } else {
41: $value = '';
42: }
43: }
44:
45: $option_data[] = [
46: 'product_option_id' => $option['product_option_id'],
47: 'product_option_value_id' => $option['product_option_value_id'],
48: 'option_id' => $option['option_id'],
49: 'option_value_id' => $option['option_value_id'],
50: 'name' => $option['name'],
51: 'value' => $value,
52: 'type' => $option['type']
53: ];
54: }
55:
56: $product_total = 0;
57:
58: foreach ($products as $product_2) {
59: if ($product_2['product_id'] == $product['product_id']) {
60: $product_total += $product_2['quantity'];
61: }
62: }
63:
64: if ($product['minimum'] > $product_total) {
65: $minimum = false;
66: } else {
67: $minimum = true;
68: }
69:
70: $product_data[] = [
71: 'cart_id' => $product['cart_id'],
72: 'product_id' => $product['product_id'],
73: 'master_id' => $product['master_id'],
74: 'image' => $this->model_tool_image->resize($image, $this->config->get('config_image_cart_width'), $this->config->get('config_image_cart_height')),
75: 'name' => $product['name'],
76: 'model' => $product['model'],
77: 'option' => $option_data,
78: 'subscription' => $product['subscription'],
79: 'download' => $product['download'],
80: 'quantity' => $product['quantity'],
81: 'stock' => $product['stock'],
82: 'minimum' => $minimum,
83: 'shipping' => $product['shipping'],
84: 'subtract' => $product['subtract'],
85: 'reward' => $product['reward'],
86: 'tax_class_id' => $product['tax_class_id'],
87: 'price' => $product['price'],
88: 'total' => $product['total']
89: ];
90: }
91:
92: return $product_data;
93: }
94:
95: /**
96: * Get Vouchers
97: *
98: * @return array<string, array<string, mixed>>
99: */
100: public function getVouchers(): array {
101: $voucher_data = [];
102:
103: if (!empty($this->session->data['vouchers'])) {
104: foreach ($this->session->data['vouchers'] as $key => $voucher) {
105: $voucher_data[$key] = [
106: 'code' => $voucher['code'],
107: 'description' => $voucher['description'],
108: 'from_name' => $voucher['from_name'],
109: 'from_email' => $voucher['from_email'],
110: 'to_name' => $voucher['to_name'],
111: 'to_email' => $voucher['to_email'],
112: 'voucher_theme_id' => $voucher['voucher_theme_id'],
113: 'message' => $voucher['message'],
114: 'amount' => $voucher['amount']
115: ];
116: }
117: }
118:
119: return $voucher_data;
120: }
121:
122: /**
123: * Get Totals
124: *
125: * @param array<int, array<string, mixed>> $totals
126: * @param array<int, float> $taxes
127: * @param int $total
128: *
129: * @return void
130: */
131: public function getTotals(array &$totals, array &$taxes, int &$total): void {
132: $sort_order = [];
133:
134: $this->load->model('setting/extension');
135:
136: $results = $this->model_setting_extension->getExtensionsByType('total');
137:
138: foreach ($results as $key => $value) {
139: $sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order');
140: }
141:
142: array_multisort($sort_order, SORT_ASC, $results);
143:
144: foreach ($results as $result) {
145: if ($this->config->get('total_' . $result['code'] . '_status')) {
146: $this->load->model('extension/' . $result['extension'] . '/total/' . $result['code']);
147:
148: // __call magic method cannot pass-by-reference so we get PHP to call it as an anonymous function.
149: ($this->{'model_extension_' . $result['extension'] . '_total_' . $result['code']}->getTotal)($totals, $taxes, $total);
150: }
151: }
152:
153: $sort_order = [];
154:
155: foreach ($totals as $key => $value) {
156: $sort_order[$key] = $value['sort_order'];
157: }
158:
159: array_multisort($sort_order, SORT_ASC, $totals);
160: }
161: }
162: