docs/api/source-admin.controller.catalog.product.html
| 1: | <?php | | 2: | namespace Opencart\Admin\Controller\Catalog; | | 3: | /** | | 4: | * Class Product | | 5: | * | | 6: | * @package Opencart\Admin\Controller\Catalog | | 7: | */ | | 8: | class Product extends \Opencart\System\Engine\Controller { | | 9: | /** | | 10: | * Index | | 11: | * | | 12: | * @return void | | 13: | */ | | 14: | public function index(): void { | | 15: | $this->load->language('catalog/product'); | | 16: | | | 17: | $this->document->setTitle($this->language->get('heading_title')); | | 18: | | | 19: | if (isset($this->request->get['filter_name'])) { | | 20: | $filter_name = $this->request->get['filter_name']; | | 21: | } else { | | 22: | $filter_name = ''; | | 23: | } | | 24: | | | 25: | if (isset($this->request->get['filter_model'])) { | | 26: | $filter_model = $this->request->get['filter_model']; | | 27: | } else { | | 28: | $filter_model = ''; | | 29: | } | | 30: | | | 31: | if (isset($this->request->get['filter_price'])) { | | 32: | $filter_price = $this->request->get['filter_price']; | | 33: | } else { | | 34: | $filter_price = ''; | | 35: | } | | 36: | | | 37: | if (isset($this->request->get['filter_quantity'])) { | | 38: | $filter_quantity = $this->request->get['filter_quantity']; | | 39: | } else { | | 40: | $filter_quantity = ''; | | 41: | } | | 42: | | | 43: | if (isset($this->request->get['filter_status'])) { | | 44: | $filter_status = $this->request->get['filter_status']; | | 45: | } else { | | 46: | $filter_status = ''; | | 47: | } | | 48: | | | 49: | $url = ''; | | 50: | | | 51: | if (isset($this->request->get['filter_name'])) { | | 52: | $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); | | 53: | } | | 54: | | | 55: | if (isset($this->request->get['filter_model'])) { | | 56: | $url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8')); | | 57: | } | | 58: | | | 59: | if (isset($this->request->get['filter_price'])) { | | 60: | $url .= '&filter_price=' . $this->request->get['filter_price']; | | 61: | } | | 62: | | | 63: | if (isset($this->request->get['filter_quantity'])) { | | 64: | $url .= '&filter_quantity=' . $this->request->get['filter_quantity']; | | 65: | } | | 66: | | | 67: | if (isset($this->request->get['filter_status'])) { | | 68: | $url .= '&filter_status=' . $this->request->get['filter_status']; | | 69: | } | | 70: | | | 71: | if (isset($this->request->get['sort'])) { | | 72: | $url .= '&sort=' . $this->request->get['sort']; | | 73: | } | | 74: | | | 75: | if (isset($this->request->get['order'])) { | | 76: | $url .= '&order=' . $this->request->get['order']; | | 77: | } | | 78: | | | 79: | if (isset($this->request->get['page'])) { | | 80: | $url .= '&page=' . $this->request->get['page']; | | 81: | } | | 82: | | | 83: | $data['breadcrumbs'] = []; | | 84: | | | 85: | $data['breadcrumbs'][] = [ | | 86: | 'text' => $this->language->get('text_home'), | | 87: | 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token']) | | 88: | ]; | | 89: | | | 90: | $data['breadcrumbs'][] = [ | | 91: | 'text' => $this->language->get('heading_title'), | | 92: | 'href' => $this->url->link('catalog/product', 'user_token=' . $this->session->data['user_token'] . $url) | | 93: | ]; | | 94: | | | 95: | $data['add'] = $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . $url); | | 96: | $data['copy'] = $this->url->link('catalog/product.copy', 'user_token=' . $this->session->data['user_token']); | | 97: | $data['delete'] = $this->url->link('catalog/product.delete', 'user_token=' . $this->session->data['user_token']); | | 98: | | | 99: | $data['list'] = $this->controller_catalog_product->getList(); | | 100: | | | 101: | $data['filter_name'] = $filter_name; | | 102: | $data['filter_model'] = $filter_model; | | 103: | $data['filter_price'] = $filter_price; | | 104: | $data['filter_quantity'] = $filter_quantity; | | 105: | $data['filter_status'] = $filter_status; | | 106: | | | 107: | $data['user_token'] = $this->session->data['user_token']; | | 108: | | | 109: | $data['header'] = $this->load->controller('common/header'); | | 110: | $data['column_left'] = $this->load->controller('common/column_left'); | | 111: | $data['footer'] = $this->load->controller('common/footer'); | | 112: | | | 113: | $this->response->setOutput($this->load->view('catalog/product', $data)); | | 114: | } | | 115: | | | 116: | /** | | 117: | * List | | 118: | * | | 119: | * @return void | | 120: | */ | | 121: | public function list(): void { | | 122: | $this->load->language('catalog/product'); | | 123: | | | 124: | $this->response->setOutput($this->controller_catalog_product->getList()); | | 125: | } | | 126: | | | 127: | /** | | 128: | * @return string | | 129: | */ | | 130: | protected function getList(): string { | | 131: | if (isset($this->request->get['filter_name'])) { | | 132: | $filter_name = $this->request->get['filter_name']; | | 133: | } else { | | 134: | $filter_name = ''; | | 135: | } | | 136: | | | 137: | if (isset($this->request->get['filter_model'])) { | | 138: | $filter_model = $this->request->get['filter_model']; | | 139: | } else { | | 140: | $filter_model = ''; | | 141: | } | | 142: | | | 143: | if (isset($this->request->get['filter_price'])) { | | 144: | $filter_price = $this->request->get['filter_price']; | | 145: | } else { | | 146: | $filter_price = ''; | | 147: | } | | 148: | | | 149: | if (isset($this->request->get['filter_quantity'])) { | | 150: | $filter_quantity = $this->request->get['filter_quantity']; | | 151: | } else { | | 152: | $filter_quantity = ''; | | 153: | } | | 154: | | | 155: | if (isset($this->request->get['filter_status'])) { | | 156: | $filter_status = $this->request->get['filter_status']; | | 157: | } else { | | 158: | $filter_status = ''; | | 159: | } | | 160: | | | 161: | if (isset($this->request->get['sort'])) { | | 162: | $sort = (string)$this->request->get['sort']; | | 163: | } else { | | 164: | $sort = 'pd.name'; | | 165: | } | | 166: | | | 167: | if (isset($this->request->get['order'])) { | | 168: | $order = (string)$this->request->get['order']; | | 169: | } else { | | 170: | $order = 'ASC'; | | 171: | } | | 172: | | | 173: | if (isset($this->request->get['page'])) { | | 174: | $page = (int)$this->request->get['page']; | | 175: | } else { | | 176: | $page = 1; | | 177: | } | | 178: | | | 179: | $url = ''; | | 180: | | | 181: | if (isset($this->request->get['filter_name'])) { | | 182: | $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); | | 183: | } | | 184: | | | 185: | if (isset($this->request->get['filter_model'])) { | | 186: | $url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8')); | | 187: | } | | 188: | | | 189: | if (isset($this->request->get['filter_price'])) { | | 190: | $url .= '&filter_price=' . $this->request->get['filter_price']; | | 191: | } | | 192: | | | 193: | if (isset($this->request->get['filter_quantity'])) { | | 194: | $url .= '&filter_quantity=' . $this->request->get['filter_quantity']; | | 195: | } | | 196: | | | 197: | if (isset($this->request->get['filter_status'])) { | | 198: | $url .= '&filter_status=' . $this->request->get['filter_status']; | | 199: | } | | 200: | | | 201: | if (isset($this->request->get['page'])) { | | 202: | $url .= '&page=' . $this->request->get['page']; | | 203: | } | | 204: | | | 205: | $data['action'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . $url); | | 206: | | | 207: | $data['products'] = []; | | 208: | | | 209: | $filter_data = [ | | 210: | 'filter_name' => $filter_name, | | 211: | 'filter_model' => $filter_model, | | 212: | 'filter_price' => $filter_price, | | 213: | 'filter_quantity' => $filter_quantity, | | 214: | 'filter_status' => $filter_status, | | 215: | 'sort' => $sort, | | 216: | 'order' => $order, | | 217: | 'start' => ($page - 1) * $this->config->get('config_pagination_admin'), | | 218: | 'limit' => $this->config->get('config_pagination_admin') | | 219: | ]; | | 220: | | | 221: | $this->load->model('catalog/product'); | | 222: | $this->load->model('tool/image'); | | 223: | | | 224: | $results = $this->model_catalog_product->getProducts($filter_data); | | 225: | | | 226: | foreach ($results as $result) { | | 227: | if ($result['image'] && is_file(DIR_IMAGE . html_entity_decode($result['image'], ENT_QUOTES, 'UTF-8'))) { | | 228: | $image = $result['image']; | | 229: | } else { | | 230: | $image = 'no_image.png'; | | 231: | } | | 232: | | | 233: | $special = false; | | 234: | | | 235: | $product_specials = $this->model_catalog_product->getSpecials($result['product_id']); | | 236: | | | 237: | foreach ($product_specials as $product_special) { | | 238: | if (($product_special['date_start'] == '0000-00-00' || strtotime($product_special['date_start']) < time()) && ($product_special['date_end'] == '0000-00-00' || strtotime($product_special['date_end']) > time())) { | | 239: | $special = $this->currency->format($product_special['price'], $this->config->get('config_currency')); | | 240: | | | 241: | break; | | 242: | } | | 243: | } | | 244: | | | 245: | $data['products'][] = [ | | 246: | 'product_id' => $result['product_id'], | | 247: | 'image' => $this->model_tool_image->resize($image, 40, 40), | | 248: | 'name' => $result['name'], | | 249: | 'model' => $result['model'], | | 250: | 'price' => $this->currency->format($result['price'], $this->config->get('config_currency')), | | 251: | 'special' => $special, | | 252: | 'quantity' => $result['quantity'], | | 253: | 'status' => $result['status'], | | 254: | 'edit' => $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . '&product_id=' . $result['product_id'] . ($result['master_id'] ? '&master_id=' . $result['master_id'] : '') . $url), | | 255: | 'variant' => (!$result['master_id'] ? $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . '&master_id=' . $result['product_id'] . $url) : '') | | 256: | ]; | | 257: | } | | 258: | | | 259: | $url = ''; | | 260: | | | 261: | if (isset($this->request->get['filter_name'])) { | | 262: | $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); | | 263: | } | | 264: | | | 265: | if (isset($this->request->get['filter_model'])) { | | 266: | $url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8')); | | 267: | } | | 268: | | | 269: | if (isset($this->request->get['filter_price'])) { | | 270: | $url .= '&filter_price=' . $this->request->get['filter_price']; | | 271: | } | | 272: | | | 273: | if (isset($this->request->get['filter_quantity'])) { | | 274: | $url .= '&filter_quantity=' . $this->request->get['filter_quantity']; | | 275: | } | | 276: | | | 277: | if (isset($this->request->get['filter_status'])) { | | 278: | $url .= '&filter_status=' . $this->request->get['filter_status']; | | 279: | } | | 280: | | | 281: | if ($order == 'ASC') { | | 282: | $url .= '&order=DESC'; | | 283: | } else { | | 284: | $url .= '&order=ASC'; | | 285: | } | | 286: | | | 287: | $data['sort_name'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=pd.name' . $url); | | 288: | $data['sort_model'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.model' . $url); | | 289: | $data['sort_price'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.price' . $url); | | 290: | $data['sort_quantity'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.quantity' . $url); | | 291: | $data['sort_order'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.sort_order' . $url); | | 292: | | | 293: | $url = ''; | | 294: | | | 295: | if (isset($this->request->get['filter_name'])) { | | 296: | $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); | | 297: | } | | 298: | | | 299: | if (isset($this->request->get['filter_model'])) { | | 300: | $url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8')); | | 301: | } | | 302: | | | 303: | if (isset($this->request->get['filter_price'])) { | | 304: | $url .= '&filter_price=' . $this->request->get['filter_price']; | | 305: | } | | 306: | | | 307: | if (isset($this->request->get['filter_quantity'])) { | | 308: | $url .= '&filter_quantity=' . $this->request->get['filter_quantity']; | | 309: | } | | 310: | | | 311: | if (isset($this->request->get['filter_status'])) { | | 312: | $url .= '&filter_status=' . $this->request->get['filter_status']; | | 313: | } | | 314: | | | 315: | if (isset($this->request->get['sort'])) { | | 316: | $url .= '&sort=' . $this->request->get['sort']; | | 317: | } | | 318: | | | 319: | if (isset($this->request->get['order'])) { | | 320: | $url .= '&order=' . $this->request->get['order']; | | 321: | } | | 322: | | | 323: | $product_total = $this->model_catalog_product->getTotalProducts($filter_data); | | 324: | | | 325: | $data['pagination'] = $this->load->controller('common/pagination', [ | | 326: | 'total' => $product_total, | | 327: | 'page' => $page, | | 328: | 'limit' => $this->config->get('config_pagination_admin'), | | 329: | 'url' => $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . $url . '&page={page}') | | 330: | ]); | | 331: | | | 332: | $data['results'] = sprintf($this->language->get('text_pagination'), ($product_total) ? (($page - 1) * $this->config->get('config_pagination_admin')) + 1 : 0, ((($page - 1) * $this->config->get('config_pagination_admin')) > ($product_total - $this->config->get('config_pagination_admin'))) ? $product_total : ((($page - 1) * $this->config->get('config_pagination_admin')) + $this->config->get('config_pagination_admin')), $product_total, ceil($product_total / $this->config->get('config_pagination_admin'))); | | 333: | | | 334: | $data['sort'] = $sort; | | 335: | $data['order'] = $order; | | 336: | | | 337: | return $this->load->view('catalog/product_list', $data); | | 338: | } | | 339: | | | 340: | /** | | 341: | * Form | | 342: | * | | 343: | * @return void | | 344: | */ | | 345: | public function form(): void { | | 346: | $this->load->language('catalog/product'); | | 347: | | | 348: | $this->document->setTitle($this->language->get('heading_title')); | | 349: | | | 350: | $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); | | 351: | $this->document->addScript('view/javascript/ckeditor/adapters/jquery.js'); | | 352: | | | 353: | $data['text_form'] = !isset($this->request->get['product_id']) ? $this->language->get('text_add') : $this->language->get('text_edit'); | | 354: | | | 355: | $data['error_upload_size'] = sprintf($this->language->get('error_upload_size'), $this->config->get('config_file_max_size')); | | 356: | | | 357: | $data['config_file_max_size'] = ((int)$this->config->get('config_file_max_size') * 1024 * 1024); | | 358: | | | 359: | if (isset($this->request->get['master_id'])) { | | 360: | $this->load->model('catalog/product'); | | 361: | | | 362: | $url = $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . '&product_id=' . $this->request->get['master_id']); | | 363: | | | 364: | $data['text_variant'] = sprintf($this->language->get('text_variant'), $url, $url); | | 365: | } else { | | 366: | $data['text_variant'] = ''; | | 367: | } | | 368: | | | 369: | $url = ''; | | 370: | | | 371: | if (isset($this->request->get['master_id'])) { | | 372: | $url .= '&master_id=' . $this->request->get['master_id']; | | 373: | } | | 374: | | | 375: | if (isset($this->request->get['filter_name'])) { | | 376: | $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); | | 377: | } | | 378: | | | 379: | if (isset($this->request->get['filter_model'])) { | | 380: | $url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8')); | | 381: | } | | 382: | | | 383: | if (isset($this->request->get['filter_price'])) { | | 384: | $url .= '&filter_price=' . $this->request->get['filter_price']; | | 385: | } | | 386: | | | 387: | if (isset($this->request->get['filter_quantity'])) { | | 388: | $url .= '&filter_quantity=' . $this->request->get['filter_quantity']; | | 389: | } | | 390: | | | 391: | if (isset($this->request->get['filter_status'])) { | | 392: | $url .= '&filter_status=' . $this->request->get['filter_status']; | | 393: | } | | 394: | | | 395: | if (isset($this->request->get['sort'])) { | | 396: | $url .= '&sort=' . $this->request->get['sort']; | | 397: | } | | 398: | | | 399: | if (isset($this->request->get['order'])) { | | 400: | $url .= '&order=' . $this->request->get['order']; | | 401: | } | | 402: | | | 403: | if (isset($this->request->get['page'])) { | | 404: | $url .= '&page=' . $this->request->get['page']; | | 405: | } | | 406: | | | 407: | $data['breadcrumbs'] = []; | | 408: | | | 409: | $data['breadcrumbs'][] = [ | | 410: | 'text' => $this->language->get('text_home'), | | 411: | 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token']) | | 412: | ]; | | 413: | | | 414: | $data['breadcrumbs'][] = [ | | 415: | 'text' => $this->language->get('heading_title'), | | 416: | 'href' => $this->url->link('catalog/product', 'user_token=' . $this->session->data['user_token'] . $url) | | 417: | ]; | | 418: | | | 419: | $url = ''; | | 420: | | | 421: | if (isset($this->request->get['filter_name'])) { | | 422: | $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8')); | | 423: | } | | 424: | | | 425: | if (isset($this->request->get['filter_model'])) { | | 426: | $url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8')); | | 427: | } | | 428: | | | 429: | if (isset($this->request->get['filter_price'])) { | | 430: | $url .= '&filter_price=' . $this->request->get['filter_price']; | | 431: | } | | 432: | | | 433: | if (isset($this->request->get['filter_quantity'])) { | | 434: | $url .= '&filter_quantity=' . $this->request->get['filter_quantity']; | | 435: | } | | 436: | | | 437: | if (isset($this->request->get['filter_status'])) { | | 438: | $url .= '&filter_status=' . $this->request->get['filter_status']; | | 439: | } | | 440: | | | 441: | if (isset($this->request->get['sort'])) { | | 442: | $url .= '&sort=' . $this->request->get['sort']; | | 443: | } | | 444: | | | 445: | if (isset($this->request->get['order'])) { | | 446: | $url .= '&order=' . $this->request->get['order']; | | 447: | } | | 448: | | | 449: | if (isset($this->request->get['page'])) { | | 450: | $url .= '&page=' . $this->request->get['page']; | | 451: | } | | 452: | | | 453: | $data['save'] = $this->url->link('catalog/product.save', 'user_token=' . $this->session->data['user_token']); | | 454: | $data['back'] = $this->url->link('catalog/product', 'user_token=' . $this->session->data['user_token'] . $url); | | 455: | $data['upload'] = $this->url->link('tool/upload.upload', 'user_token=' . $this->session->data['user_token']); | | 456: | | | 457: | if (isset($this->request->get['product_id'])) { | | 458: | $data['product_id'] = (int)$this->request->get['product_id']; | | 459: | } else { | | 460: | $data['product_id'] = 0; | | 461: | } | | 462: | | | 463: | // If the product_id is the master_id, we need to get the variant info | | 464: | if (isset($this->request->get['product_id'])) { | | 465: | $product_id = (int)$this->request->get['product_id']; | | 466: | } elseif (isset($this->request->get['master_id'])) { | | 467: | $product_id = (int)$this->request->get['master_id']; | | 468: | } else { | | 469: | $product_id = 0; | | 470: | } | | 471: | | | 472: | if ($product_id) { | | 473: | $this->load->model('catalog/product'); | | 474: | | | 475: | $product_info = $this->model_catalog_product->getProduct($product_id); | | 476: | } | | 477: | | | 478: | if (isset($this->request->get['master_id'])) { | | 479: | $data['master_id'] = (int)$this->request->get['master_id']; | | 480: | } elseif (!empty($product_info)) { | | 481: | $data['master_id'] = $product_info['master_id']; | | 482: | } else { | | 483: | $data['master_id'] = 0; | | 484: | } | | 485: | | | 486: | $this->load->model('localisation/language'); | | 487: | | | 488: | $data['languages'] = $this->model_localisation_language->getLanguages(); | | 489: | | | 490: | if (!empty($product_info)) { | | 491: | $data['product_description'] = $this->model_catalog_product->getDescriptions($product_id); | | 492: | } else { | | 493: | $data['product_description'] = []; | | 494: | } | | 495: | | | 496: | if (!empty($product_info)) { | | 497: | $data['model'] = $product_info['model']; | | 498: | } else { | | 499: | $data['model'] = ''; | | 500: | } | | 501: | | | 502: | if (!empty($product_info)) { | | 503: | $data['sku'] = $product_info['sku']; | | 504: | } else { | | 505: | $data['sku'] = ''; | | 506: | } | | 507: | | | 508: | if (!empty($product_info)) { | | 509: | $data['upc'] = $product_info['upc']; | | 510: | } else { | | 511: | $data['upc'] = ''; | | 512: | } | | 513: | | | 514: | if (!empty($product_info)) { | | 515: | $data['ean'] = $product_info['ean']; | | 516: | } else { | | 517: | $data['ean'] = ''; | | 518: | } | | 519: | | | 520: | if (!empty($product_info)) { | | 521: | $data['jan'] = $product_info['jan']; | | 522: | } else { | | 523: | $data['jan'] = ''; | | 524: | } | | 525: | | | 526: | if (!empty($product_info)) { | | 527: | $data['isbn'] = $product_info['isbn']; | | 528: | } else { | | 529: | $data['isbn'] = ''; | | 530: | } | | 531: | | | 532: | if (!empty($product_info)) { | | 533: | $data['mpn'] = $product_info['mpn']; | | 534: | } else { | | 535: | $data['mpn'] = ''; | | 536: | } | | 537: | | | 538: | if (!empty($product_info)) { | | 539: | $data['location'] = $product_info['location']; | | 540: | } else { | | 541: | $data['location'] = ''; | | 542: | } | | 543: | | | 544: | if (!empty($product_info)) { | | 545: | $data['price'] = $product_info['price']; | | 546: | } else { | | 547: | $data['price'] = ''; | | 548: | } | | 549: | | | 550: | $this->load->model('localisation/tax_class'); | | 551: | | | 552: | $data['tax_classes'] = $this->model_localisation_tax_class->getTaxClasses(); | | 553: | | | 554: | if (!empty($product_info)) { | | 555: | $data['tax_class_id'] = $product_info['tax_class_id']; | | 556: | } else { | | 557: | $data['tax_class_id'] = 0; | | 558: | } | | 559: | | | 560: | if (!empty($product_info)) { | | 561: | $data['quantity'] = $product_info['quantity']; | | 562: | } else { | | 563: | $data['quantity'] = 1; | | 564: | } | | 565: | | | 566: | if (!empty($product_info)) { | | 567: | $data['minimum'] = $product_info['minimum']; | | 568: | } else { | | 569: | $data['minimum'] = 1; | | 570: | } | | 571: | | | 572: | if (!empty($product_info)) { | | 573: | $data['subtract'] = $product_info['subtract']; | | 574: | } else { | | 575: | $data['subtract'] = 1; | | 576: | } | | 577: | | | 578: | $this->load->model('localisation/stock_status'); | | 579: | | | 580: | $data['stock_statuses'] = $this->model_localisation_stock_status->getStockStatuses(); | | 581: | | | 582: | if (!empty($product_info)) { | | 583: | $data['stock_status_id'] = $product_info['stock_status_id']; | | 584: | } else { | | 585: | $data['stock_status_id'] = 0; | | 586: | } | | 587: | | | 588: | if (!empty($product_info)) { | | 589: | $data['date_available'] = ($product_info['date_available'] != '0000-00-00') ? $product_info['date_available'] : ''; | | 590: | } else { | | 591: | $data['date_available'] = date('Y-m-d'); | | 592: | } | | 593: | | | 594: | if (!empty($product_info)) { | | 595: | $data['shipping'] = $product_info['shipping']; | | 596: | } else { | | 597: | $data['shipping'] = 1; | | 598: | } | | 599: | | | 600: | if (!empty($product_info)) { | | 601: | $data['length'] = $product_info['length']; | | 602: | } else { | | 603: | $data['length'] = ''; | | 604: | } | | 605: | | | 606: | if (!empty($product_info)) { | | 607: | $data['width'] = $product_info['width']; | | 608: | } else { | | 609: | $data['width'] = ''; | | 610: | } | | 611: | | | 612: | if (!empty($product_info)) { | | 613: | $data['height'] = $product_info['height']; | | 614: | } else { | | 615: | $data['height'] = ''; | | 616: | } | | 617: | | | 618: | $this->load->model('localisation/length_class'); | | 619: | | | 620: | $data['length_classes'] = $this->model_localisation_length_class->getLengthClasses(); | | 621: | | | 622: | if (!empty($product_info)) { | | 623: | $data['length_class_id'] = $product_info['length_class_id']; | | 624: | } else { | | 625: | $data['length_class_id'] = $this->config->get('config_length_class_id'); | | 626: | } | | 627: | | | 628: | if (!empty($product_info)) { | | 629: | $data['weight'] = $product_info['weight']; | | 630: | } else { | | 631: | $data['weight'] = ''; | | 632: | } | | 633: | | | 634: | $this->load->model('localisation/weight_class'); | | 635: | | | 636: | $data['weight_classes'] = $this->model_localisation_weight_class->getWeightClasses(); | | 637: | | | 638: | if (!empty($product_info)) { | | 639: | $data['weight_class_id'] = $product_info['weight_class_id']; | | 640: | } else { | | 641: | $data['weight_class_id'] = $this->config->get('config_weight_class_id'); | | 642: | } | | 643: | | | 644: | if (!empty($product_info)) { | | 645: | $data['status'] = $product_info['status']; | | 646: | } else { | | 647: | $data['status'] = true; | | 648: | } | | 649: | | | 650: | if (!empty($product_info)) { | | 651: | $data['sort_order'] = $product_info['sort_order']; | | 652: | } else { | | 653: | $data['sort_order'] = 1; | | 654: | } | | 655: | | | 656: | $this->load->model('catalog/manufacturer'); | | 657: | | | 658: | if (!empty($product_info)) { | | 659: | $data['manufacturer_id'] = $product_info['manufacturer_id']; | | 660: | } else { | | 661: | $data['manufacturer_id'] = 0; | | 662: | } | | 663: | | | 664: | if (!empty($product_info)) { | | 665: | $manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($product_info['manufacturer_id']); | | 666: | | | 667: | if ($manufacturer_info) { | | 668: | $data['manufacturer'] = $manufacturer_info['name']; | | 669: | } else { | | 670: | $data['manufacturer'] = ''; | | 671: | } | | 672: | } else { | | 673: | $data['manufacturer'] = ''; | | 674: | } | | 675: | | | 676: | // Categories | | 677: | $this->load->model('catalog/category'); | | 678: | | | 679: | if ($product_id) { | | 680: | $categories = $this->model_catalog_product->getCategories($product_id); | | 681: | } else { | | 682: | $categories = []; | | 683: | } | | 684: | | | 685: | $data['product_categories'] = []; | | 686: | | | 687: | foreach ($categories as $category_id) { | | 688: | $category_info = $this->model_catalog_category->getCategory($category_id); | | 689: | | | 690: | if ($category_info) { | | 691: | $data['product_categories'][] = [ | | 692: | 'category_id' => $category_info['category_id'], | | 693: | 'name' => ($category_info['path']) ? $category_info['path'] . ' > ' . $category_info['name'] : $category_info['name'] | | 694: | ]; | | 695: | } | | 696: | } | | 697: | | | 698: | // Filters | | 699: | $this->load->model('catalog/filter'); | | 700: | | | 701: | if (!empty($product_info)) { | | 702: | $filters = $this->model_catalog_product->getFilters($product_id); | | 703: | } else { | | 704: | $filters = []; | | 705: | } | | 706: | | | 707: | $data['product_filters'] = []; | | 708: | | | 709: | foreach ($filters as $filter_id) { | | 710: | $filter_info = $this->model_catalog_filter->getFilter($filter_id); | | 711: | | | 712: | if ($filter_info) { | | 713: | $data['product_filters'][] = [ | | 714: | 'filter_id' => $filter_info['filter_id'], | | 715: | 'name' => $filter_info['group'] . ' > ' . $filter_info['name'] | | 716: | ]; | | 717: | } | | 718: | } | | 719: | | | 720: | // Stores | | 721: | $data['stores'] = []; | | 722: | | | 723: | $data['stores'][] = [ | | 724: | 'store_id' => 0, | | 725: | 'name' => $this->language->get('text_default') | | 726: | ]; | | 727: | | | 728: | $this->load->model('setting/store'); | | 729: | | | 730: | $stores = $this->model_setting_store->getStores(); | | 731: | | | 732: | foreach ($stores as $store) { | | 733: | $data['stores'][] = [ | | 734: | 'store_id' => $store['store_id'], | | 735: | 'name' => $store['name'] | | 736: | ]; | | 737: | } | | 738: | | | 739: | if ($product_id) { | | 740: | $data['product_store'] = $this->model_catalog_product->getStores($product_id); | | 741: | } else { | | 742: | $data['product_store'] = [0]; | | 743: | } | | 744: | | | 745: | // Downloads | | 746: | $this->load->model('catalog/download'); | | 747: | | | 748: | if ($product_id) { | | 749: | $product_downloads = $this->model_catalog_product->getDownloads($product_id); | | 750: | } else { | | 751: | $product_downloads = []; | | 752: | } | | 753: | | | 754: | $data['product_downloads'] = []; | | 755: | | | 756: | foreach ($product_downloads as $download_id) { | | 757: | $download_info = $this->model_catalog_download->getDownload($download_id); | | 758: | | | 759: | if ($download_info) { | | 760: | $data['product_downloads'][] = [ | | 761: | 'download_id' => $download_info['download_id'], | | 762: | 'name' => $download_info['name'] | | 763: | ]; | | 764: | } | | 765: | } | | 766: | | | 767: | // Related | | 768: | if ($product_id) { | | 769: | $product_relateds = $this->model_catalog_product->getRelated($product_id); | | 770: | } else { | | 771: | $product_relateds = []; | | 772: | } | | 773: | | | 774: | $data['product_relateds'] = []; | | 775: | | | 776: | foreach ($product_relateds as $related_id) { | | 777: | $related_info = $this->model_catalog_product->getProduct($related_id); | | 778: | | | 779: | if ($related_info) { | | 780: | $data['product_relateds'][] = [ | | 781: | 'product_id' => $related_info['product_id'], | | 782: | 'name' => $related_info['name'] | | 783: | ]; | | 784: | } | | 785: | } | | 786: | | | 787: | // Attributes | | 788: | $this->load->model('catalog/attribute'); | | 789: | | | 790: | if ($product_id) { | | 791: | $product_attributes = $this->model_catalog_product->getAttributes($product_id); | | 792: | } else { | | 793: | $product_attributes = []; | | 794: | } | | 795: | | | 796: | $data['product_attributes'] = []; | | 797: | | | 798: | foreach ($product_attributes as $product_attribute) { | | 799: | $attribute_info = $this->model_catalog_attribute->getAttribute($product_attribute['attribute_id']); | | 800: | | | 801: | if ($attribute_info) { | | 802: | $data['product_attributes'][] = [ | | 803: | 'attribute_id' => $product_attribute['attribute_id'], | | 804: | 'name' => $attribute_info['name'], | | 805: | 'product_attribute_description' => $product_attribute['product_attribute_description'] | | 806: | ]; | | 807: | } | | 808: | } | | 809: | | | 810: | $this->load->model('customer/customer_group'); | | 811: | | | 812: | $data['customer_groups'] = $this->model_customer_customer_group->getCustomerGroups(); | | 813: | | | 814: | // Options | | 815: | $this->load->model('catalog/option'); | | 816: | | | 817: | if ($product_id) { | | 818: | $product_options = $this->model_catalog_product->getOptions($product_id); | | 819: | } else { | | 820: | $product_options = []; | | 821: | } | | 822: | | | 823: | $data['product_options'] = []; | | 824: | | | 825: | foreach ($product_options as $product_option) { | | 826: | $product_option_value_data = []; | | 827: | | | 828: | if (isset($product_option['product_option_value'])) { | | 829: | foreach ($product_option['product_option_value'] as $product_option_value) { | | 830: | $option_value_info = $this->model_catalog_option->getValue($product_option_value['option_value_id']); | | 831: | | | 832: | if ($option_value_info) { | | 833: | $product_option_value_data[] = [ | | 834: | 'product_option_value_id' => $product_option_value['product_option_value_id'], | | 835: | 'option_value_id' => $product_option_value['option_value_id'], | | 836: | 'name' => $option_value_info['name'], | | 837: | 'quantity' => $product_option_value['quantity'], | | 838: | 'subtract' => $product_option_value['subtract'], | | 839: | 'price' => $product_option_value['price'], | | 840: | 'price_prefix' => $product_option_value['price_prefix'], | | 841: | 'points' => round($product_option_value['points']), | | 842: | 'points_prefix' => $product_option_value['points_prefix'], | | 843: | 'weight' => round($product_option_value['weight']), | | 844: | 'weight_prefix' => $product_option_value['weight_prefix'] | | 845: | ]; | | 846: | } | | 847: | } | | 848: | } | | 849: | | | 850: | $data['product_options'][] = [ | | 851: | 'product_option_id' => $product_option['product_option_id'], | | 852: | 'product_option_value' => $product_option_value_data, | | 853: | 'option_id' => $product_option['option_id'], | | 854: | 'name' => $product_option['name'], | | 855: | 'type' => $product_option['type'], | | 856: | 'value' => $product_option['value'] ?? '', | | 857: | 'required' => $product_option['required'] | | 858: | ]; | | 859: | } | | 860: | | | 861: | $data['option_values'] = []; | | 862: | | | 863: | foreach ($data['product_options'] as $product_option) { | | 864: | if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') { | | 865: | if (!isset($data['option_values'][$product_option['option_id']])) { | | 866: | $data['option_values'][$product_option['option_id']] = $this->model_catalog_option->getValues($product_option['option_id']); | | 867: | } | | 868: | } | | 869: | } | | 870: | | | 871: | // Variants | | 872: | if (!empty($product_info)) { | | 873: | $data['variant'] = $product_info['variant']; | | 874: | } else { | | 875: | $data['variant'] = []; | | 876: | } | | 877: | | | 878: | // Overrides | | 879: | if (!empty($product_info)) { | | 880: | $data['override'] = $product_info['override']; | | 881: | } else { | | 882: | $data['override'] = []; | | 883: | } | | 884: | | | 885: | $data['options'] = []; | | 886: | | | 887: | if (isset($this->request->get['master_id'])) { | | 888: | $product_options = $this->model_catalog_product->getOptions($this->request->get['master_id']); | | 889: | | | 890: | foreach ($product_options as $product_option) { | | 891: | $product_option_value_data = []; | | 892: | | | 893: | foreach ($product_option['product_option_value'] as $product_option_value) { | | 894: | $option_value_info = $this->model_catalog_option->getValue($product_option_value['option_value_id']); | | 895: | | | 896: | if ($option_value_info) { | | 897: | $product_option_value_data[] = [ | | 898: | 'product_option_value_id' => $product_option_value['product_option_value_id'], | | 899: | 'option_value_id' => $product_option_value['option_value_id'], | | 900: | 'name' => $option_value_info['name'], | | 901: | 'price' => (float)$product_option_value['price'] ? $product_option_value['price'] : false, | | 902: | 'price_prefix' => $product_option_value['price_prefix'] | | 903: | ]; | | 904: | } | | 905: | } | | 906: | | | 907: | $option_info = $this->model_catalog_option->getOption($product_option['option_id']); | | 908: | | | 909: | $data['options'][] = [ | | 910: | 'product_option_id' => $product_option['product_option_id'], | | 911: | 'product_option_value' => $product_option_value_data, | | 912: | 'option_id' => $product_option['option_id'], | | 913: | 'name' => $option_info['name'], | | 914: | 'type' => $option_info['type'], | | 915: | 'value' => $data['variant'][$product_option['product_option_id']] ?? $product_option['value'], | | 916: | 'required' => $product_option['required'] | | 917: | ]; | | 918: | } | | 919: | } | | 920: | | | 921: | // Subscriptions | | 922: | $this->load->model('catalog/subscription_plan'); | | 923: | | | 924: | $data['subscription_plans'] = $this->model_catalog_subscription_plan->getSubscriptionPlans(); | | 925: | | | 926: | if ($product_id) { | | 927: | $data['product_subscriptions'] = $this->model_catalog_product->getSubscriptions($product_id); | | 928: | } else { | | 929: | $data['product_subscriptions'] = []; | | 930: | } | | 931: | | | 932: | // Discount | | 933: | if ($product_id) { | | 934: | $product_discounts = $this->model_catalog_product->getDiscounts($product_id); | | 935: | } else { | | 936: | $product_discounts = []; | | 937: | } | | 938: | | | 939: | $data['product_discounts'] = []; | | 940: | | | 941: | foreach ($product_discounts as $product_discount) { | | 942: | $data['product_discounts'][] = [ | | 943: | 'customer_group_id' => $product_discount['customer_group_id'], | | 944: | 'quantity' => $product_discount['quantity'], | | 945: | 'priority' => $product_discount['priority'], | | 946: | 'price' => $product_discount['price'], | | 947: | 'date_start' => ($product_discount['date_start'] != '0000-00-00') ? $product_discount['date_start'] : '', | | 948: | 'date_end' => ($product_discount['date_end'] != '0000-00-00') ? $product_discount['date_end'] : '' | | 949: | ]; | | 950: | } | | 951: | | | 952: | // Special | | 953: | if ($product_id) { | | 954: | $product_specials = $this->model_catalog_product->getSpecials($product_id); | | 955: | } else { | | 956: | $product_specials = []; | | 957: | } | | 958: | | | 959: | $data['product_specials'] = []; | | 960: | | | 961: | foreach ($product_specials as $product_special) { | | 962: | $data['product_specials'][] = [ | | 963: | 'customer_group_id' => $product_special['customer_group_id'], | | 964: | 'priority' => $product_special['priority'], | | 965: | 'price' => $product_special['price'], | | 966: | 'date_start' => ($product_special['date_start'] != '0000-00-00') ? $product_special['date_start'] : '', | | 967: | 'date_end' => ($product_special['date_end'] != '0000-00-00') ? $product_special['date_end'] : '' | | 968: | ]; | | 969: | } | | 970: | | | 971: | // Image | | 972: | if (!empty($product_info)) { | | 973: | $data['image'] = $product_info['image']; | | 974: | } else { | | 975: | $data['image'] = ''; | | 976: | } | | 977: | | | 978: | $this->load->model('tool/image'); | | 979: | | | 980: | $data['placeholder'] = $this->model_tool_image->resize('no_image.png', (int)$this->config->get('config_image_default_width'), (int)$this->config->get('config_image_default_height')); | | 981: | | | 982: | if ($data['image'] && is_file(DIR_IMAGE . html_entity_decode($data['image'], ENT_QUOTES, 'UTF-8'))) { | | 983: | $data['thumb'] = $this->model_tool_image->resize($data['image'], (int)$this->config->get('config_image_default_width'), (int)$this->config->get('config_image_default_height')); | | 984: | } else { | | 985: | $data['thumb'] = $data['placeholder']; | | 986: | } | | 987: | | | 988: | // Images | | 989: | if ($product_id) { | | 990: | $product_images = $this->model_catalog_product->getImages($product_id); | | 991: | } else { | | 992: | $product_images = []; | | 993: | } | | 994: | | | 995: | $data['product_images'] = []; | | 996: | | | 997: | foreach ($product_images as $product_image) { | | 998: | if ($product_image['image'] && is_file(DIR_IMAGE . html_entity_decode($product_image['image'], ENT_QUOTES, 'UTF-8'))) { | | 999: | $image = $product_image['image']; | | 1000: | $thumb = $product_image['image']; | | 1001: | } else { | | 1002: | $image = ''; | | 1003: | $thumb = 'no_image.png'; | | 1004: | } | | 1005: | | | 1006: | $data['product_images'][] = [ | | 1007: | 'image' => $image, | | 1008: | 'thumb' => $this->model_tool_image->resize($thumb, (int)$this->config->get('config_image_default_width'), (int)$this->config->get('config_image_default_height')), | | 1009: | 'sort_order' => $product_image['sort_order'] | | 1010: | ]; | | 1011: | } | | 1012: | | | 1013: | // Points | | 1014: | if (!empty($product_info)) { | | 1015: | $data['points'] = $product_info['points']; | | 1016: | } else { | | 1017: | $data['points'] = ''; | | 1018: | } | | 1019: | | | 1020: | // Rewards | | 1021: | if ($product_id) { | | 1022: | $data['product_reward'] = $this->model_catalog_product->getRewards($product_id); | | 1023: | } else { | | 1024: | $data['product_reward'] = []; | | 1025: | } | | 1026: | | | 1027: | // SEO | | 1028: | if ($product_id) { | | 1029: | $this->load->model('design/seo_url'); | | 1030: | | | 1031: | $data['product_seo_url'] = $this->model_design_seo_url->getSeoUrlsByKeyValue('product_id', $this->request->get['product_id']); | | 1032: | } else { | | 1033: | $data['product_seo_url'] = []; | | 1034: | } | | 1035: | | | 1036: | // Layouts | | 1037: | $this->load->model('design/layout'); | | 1038: | | | 1039: | $data['layouts'] = $this->model_design_layout->getLayouts(); | | 1040: | | | 1041: | if ($product_id) { | | 1042: | $data['product_layout'] = $this->model_catalog_product->getLayouts($product_id); | | 1043: | } else { | | 1044: | $data['product_layout'] = []; | | 1045: | } | | 1046: | | | 1047: | $data['report'] = $this->getReport(); | | 1048: | | | 1049: | $data['user_token'] = $this->session->data['user_token']; | | 1050: | | | 1051: | $data['header'] = $this->load->controller('common/header'); | | 1052: | $data['column_left'] = $this->load->controller('common/column_left'); | | 1053: | $data['footer'] = $this->load->controller('common/footer'); | | 1054: | | | 1055: | $this->response->setOutput($this->load->view('catalog/product_form', $data)); | | 1056: | } | | 1057: | | | 1058: | /** | | 1059: | * Save | | 1060: | * | | 1061: | * @return void | | 1062: | */ | | 1063: | public function save(): void { | | 1064: | $this->load->language('catalog/product'); | | 1065: | | | 1066: | $json = []; | | 1067: | | | 1068: | if (!$this->user->hasPermission('modify', 'catalog/product')) { | | 1069: | $json['error']['warning'] = $this->language->get('error_permission'); | | 1070: | } | | 1071: | | | 1072: | foreach ($this->request->post['product_description'] as $language_id => $value) { | | 1073: | if (!oc_validate_length($value['name'], 1, 255)) { | | 1074: | $json['error']['name_' . $language_id] = $this->language->get('error_name'); | | 1075: | } | | 1076: | | | 1077: | if (!oc_validate_length($value['meta_title'], 1, 255)) { | | 1078: | $json['error']['meta_title_' . $language_id] = $this->language->get('error_meta_title'); | | 1079: | } | | 1080: | } | | 1081: | | | 1082: | if (!oc_validate_length($this->request->post['model'], 1, 64)) { | | 1083: | $json['error']['model'] = $this->language->get('error_model'); | | 1084: | } | | 1085: | | | 1086: | $this->load->model('catalog/product'); | | 1087: | | | 1088: | if ($this->request->post['master_id']) { | | 1089: | $product_options = $this->model_catalog_product->getOptions($this->request->post['master_id']); | | 1090: | | | 1091: | foreach ($product_options as $product_option) { | | 1092: | if (isset($this->request->post['override']['variant'][$product_option['product_option_id']]) && $product_option['required'] && empty($this->request->post['variant'][$product_option['product_option_id']])) { | | 1093: | $json['error']['option_' . $product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']); | | 1094: | } | | 1095: | } | | 1096: | } | | 1097: | | | 1098: | if ($this->request->post['product_seo_url']) { | | 1099: | $this->load->model('design/seo_url'); | | 1100: | | | 1101: | foreach ($this->request->post['product_seo_url'] as $store_id => $language) { | | 1102: | foreach ($language as $language_id => $keyword) { | | 1103: | if (!oc_validate_length($keyword, 1, 64)) { | | 1104: | $json['error']['keyword_' . $store_id . '_' . $language_id] = $this->language->get('error_keyword'); | | 1105: | } | | 1106: | | | 1107: | if (!oc_validate_seo_url($keyword)) { | | 1108: | $json['error']['keyword_' . $store_id . '_' . $language_id] = $this->language->get('error_keyword_character'); | | 1109: | } | | 1110: | | | 1111: | $seo_url_info = $this->model_design_seo_url->getSeoUrlByKeyword($keyword, $store_id); | | 1112: | | | 1113: | if ($seo_url_info && ($seo_url_info['key'] != 'product_id' || !isset($this->request->post['product_id']) || $seo_url_info['value'] != (int)$this->request->post['product_id'])) { | | 1114: | $json['error']['keyword_' . $store_id . '_' . $language_id] = $this->language->get('error_keyword_exists'); | | 1115: | } | | 1116: | } | | 1117: | } | | 1118: | } | | 1119: | | | 1120: | if (isset($json['error']) && !isset($json['error']['warning'])) { | | 1121: | $json['error']['warning'] = $this->language->get('error_warning'); | | 1122: | } | | 1123: | | | 1124: | if (!$json) { | | 1125: | if (!$this->request->post['product_id']) { | | 1126: | if (!$this->request->post['master_id']) { | | 1127: | // Normal product add | | 1128: | $json['product_id'] = $this->model_catalog_product->addProduct($this->request->post); | | 1129: | } else { | | 1130: | // Variant product add | | 1131: | $json['product_id'] = $this->model_catalog_product->addVariant($this->request->post['master_id'], $this->request->post); | | 1132: | } | | 1133: | } else { | | 1134: | if (!$this->request->post['master_id']) { | | 1135: | // Normal product edit | | 1136: | $this->model_catalog_product->editProduct($this->request->post['product_id'], $this->request->post); | | 1137: | } else { | | 1138: | // Variant product edit | | 1139: | $this->model_catalog_product->editVariant($this->request->post['master_id'], $this->request->post['product_id'], $this->request->post); | | 1140: | } | | 1141: | | | 1142: | // Variant products edit if master product is edited | | 1143: | $this->model_catalog_product->editVariants($this->request->post['product_id'], $this->request->post); | | 1144: | } | | 1145: | | | 1146: | $json['success'] = $this->language->get('text_success'); | | 1147: | } | | 1148: | | | 1149: | $this->response->addHeader('Content-Type: application/json'); | | 1150: | $this->response->setOutput(json_encode($json)); | | 1151: | } | | 1152: | | | 1153: | /** | | 1154: | * Delete | | 1155: | * | | 1156: | * @return void | | 1157: | */ | | 1158: | public function delete(): void { | | 1159: | $this->load->language('catalog/product'); | | 1160: | | | 1161: | $json = []; | | 1162: | | | 1163: | if (isset($this->request->post['selected'])) { | | 1164: | $selected = $this->request->post['selected']; | | 1165: | } else { | | 1166: | $selected = []; | | 1167: | } | | 1168: | | | 1169: | if (!$this->user->hasPermission('modify', 'catalog/product')) { | | 1170: | $json['error'] = $this->language->get('error_permission'); | | 1171: | } | | 1172: | | | 1173: | if (!$json) { | | 1174: | $this->load->model('catalog/product'); | | 1175: | | | 1176: | foreach ($selected as $product_id) { | | 1177: | $this->model_catalog_product->deleteProduct($product_id); | | 1178: | } | | 1179: | | | 1180: | $json['success'] = $this->language->get('text_success'); | | 1181: | } | | 1182: | | | 1183: | $this->response->addHeader('Content-Type: application/json'); | | 1184: | $this->response->setOutput(json_encode($json)); | | 1185: | } | | 1186: | | | 1187: | /** | | 1188: | * Copy | | 1189: | * | | 1190: | * @return void | | 1191: | */ | | 1192: | public function copy(): void { | | 1193: | $this->load->language('catalog/product'); | | 1194: | | | 1195: | $json = []; | | 1196: | | | 1197: | if (isset($this->request->post['selected'])) { | | 1198: | $selected = $this->request->post['selected']; | | 1199: | } else { | | 1200: | $selected = []; | | 1201: | } | | 1202: | | | 1203: | if (!$this->user->hasPermission('modify', 'catalog/product')) { | | 1204: | $json['error'] = $this->language->get('error_permission'); | | 1205: | } | | 1206: | | | 1207: | if (!$json) { | | 1208: | $this->load->model('catalog/product'); | | 1209: | | | 1210: | foreach ($selected as $product_id) { | | 1211: | $this->model_catalog_product->copyProduct($product_id); | | 1212: | } | | 1213: | | | 1214: | $json['success'] = $this->language->get('text_success'); | | 1215: | } | | 1216: | | | 1217: | $this->response->addHeader('Content-Type: application/json'); | | 1218: | $this->response->setOutput(json_encode($json)); | | 1219: | } | | 1220: | | | 1221: | /** | | 1222: | * Report | | 1223: | * | | 1224: | * @return void | | 1225: | */ | | 1226: | public function report(): void { | | 1227: | $this->load->language('catalog/product'); | | 1228: | | | 1229: | $this->response->setOutput($this->getReport()); | | 1230: | } | | 1231: | | | 1232: | /** | | 1233: | * Get Report | | 1234: | * | | 1235: | * @return string | | 1236: | */ | | 1237: | public function getReport(): string { | | 1238: | if (isset($this->request->get['product_id'])) { | | 1239: | $product_id = (int)$this->request->get['product_id']; | | 1240: | } else { | | 1241: | $product_id = 0; | | 1242: | } | | 1243: | | | 1244: | if (isset($this->request->get['page']) && $this->request->get['route'] == 'catalog/product.report') { | | 1245: | $page = (int)$this->request->get['page']; | | 1246: | } else { | | 1247: | $page = 1; | | 1248: | } | | 1249: | | | 1250: | $limit = 10; | | 1251: | | | 1252: | $data['reports'] = []; | | 1253: | | | 1254: | $this->load->model('catalog/product'); | | 1255: | $this->load->model('setting/store'); | | 1256: | | | 1257: | $results = $this->model_catalog_product->getReports($product_id, ($page - 1) * $limit, $limit); | | 1258: | | | 1259: | foreach ($results as $result) { | | 1260: | $store_info = $this->model_setting_store->getStore($result['store_id']); | | 1261: | | | 1262: | if ($store_info) { | | 1263: | $store = $store_info['name']; | | 1264: | } elseif (!$result['store_id']) { | | 1265: | $store = $this->config->get('config_name'); | | 1266: | } else { | | 1267: | $store = ''; | | 1268: | } | | 1269: | | | 1270: | $data['reports'][] = [ | | 1271: | 'ip' => $result['ip'], | | 1272: | 'store' => $store, | | 1273: | 'country' => $result['country'], | | 1274: | 'date_added' => date($this->language->get('datetime_format'), strtotime($result['date_added'])) | | 1275: | ]; | | 1276: | } | | 1277: | | | 1278: | $report_total = $this->model_catalog_product->getTotalReports($product_id); | | 1279: | | | 1280: | $data['pagination'] = $this->load->controller('common/pagination', [ | | 1281: | 'total' => $report_total, | | 1282: | 'page' => $page, | | 1283: | 'limit' => $limit, | | 1284: | 'url' => $this->url->link('catalog/product.report', 'user_token=' . $this->session->data['user_token'] . '&product_id=' . $product_id . '&page={page}') | | 1285: | ]); | | 1286: | | | 1287: | $data['results'] = sprintf($this->language->get('text_pagination'), ($report_total) ? (($page - 1) * $limit) + 1 : 0, ((($page - 1) * $limit) > ($report_total - $limit)) ? $report_total : ((($page - 1) * $limit) + $limit), $report_total, ceil($report_total / $limit)); | | 1288: | | | 1289: | return $this->load->view('catalog/product_report', $data); | | 1290: | } | | 1291: | | | 1292: | /** | | 1293: | * Autocomplete | | 1294: | * | | 1295: | * @return void | | 1296: | */ | | 1297: | public function autocomplete(): void { | | 1298: | $json = []; | | 1299: | | | 1300: | if (isset($this->request->get['filter_name'])) { | | 1301: | $filter_name = $this->request->get['filter_name']; | | 1302: | } else { | | 1303: | $filter_name = ''; | | 1304: | } | | 1305: | | | 1306: | if (isset($this->request->get['filter_model'])) { | | 1307: | $filter_model = $this->request->get['filter_model']; | | 1308: | } else { | | 1309: | $filter_model = ''; | | 1310: | } | | 1311: | | | 1312: | if (isset($this->request->get['limit'])) { | | 1313: | $limit = (int)$this->request->get['limit']; | | 1314: | } else { | | 1315: | $limit = 5; | | 1316: | } | | 1317: | | | 1318: | $filter_data = [ | | 1319: | 'filter_name' => $filter_name, | | 1320: | 'filter_model' => $filter_model, | | 1321: | 'start' => 0, | | 1322: | 'limit' => $limit | | 1323: | ]; | | 1324: | | | 1325: | $this->load->model('catalog/product'); | | 1326: | $this->load->model('catalog/option'); | | 1327: | $this->load->model('catalog/subscription_plan'); | | 1328: | | | 1329: | $results = $this->model_catalog_product->getProducts($filter_data); | | 1330: | | | 1331: | foreach ($results as $result) { | | 1332: | $option_data = []; | | 1333: | | | 1334: | $product_options = $this->model_catalog_product->getOptions($result['product_id']); | | 1335: | | | 1336: | foreach ($product_options as $product_option) { | | 1337: | $option_info = $this->model_catalog_option->getOption($product_option['option_id']); | | 1338: | | | 1339: | if ($option_info) { | | 1340: | $product_option_value_data = []; | | 1341: | | | 1342: | foreach ($product_option['product_option_value'] as $product_option_value) { | | 1343: | $option_value_info = $this->model_catalog_option->getValue($product_option_value['option_value_id']); | | 1344: | | | 1345: | if ($option_value_info) { | | 1346: | $product_option_value_data[] = [ | | 1347: | 'product_option_value_id' => $product_option_value['product_option_value_id'], | | 1348: | 'option_value_id' => $product_option_value['option_value_id'], | | 1349: | 'name' => $option_value_info['name'], | | 1350: | 'price' => (float)$product_option_value['price'] ? $this->currency->format($product_option_value['price'], $this->config->get('config_currency')) : false, | | 1351: | 'price_prefix' => $product_option_value['price_prefix'] | | 1352: | ]; | | 1353: | } | | 1354: | } | | 1355: | | | 1356: | $option_data[] = [ | | 1357: | 'product_option_id' => $product_option['product_option_id'], | | 1358: | 'product_option_value' => $product_option_value_data, | | 1359: | 'option_id' => $product_option['option_id'], | | 1360: | 'name' => $option_info['name'], | | 1361: | 'type' => $option_info['type'], | | 1362: | 'value' => $product_option['value'], | | 1363: | 'required' => $product_option['required'] | | 1364: | ]; | | 1365: | } | | 1366: | } | | 1367: | | | 1368: | $subscription_plan_data = []; | | 1369: | | | 1370: | $product_subscriptions = $this->model_catalog_product->getSubscriptions($result['product_id']); | | 1371: | | | 1372: | foreach ($product_subscriptions as $product_subscription) { | | 1373: | $subscription_plan_info = $this->model_catalog_subscription_plan->getSubscriptionPlan($product_subscription['subscription_plan_id']); | | 1374: | | | 1375: | if ($subscription_plan_info) { | | 1376: | $subscription_plan_data[] = [ | | 1377: | 'subscription_plan_id' => $subscription_plan_info['subscription_plan_id'], | | 1378: | 'name' => $subscription_plan_info['name'] | | 1379: | ]; | | 1380: | } | | 1381: | } | | 1382: | | | 1383: | $json[] = [ | | 1384: | 'product_id' => $result['product_id'], | | 1385: | 'name' => strip_tags(html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8')), | | 1386: | 'model' => $result['model'], | | 1387: | 'option' => $option_data, | | 1388: | 'subscription' => $subscription_plan_data, | | 1389: | 'price' => $result['price'] | | 1390: | ]; | | 1391: | } | | 1392: | | | 1393: | $this->response->addHeader('Content-Type: application/json'); | | 1394: | $this->response->setOutput(json_encode($json)); | | 1395: | } | | 1396: | } | | 1397: | |
OpenCart API API documentation generated by ApiGen dev-master