1: | <?php
2: | namespace Opencart\Catalog\Controller\Checkout;
3: | /**
4: | * Class ShippingAddress
5: | *
6: | * @package Opencart\Catalog\Controller\Checkout
7: | */
8: | class ShippingAddress extends \Opencart\System\Engine\Controller {
9: | /**
10: | * @return string
11: | */
12: | public function index(): string {
13: | $this->load->language('checkout/shipping_address');
14: |
15: | $data['error_upload_size'] = sprintf($this->language->get('error_upload_size'), $this->config->get('config_file_max_size'));
16: | $data['config_file_max_size'] = ((int)$this->config->get('config_file_max_size') * 1024 * 1024);
17: | $data['payment_address_required'] = $this->config->get('config_checkout_payment_address');
18: |
19: | $this->session->data['upload_token'] = oc_token(32);
20: |
21: | $data['upload'] = $this->url->link('tool/upload', 'language=' . $this->config->get('config_language') . '&upload_token=' . $this->session->data['upload_token']);
22: |
23: | $this->load->model('account/address');
24: |
25: | $data['addresses'] = $this->model_account_address->getAddresses($this->customer->getId());
26: |
27: | if (isset($this->session->data['shipping_address']['address_id'])) {
28: | $data['address_id'] = $this->session->data['shipping_address']['address_id'];
29: | } else {
30: | $data['address_id'] = 0;
31: | }
32: |
33: | $this->load->model('localisation/country');
34: |
35: | $data['countries'] = $this->model_localisation_country->getCountries();
36: |
37: | if (isset($this->session->data['shipping_address'])) {
38: | $data['postcode'] = $this->session->data['shipping_address']['postcode'];
39: | $data['country_id'] = $this->session->data['shipping_address']['country_id'];
40: | $data['zone_id'] = $this->session->data['shipping_address']['zone_id'];
41: | } else {
42: | $data['postcode'] = '';
43: | $data['country_id'] = (int)$this->config->get('config_country_id');
44: | $data['zone_id'] = '';
45: | }
46: |
47: | // Custom Fields
48: | $data['custom_fields'] = [];
49: |
50: | $this->load->model('account/custom_field');
51: |
52: | $custom_fields = $this->model_account_custom_field->getCustomFields($this->customer->getGroupId());
53: |
54: | foreach ($custom_fields as $custom_field) {
55: | if ($custom_field['location'] == 'address') {
56: | $data['custom_fields'][] = $custom_field;
57: | }
58: | }
59: |
60: | $data['language'] = $this->config->get('config_language');
61: |
62: | return $this->load->view('checkout/shipping_address', $data);
63: | }
64: |
65: | /**
66: | * Save
67: | *
68: | * @return void
69: | */
70: | public function save(): void {
71: | $this->load->language('checkout/shipping_address');
72: |
73: | $json = [];
74: |
75: | // Validate cart has products and has stock.
76: | if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
77: | $json['redirect'] = $this->url->link('checkout/cart', 'language=' . $this->config->get('config_language'), true);
78: | }
79: |
80: | // Validate minimum quantity requirements.
81: | $products = $this->cart->getProducts();
82: |
83: | foreach ($products as $product) {
84: | if (!$product['minimum']) {
85: | $json['redirect'] = $this->url->link('checkout/cart', 'language=' . $this->config->get('config_language'), true);
86: |
87: | break;
88: | }
89: | }
90: |
91: | // Validate if customer is logged in or customer session data is not set
92: | if (!$this->customer->isLogged() || !isset($this->session->data['customer'])) {
93: | $json['redirect'] = $this->url->link('account/login', 'language=' . $this->config->get('config_language'), true);
94: | }
95: |
96: | // Validate if shipping not required
97: | if (!$this->cart->hasShipping()) {
98: | $json['redirect'] = $this->url->link('checkout/cart', 'language=' . $this->config->get('config_language'), true);
99: | }
100: |
101: | if (!$json) {
102: | $keys = [
103: | 'firstname',
104: | 'lastname',
105: | 'company',
106: | 'address_1',
107: | 'address_2',
108: | 'city',
109: | 'postcode',
110: | 'country_id',
111: | 'zone_id',
112: | 'custom_field'
113: | ];
114: |
115: | foreach ($keys as $key) {
116: | if (!isset($this->request->post[$key])) {
117: | $this->request->post[$key] = '';
118: | }
119: | }
120: |
121: | if ((oc_strlen($this->request->post['firstname']) < 1) || (oc_strlen($this->request->post['firstname']) > 32)) {
122: | $json['error']['firstname'] = $this->language->get('error_firstname');
123: | }
124: |
125: | if ((oc_strlen($this->request->post['lastname']) < 1) || (oc_strlen($this->request->post['lastname']) > 32)) {
126: | $json['error']['lastname'] = $this->language->get('error_lastname');
127: | }
128: |
129: | if ((oc_strlen($this->request->post['address_1']) < 3) || (oc_strlen($this->request->post['address_1']) > 128)) {
130: | $json['error']['address_1'] = $this->language->get('error_address_1');
131: | }
132: |
133: | if ((oc_strlen($this->request->post['city']) < 2) || (oc_strlen($this->request->post['city']) > 128)) {
134: | $json['error']['city'] = $this->language->get('error_city');
135: | }
136: |
137: | $this->load->model('localisation/country');
138: |
139: | $country_info = $this->model_localisation_country->getCountry((int)$this->request->post['country_id']);
140: |
141: | if ($country_info && $country_info['postcode_required'] && (oc_strlen($this->request->post['postcode']) < 2 || oc_strlen($this->request->post['postcode']) > 10)) {
142: | $json['error']['postcode'] = $this->language->get('error_postcode');
143: | }
144: |
145: | if (!$country_info || $this->request->post['country_id'] == '') {
146: | $json['error']['country'] = $this->language->get('error_country');
147: | }
148: |
149: | if ($this->request->post['zone_id'] == '') {
150: | $json['error']['zone'] = $this->language->get('error_zone');
151: | }
152: |
153: | // Custom field validation
154: | $this->load->model('account/custom_field');
155: |
156: | $custom_fields = $this->model_account_custom_field->getCustomFields($this->customer->getGroupId());
157: |
158: | foreach ($custom_fields as $custom_field) {
159: | if ($custom_field['location'] == 'address') {
160: | if ($custom_field['required'] && empty($this->request->post['custom_field'][$custom_field['custom_field_id']])) {
161: | $json['error']['custom_field_' . $custom_field['custom_field_id']] = sprintf($this->language->get('error_custom_field'), $custom_field['name']);
162: | } elseif (($custom_field['type'] == 'text') && !empty($custom_field['validation']) && !preg_match(html_entity_decode($custom_field['validation'], ENT_QUOTES, 'UTF-8'), $this->request->post['custom_field'][$custom_field['custom_field_id']])) {
163: | $json['error']['custom_field_' . $custom_field['custom_field_id']] = sprintf($this->language->get('error_regex'), $custom_field['name']);
164: | }
165: | }
166: | }
167: | }
168: |
169: | if (!$json) {
170: | // If no default address add it
171: | $address_id = $this->customer->getAddressId();
172: |
173: | if (!$address_id) {
174: | $this->request->post['default'] = 1;
175: | }
176: |
177: | $this->load->model('account/address');
178: |
179: | $json['address_id'] = $this->model_account_address->addAddress($this->customer->getId(), $this->request->post);
180: |
181: | $json['addresses'] = $this->model_account_address->getAddresses($this->customer->getId());
182: |
183: | $this->session->data['shipping_address'] = $this->model_account_address->getAddress($this->customer->getId(), $json['address_id']);
184: |
185: | $json['success'] = $this->language->get('text_success');
186: |
187: | // Clear payment and shipping methods
188: | unset($this->session->data['shipping_method']);
189: | unset($this->session->data['shipping_methods']);
190: | unset($this->session->data['payment_method']);
191: | unset($this->session->data['payment_methods']);
192: | }
193: |
194: | $this->response->addHeader('Content-Type: application/json');
195: | $this->response->setOutput(json_encode($json));
196: | }
197: |
198: | /**
199: | * Address
200: | *
201: | * @return void
202: | */
203: | public function address(): void {
204: | $this->load->language('checkout/shipping_address');
205: |
206: | $json = [];
207: |
208: | if (isset($this->request->get['address_id'])) {
209: | $address_id = (int)$this->request->get['address_id'];
210: | } else {
211: | $address_id = 0;
212: | }
213: |
214: | // Validate cart has products and has stock.
215: | if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
216: | $json['redirect'] = $this->url->link('checkout/cart', 'language=' . $this->config->get('config_language'), true);
217: | }
218: |
219: | // Validate minimum quantity requirements.
220: | $products = $this->cart->getProducts();
221: |
222: | foreach ($products as $product) {
223: | if (!$product['minimum']) {
224: | $json['redirect'] = $this->url->link('checkout/cart', 'language=' . $this->config->get('config_language'), true);
225: |
226: | break;
227: | }
228: | }
229: |
230: | // Validate if customer is logged in or customer session data is not set
231: | if (!$this->customer->isLogged() || !isset($this->session->data['customer'])) {
232: | $json['redirect'] = $this->url->link('account/login', 'language=' . $this->config->get('config_language'), true);
233: | }
234: |
235: | // Validate if shipping is not required
236: | if (!$this->cart->hasShipping()) {
237: | $json['redirect'] = $this->url->link('checkout/cart', 'language=' . $this->config->get('config_language'), true);
238: | }
239: |
240: | if (!$json) {
241: | $this->load->model('account/address');
242: |
243: | $address_info = $this->model_account_address->getAddress($this->customer->getId(), $address_id);
244: |
245: | if (!$address_info) {
246: | $json['error'] = $this->language->get('error_address');
247: |
248: | unset($this->session->data['shipping_address']);
249: | unset($this->session->data['shipping_method']);
250: | unset($this->session->data['shipping_methods']);
251: | unset($this->session->data['payment_method']);
252: | unset($this->session->data['payment_methods']);
253: | }
254: | }
255: |
256: | if (!$json) {
257: | $this->session->data['shipping_address'] = $address_info;
258: |
259: | $json['success'] = $this->language->get('text_success');
260: |
261: | // Clear payment and shipping methods
262: | unset($this->session->data['shipping_method']);
263: | unset($this->session->data['shipping_methods']);
264: | unset($this->session->data['payment_method']);
265: | unset($this->session->data['payment_methods']);
266: | }
267: |
268: | $this->response->addHeader('Content-Type: application/json');
269: | $this->response->setOutput(json_encode($json));
270: | }
271: | }
272: |

OpenCart API API documentation generated by ApiGen dev-master