| Linux hosting5.siteguarding.com 3.10.0-962.3.2.lve1.5.88.el7.x86_64 #1 SMP Fri Sep 26 14:06:42 UTC 2025 x86_64 Path : /home/devsafetybis/op4103.dev.safetybis.com/admin1qw/controller/catalog/ |
| Current File : /home/devsafetybis/op4103.dev.safetybis.com/admin1qw/controller/catalog/product.php |
<?php
namespace Opencart\Admin\Controller\Catalog;
/**
* Class Product
*
* Can be loaded using $this->load->controller('catalog/product');
*
* @package Opencart\Admin\Controller\Catalog
*/
class Product extends \Opencart\System\Engine\Controller {
/**
* Index
*
* @return void
*/
public function index(): void {
$this->load->language('catalog/product');
if (isset($this->request->get['filter_name'])) {
$filter_name = $this->request->get['filter_name'];
} else {
$filter_name = '';
}
if (isset($this->request->get['filter_model'])) {
$filter_model = $this->request->get['filter_model'];
} else {
$filter_model = '';
}
if (isset($this->request->get['filter_category_id'])) {
$filter_category_id = $this->request->get['filter_category_id'];
} else {
$filter_category_id = '';
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$filter_manufacturer_id = $this->request->get['filter_manufacturer_id'];
} else {
$filter_manufacturer_id = '';
}
if (isset($this->request->get['filter_price_from'])) {
$filter_price_from = $this->request->get['filter_price_from'];
} else {
$filter_price_from = '';
}
if (isset($this->request->get['filter_price_to'])) {
$filter_price_to = $this->request->get['filter_price_to'];
} else {
$filter_price_to = '';
}
if (isset($this->request->get['filter_quantity_from'])) {
$filter_quantity_from = $this->request->get['filter_quantity_from'];
} else {
$filter_quantity_from = '';
}
if (isset($this->request->get['filter_quantity_to'])) {
$filter_quantity_to = $this->request->get['filter_quantity_to'];
} else {
$filter_quantity_to = '';
}
if (isset($this->request->get['filter_quantity_from'])) {
$filter_quantity_from = $this->request->get['filter_quantity_from'];
} else {
$filter_quantity_from = '';
}
if (isset($this->request->get['filter_quantity_to'])) {
$filter_quantity_to = $this->request->get['filter_quantity_to'];
} else {
$filter_quantity_to = '';
}
if (isset($this->request->get['filter_status'])) {
$filter_status = $this->request->get['filter_status'];
} else {
$filter_status = '';
}
$this->document->setTitle($this->language->get('heading_title'));
$url = '';
if (isset($this->request->get['filter_name'])) {
$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_category_id'])) {
$url .= '&filter_category_id=' . $this->request->get['filter_category_id'];
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$url .= '&filter_manufacturer_id=' . $this->request->get['filter_manufacturer_id'];
}
if (isset($this->request->get['filter_price_from'])) {
$url .= '&filter_price_from=' . $this->request->get['filter_price_from'];
}
if (isset($this->request->get['filter_price_to'])) {
$url .= '&filter_price_to=' . $this->request->get['filter_price_to'];
}
if (isset($this->request->get['filter_quantity_from'])) {
$url .= '&filter_quantity_from=' . $this->request->get['filter_quantity_from'];
}
if (isset($this->request->get['filter_quantity_to'])) {
$url .= '&filter_quantity_to=' . $this->request->get['filter_quantity_to'];
}
if (isset($this->request->get['filter_status'])) {
$url .= '&filter_status=' . $this->request->get['filter_status'];
}
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = [
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'])
];
$data['breadcrumbs'][] = [
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('catalog/product', 'user_token=' . $this->session->data['user_token'] . $url)
];
$data['add'] = $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . $url);
$data['copy'] = $this->url->link('catalog/product.copy', 'user_token=' . $this->session->data['user_token']);
$data['delete'] = $this->url->link('catalog/product.delete', 'user_token=' . $this->session->data['user_token']);
$data['list'] = $this->load->controller('catalog/product.getList');
$data['filter_name'] = $filter_name;
$data['filter_model'] = $filter_model;
$data['filter_category_id'] = $filter_category_id;
$data['filter_manufacturer_id'] = $filter_manufacturer_id;
$data['filter_price_from'] = $filter_price_from;
$data['filter_price_to'] = $filter_price_to;
$data['filter_quantity_from'] = $filter_quantity_from;
$data['filter_quantity_to'] = $filter_quantity_to;
$data['filter_status'] = $filter_status;
$data['filter_category'] = '';
$data['filter_manufacturer'] = '';
// Category
if (!empty($filter_category_id)) {
$this->load->model('catalog/category');
$category_info = $this->model_catalog_category->getCategory($filter_category_id);
$data['filter_category'] = !empty($category_info['name']) ? (!empty($category_info['path']) ? implode(' > ', [$category_info['path'], $category_info['name']]) : $category_info['name']) : '';
}
// Manufacturer
if (!empty($filter_manufacturer_id)) {
$this->load->model('catalog/manufacturer');
$manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($filter_manufacturer_id);
$data['filter_manufacturer'] = !empty($manufacturer_info['name']) ? $manufacturer_info['name'] : '';
}
$data['user_token'] = $this->session->data['user_token'];
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');
$this->response->setOutput($this->load->view('catalog/product', $data));
}
/**
* List
*
* @return void
*/
public function list(): void {
$this->load->language('catalog/product');
$this->response->setOutput($this->load->controller('catalog/product.getList'));
}
/**
* @return string
*/
public function getList(): string {
if (isset($this->request->get['filter_name'])) {
$filter_name = $this->request->get['filter_name'];
} else {
$filter_name = '';
}
if (isset($this->request->get['filter_model'])) {
$filter_model = $this->request->get['filter_model'];
} else {
$filter_model = '';
}
if (isset($this->request->get['filter_category_id'])) {
$filter_category_id = $this->request->get['filter_category_id'];
} else {
$filter_category_id = '';
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$filter_manufacturer_id = $this->request->get['filter_manufacturer_id'];
} else {
$filter_manufacturer_id = '';
}
if (isset($this->request->get['filter_price_from'])) {
$filter_price_from = $this->request->get['filter_price_from'];
} else {
$filter_price_from = '';
}
if (isset($this->request->get['filter_price_to'])) {
$filter_price_to = $this->request->get['filter_price_to'];
} else {
$filter_price_to = '';
}
if (isset($this->request->get['filter_quantity_from'])) {
$filter_quantity_from = $this->request->get['filter_quantity_from'];
} else {
$filter_quantity_from = '';
}
if (isset($this->request->get['filter_quantity_to'])) {
$filter_quantity_to = $this->request->get['filter_quantity_to'];
} else {
$filter_quantity_to = '';
}
if (isset($this->request->get['filter_status'])) {
$filter_status = $this->request->get['filter_status'];
} else {
$filter_status = '';
}
if (isset($this->request->get['sort'])) {
$sort = (string)$this->request->get['sort'];
} else {
$sort = 'pd.name';
}
if (isset($this->request->get['order'])) {
$order = (string)$this->request->get['order'];
} else {
$order = 'ASC';
}
if (isset($this->request->get['page'])) {
$page = (int)$this->request->get['page'];
} else {
$page = 1;
}
$url = '';
if (isset($this->request->get['filter_name'])) {
$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_category_id'])) {
$url .= '&filter_category_id=' . $this->request->get['filter_category_id'];
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$url .= '&filter_manufacturer_id=' . $this->request->get['filter_manufacturer_id'];
}
if (isset($this->request->get['filter_price_from'])) {
$url .= '&filter_price_from=' . $this->request->get['filter_price_from'];
}
if (isset($this->request->get['filter_price_to'])) {
$url .= '&filter_price_to=' . $this->request->get['filter_price_to'];
}
if (isset($this->request->get['filter_quantity_from'])) {
$url .= '&filter_quantity_from=' . $this->request->get['filter_quantity_from'];
}
if (isset($this->request->get['filter_quantity_to'])) {
$url .= '&filter_quantity_to=' . $this->request->get['filter_quantity_to'];
}
if (isset($this->request->get['filter_status'])) {
$url .= '&filter_status=' . $this->request->get['filter_status'];
}
if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}
$data['action'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . $url);
// Product
$data['products'] = [];
$filter_data = [
'filter_name' => $filter_name,
'filter_model' => $filter_model,
'filter_category_id' => $filter_category_id,
'filter_manufacturer_id' => $filter_manufacturer_id,
'filter_price_from' => $filter_price_from,
'filter_price_to' => $filter_price_to,
'filter_quantity_from' => $filter_quantity_from,
'filter_quantity_to' => $filter_quantity_to,
'filter_status' => $filter_status,
'sort' => $sort,
'order' => $order,
'start' => ($page - 1) * $this->config->get('config_pagination_admin'),
'limit' => $this->config->get('config_pagination_admin')
];
$this->load->model('catalog/product');
// Image
$this->load->model('tool/image');
$results = $this->model_catalog_product->getProducts($filter_data);
foreach ($results as $result) {
if ($result['image'] && is_file(DIR_IMAGE . html_entity_decode($result['image'], ENT_QUOTES, 'UTF-8'))) {
$image = $result['image'];
} else {
$image = 'no_image.png';
}
$special = '';
$product_discounts = $this->model_catalog_product->getDiscounts($result['product_id']);
foreach ($product_discounts as $product_discount) {
if (($product_discount['date_start'] == '0000-00-00' || strtotime($product_discount['date_start']) < time()) && ($product_discount['date_end'] == '0000-00-00' || strtotime($product_discount['date_end']) > time())) {
$special = $this->currency->format($product_discount['price'], $this->config->get('config_currency'));
break;
}
}
$data['products'][] = [
'image' => $this->model_tool_image->resize($image, 40, 40),
'price' => $this->currency->format($result['price'], $this->config->get('config_currency')),
'special' => $special,
'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),
'variant' => (!$result['master_id'] ? $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . '&master_id=' . $result['product_id'] . $url) : '')
] + $result;
}
$url = '';
if (isset($this->request->get['filter_name'])) {
$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_category_id'])) {
$url .= '&filter_category_id=' . $this->request->get['filter_category_id'];
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$url .= '&filter_manufacturer_id=' . $this->request->get['filter_manufacturer_id'];
}
if (isset($this->request->get['filter_price_from'])) {
$url .= '&filter_price_from=' . $this->request->get['filter_price_from'];
}
if (isset($this->request->get['filter_price_to'])) {
$url .= '&filter_price_to=' . $this->request->get['filter_price_to'];
}
if (isset($this->request->get['filter_quantity_from'])) {
$url .= '&filter_quantity_from=' . $this->request->get['filter_quantity_from'];
}
if (isset($this->request->get['filter_quantity_to'])) {
$url .= '&filter_quantity_to=' . $this->request->get['filter_quantity_to'];
}
if (isset($this->request->get['filter_status'])) {
$url .= '&filter_status=' . $this->request->get['filter_status'];
}
if ($order == 'ASC') {
$url .= '&order=DESC';
} else {
$url .= '&order=ASC';
}
$data['sort_name'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=pd.name' . $url);
$data['sort_model'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.model' . $url);
$data['sort_price'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.price' . $url);
$data['sort_quantity'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.quantity' . $url);
$data['sort_order'] = $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . '&sort=p.sort_order' . $url);
$url = '';
if (isset($this->request->get['filter_name'])) {
$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_category_id'])) {
$url .= '&filter_category_id=' . $this->request->get['filter_category_id'];
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$url .= '&filter_manufacturer_id=' . $this->request->get['filter_manufacturer_id'];
}
if (isset($this->request->get['filter_price_from'])) {
$url .= '&filter_price_from=' . $this->request->get['filter_price_from'];
}
if (isset($this->request->get['filter_price_to'])) {
$url .= '&filter_price_to=' . $this->request->get['filter_price_to'];
}
if (isset($this->request->get['filter_quantity_from'])) {
$url .= '&filter_quantity_from=' . $this->request->get['filter_quantity_from'];
}
if (isset($this->request->get['filter_quantity_to'])) {
$url .= '&filter_quantity_to=' . $this->request->get['filter_quantity_to'];
}
if (isset($this->request->get['filter_status'])) {
$url .= '&filter_status=' . $this->request->get['filter_status'];
}
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
$product_total = $this->model_catalog_product->getTotalProducts($filter_data);
$data['pagination'] = $this->load->controller('common/pagination', [
'total' => $product_total,
'page' => $page,
'limit' => $this->config->get('config_pagination_admin'),
'url' => $this->url->link('catalog/product.list', 'user_token=' . $this->session->data['user_token'] . $url . '&page={page}')
]);
$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')));
$data['sort'] = $sort;
$data['order'] = $order;
return $this->load->view('catalog/product_list', $data);
}
/**
* Form
*
* @return void
*/
public function form(): void {
$this->load->language('catalog/product');
$this->document->setTitle($this->language->get('heading_title'));
$this->document->addScript('view/javascript/ckeditor/ckeditor.js');
$this->document->addScript('view/javascript/ckeditor/adapters/jquery.js');
$data['text_form'] = !isset($this->request->get['product_id']) ? $this->language->get('text_add') : $this->language->get('text_edit');
$data['error_upload_size'] = sprintf($this->language->get('error_upload_size'), $this->config->get('config_file_max_size'));
$data['config_file_max_size'] = ((int)$this->config->get('config_file_max_size') * 1024 * 1024);
if (isset($this->request->get['master_id'])) {
$this->load->model('catalog/product');
$url = $this->url->link('catalog/product.form', 'user_token=' . $this->session->data['user_token'] . '&product_id=' . $this->request->get['master_id']);
$data['text_variant'] = sprintf($this->language->get('text_variant'), $url, $url);
} else {
$data['text_variant'] = '';
}
$url = '';
if (isset($this->request->get['master_id'])) {
$url .= '&master_id=' . $this->request->get['master_id'];
}
if (isset($this->request->get['filter_name'])) {
$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_category_id'])) {
$url .= '&filter_category_id=' . $this->request->get['filter_category_id'];
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$url .= '&filter_manufacturer_id=' . $this->request->get['filter_manufacturer_id'];
}
if (isset($this->request->get['filter_price_from'])) {
$url .= '&filter_price_from=' . $this->request->get['filter_price_from'];
}
if (isset($this->request->get['filter_price_to'])) {
$url .= '&filter_price_to=' . $this->request->get['filter_price_to'];
}
if (isset($this->request->get['filter_quantity_from'])) {
$url .= '&filter_quantity_from=' . $this->request->get['filter_quantity_from'];
}
if (isset($this->request->get['filter_quantity_to'])) {
$url .= '&filter_quantity_to=' . $this->request->get['filter_quantity_to'];
}
if (isset($this->request->get['filter_status'])) {
$url .= '&filter_status=' . $this->request->get['filter_status'];
}
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = [
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'])
];
$data['breadcrumbs'][] = [
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('catalog/product', 'user_token=' . $this->session->data['user_token'] . $url)
];
$url = '';
if (isset($this->request->get['filter_name'])) {
$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
if (isset($this->request->get['filter_category_id'])) {
$url .= '&filter_category_id=' . $this->request->get['filter_category_id'];
}
if (isset($this->request->get['filter_manufacturer_id'])) {
$url .= '&filter_manufacturer_id=' . $this->request->get['filter_manufacturer_id'];
}
if (isset($this->request->get['filter_price_from'])) {
$url .= '&filter_price_from=' . $this->request->get['filter_price_from'];
}
if (isset($this->request->get['filter_price_to'])) {
$url .= '&filter_price_to=' . $this->request->get['filter_price_to'];
}
if (isset($this->request->get['filter_quantity_from'])) {
$url .= '&filter_quantity_from=' . $this->request->get['filter_quantity_from'];
}
if (isset($this->request->get['filter_quantity_to'])) {
$url .= '&filter_quantity_to=' . $this->request->get['filter_quantity_to'];
}
if (isset($this->request->get['filter_status'])) {
$url .= '&filter_status=' . $this->request->get['filter_status'];
}
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}
$data['save'] = $this->url->link('catalog/product.save', 'user_token=' . $this->session->data['user_token']);
$data['back'] = $this->url->link('catalog/product', 'user_token=' . $this->session->data['user_token'] . $url);
$data['upload'] = $this->url->link('tool/upload.upload', 'user_token=' . $this->session->data['user_token']);
if (isset($this->request->get['product_id'])) {
$data['product_id'] = (int)$this->request->get['product_id'];
} else {
$data['product_id'] = 0;
}
// If the product_id is the master_id, we need to get the variant info
if (isset($this->request->get['product_id'])) {
$product_id = (int)$this->request->get['product_id'];
} elseif (isset($this->request->get['master_id'])) {
$product_id = (int)$this->request->get['master_id'];
} else {
$product_id = 0;
}
if ($product_id) {
$this->load->model('catalog/product');
$product_info = $this->model_catalog_product->getProduct($product_id);
}
if (isset($this->request->get['master_id'])) {
$data['master_id'] = (int)$this->request->get['master_id'];
} elseif (!empty($product_info)) {
$data['master_id'] = $product_info['master_id'];
} else {
$data['master_id'] = 0;
}
// Language
$this->load->model('localisation/language');
$data['languages'] = $this->model_localisation_language->getLanguages();
if (!empty($product_info)) {
$data['product_description'] = $this->model_catalog_product->getDescriptions($product_id);
} else {
$data['product_description'] = [];
}
if (!empty($product_info)) {
$data['model'] = $product_info['model'];
} else {
$data['model'] = '';
}
// Product Identifiers
$this->load->model('catalog/identifier');
$data['identifiers'] = $this->model_catalog_identifier->getIdentifiers();
// Filter
if (!empty($product_info)) {
$data['product_codes'] = $this->model_catalog_product->getCodes($product_id);
} else {
$data['product_codes'] = [];
}
if (!empty($product_info)) {
$data['price'] = $product_info['price'];
} else {
$data['price'] = '';
}
// Tax Class
$this->load->model('localisation/tax_class');
$data['tax_classes'] = $this->model_localisation_tax_class->getTaxClasses();
if (!empty($product_info)) {
$data['tax_class_id'] = $product_info['tax_class_id'];
} else {
$data['tax_class_id'] = 0;
}
if (!empty($product_info)) {
$data['quantity'] = $product_info['quantity'];
} else {
$data['quantity'] = 1;
}
if (!empty($product_info)) {
$data['minimum'] = $product_info['minimum'];
} else {
$data['minimum'] = 1;
}
if (!empty($product_info)) {
$data['subtract'] = $product_info['subtract'];
} else {
$data['subtract'] = 1;
}
// Stock Status
$this->load->model('localisation/stock_status');
$data['stock_statuses'] = $this->model_localisation_stock_status->getStockStatuses();
if (!empty($product_info)) {
$data['stock_status_id'] = $product_info['stock_status_id'];
} else {
$data['stock_status_id'] = 0;
}
if (!empty($product_info)) {
$data['location'] = $product_info['location'];
} else {
$data['location'] = '';
}
if (!empty($product_info)) {
$data['date_available'] = ($product_info['date_available'] != '0000-00-00') ? $product_info['date_available'] : '';
} else {
$data['date_available'] = date('Y-m-d');
}
if (!empty($product_info)) {
$data['shipping'] = $product_info['shipping'];
} else {
$data['shipping'] = 1;
}
if (!empty($product_info)) {
$data['length'] = $product_info['length'];
} else {
$data['length'] = '';
}
if (!empty($product_info)) {
$data['width'] = $product_info['width'];
} else {
$data['width'] = '';
}
if (!empty($product_info)) {
$data['height'] = $product_info['height'];
} else {
$data['height'] = '';
}
// Length Class
$this->load->model('localisation/length_class');
$data['length_classes'] = $this->model_localisation_length_class->getLengthClasses();
if (!empty($product_info)) {
$data['length_class_id'] = $product_info['length_class_id'];
} else {
$data['length_class_id'] = (int)$this->config->get('config_length_class_id');
}
// Weight Class
if (!empty($product_info)) {
$data['weight'] = $product_info['weight'];
} else {
$data['weight'] = '';
}
$this->load->model('localisation/weight_class');
$data['weight_classes'] = $this->model_localisation_weight_class->getWeightClasses();
if (!empty($product_info)) {
$data['weight_class_id'] = $product_info['weight_class_id'];
} else {
$data['weight_class_id'] = (int)$this->config->get('config_weight_class_id');
}
if (!empty($product_info)) {
$data['status'] = $product_info['status'];
} else {
$data['status'] = true;
}
if (!empty($product_info)) {
$data['sort_order'] = $product_info['sort_order'];
} else {
$data['sort_order'] = 1;
}
// Manufacturer
$this->load->model('catalog/manufacturer');
if (!empty($product_info)) {
$data['manufacturer_id'] = $product_info['manufacturer_id'];
} else {
$data['manufacturer_id'] = 0;
}
if (!empty($product_info)) {
$manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($product_info['manufacturer_id']);
if ($manufacturer_info) {
$data['manufacturer'] = $manufacturer_info['name'];
} else {
$data['manufacturer'] = '';
}
} else {
$data['manufacturer'] = '';
}
// Category
$this->load->model('catalog/category');
if ($product_id) {
$categories = $this->model_catalog_product->getCategories($product_id);
} else {
$categories = [];
}
$data['product_categories'] = [];
foreach ($categories as $category_id) {
$category_info = $this->model_catalog_category->getCategory($category_id);
if ($category_info) {
$data['product_categories'][] = ['name' => ($category_info['path'] ? $category_info['path'] . ' > ' . $category_info['name'] : $category_info['name'])] + $category_info;
}
}
// Filter
$this->load->model('catalog/filter');
if (!empty($product_info)) {
$filters = $this->model_catalog_product->getFilters($product_id);
} else {
$filters = [];
}
$data['product_filters'] = [];
foreach ($filters as $filter_id) {
$filter_info = $this->model_catalog_filter->getFilter($filter_id);
if ($filter_info) {
$data['product_filters'][] = ['name' => $filter_info['group'] . ' > ' . $filter_info['name']] + $filter_info;
}
}
// Store
$data['stores'] = [];
$data['stores'][] = [
'store_id' => 0,
'name' => $this->language->get('text_default')
];
$this->load->model('setting/store');
$results = $this->model_setting_store->getStores();
foreach ($results as $result) {
$data['stores'][] = $result;
}
if ($product_id) {
$data['product_store'] = $this->model_catalog_product->getStores($product_id);
} else {
$data['product_store'] = [0];
}
// Download
$this->load->model('catalog/download');
if ($product_id) {
$product_downloads = $this->model_catalog_product->getDownloads($product_id);
} else {
$product_downloads = [];
}
$data['product_downloads'] = [];
foreach ($product_downloads as $download_id) {
$download_info = $this->model_catalog_download->getDownload($download_id);
if ($download_info) {
$data['product_downloads'][] = $download_info;
}
}
// Related
if ($product_id) {
$product_relateds = $this->model_catalog_product->getRelated($product_id);
} else {
$product_relateds = [];
}
$data['product_relateds'] = [];
foreach ($product_relateds as $related_id) {
$related_info = $this->model_catalog_product->getProduct($related_id);
if ($related_info) {
$data['product_relateds'][] = $related_info;
}
}
// Attribute
$this->load->model('catalog/attribute');
if ($product_id) {
$product_attributes = $this->model_catalog_product->getAttributes($product_id);
} else {
$product_attributes = [];
}
$data['product_attributes'] = [];
foreach ($product_attributes as $product_attribute) {
$attribute_info = $this->model_catalog_attribute->getAttribute($product_attribute['attribute_id']);
if ($attribute_info) {
$data['product_attributes'][] = ['name' => $attribute_info['name']] + $product_attribute;
}
}
// Customer Group
$this->load->model('customer/customer_group');
$data['customer_groups'] = $this->model_customer_customer_group->getCustomerGroups();
// Option
$this->load->model('catalog/option');
if ($product_id) {
$product_options = $this->model_catalog_product->getOptions($product_id);
} else {
$product_options = [];
}
$data['product_options'] = [];
foreach ($product_options as $product_option) {
$product_option_value_data = [];
if (isset($product_option['product_option_value'])) {
foreach ($product_option['product_option_value'] as $product_option_value) {
$option_value_info = $this->model_catalog_option->getValue($product_option_value['option_value_id']);
if ($option_value_info) {
$product_option_value_data[] = [
'name' => $option_value_info['name'],
'points' => round($product_option_value['points']),
'weight' => round($product_option_value['weight']),
] + $product_option_value;
}
}
}
$data['product_options'][] = [
'product_option_value' => $product_option_value_data,
'value' => $product_option['value'] ?? '',
] + $product_option;
}
$data['option_values'] = [];
foreach ($data['product_options'] as $product_option) {
if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') {
if (!isset($data['option_values'][$product_option['option_id']])) {
$data['option_values'][$product_option['option_id']] = $this->model_catalog_option->getValues($product_option['option_id']);
}
}
}
// Variants
if (!empty($product_info)) {
$data['variant'] = $product_info['variant'];
} else {
$data['variant'] = [];
}
// Overrides
if (!empty($product_info)) {
$data['override'] = $product_info['override'];
} else {
$data['override'] = [];
}
$data['options'] = [];
if (isset($this->request->get['master_id'])) {
$product_options = $this->model_catalog_product->getOptions($this->request->get['master_id']);
foreach ($product_options as $product_option) {
$product_option_value_data = [];
foreach ($product_option['product_option_value'] as $product_option_value) {
$option_value_info = $this->model_catalog_option->getValue($product_option_value['option_value_id']);
if ($option_value_info) {
$product_option_value_data[] = [
'name' => $option_value_info['name'],
'price' => (float)$product_option_value['price'] ? $product_option_value['price'] : false,
] + $product_option_value;
}
}
$option_info = $this->model_catalog_option->getOption($product_option['option_id']);
$data['options'][] = [
'product_option_value' => $product_option_value_data,
'name' => $option_info['name'],
'type' => $option_info['type'],
'value' => !empty($data['variant'][$product_option['product_option_id']]) ? $product_option['value'] : ''
] + $product_option;
}
}
// Subscription Plan
$this->load->model('catalog/subscription_plan');
$data['subscription_plans'] = $this->model_catalog_subscription_plan->getSubscriptionPlans();
if ($product_id) {
$data['product_subscriptions'] = $this->model_catalog_product->getSubscriptions($product_id);
} else {
$data['product_subscriptions'] = [];
}
// Discount
if ($product_id) {
$product_discounts = $this->model_catalog_product->getDiscounts($product_id);
} else {
$product_discounts = [];
}
$data['product_discounts'] = [];
foreach ($product_discounts as $product_discount) {
$data['product_discounts'][] = [
'date_start' => ($product_discount['date_start'] != '0000-00-00' ? $product_discount['date_start'] : ''),
'date_end' => ($product_discount['date_end'] != '0000-00-00' ? $product_discount['date_end'] : '')
] + $product_discount;
}
// Image
if (!empty($product_info)) {
$data['image'] = $product_info['image'];
} else {
$data['image'] = '';
}
$this->load->model('tool/image');
$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'));
if ($data['image'] && is_file(DIR_IMAGE . html_entity_decode($data['image'], ENT_QUOTES, 'UTF-8'))) {
$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'));
} else {
$data['thumb'] = $data['placeholder'];
}
// Images
if ($product_id) {
$product_images = $this->model_catalog_product->getImages($product_id);
} else {
$product_images = [];
}
$data['product_images'] = [];
foreach ($product_images as $product_image) {
if ($product_image['image'] && is_file(DIR_IMAGE . html_entity_decode($product_image['image'], ENT_QUOTES, 'UTF-8'))) {
$image = $product_image['image'];
$thumb = $product_image['image'];
} else {
$image = '';
$thumb = 'no_image.png';
}
$data['product_images'][] = [
'image' => $image,
'thumb' => $this->model_tool_image->resize($thumb, (int)$this->config->get('config_image_default_width'), (int)$this->config->get('config_image_default_height')),
] + $product_image;
}
// Points
if (!empty($product_info)) {
$data['points'] = $product_info['points'];
} else {
$data['points'] = '';
}
// Rewards
if ($product_id) {
$data['product_reward'] = $this->model_catalog_product->getRewards($product_id);
} else {
$data['product_reward'] = [];
}
// SEO
if ($product_id) {
$this->load->model('design/seo_url');
$data['product_seo_url'] = $this->model_design_seo_url->getSeoUrlsByKeyValue('product_id', $product_id);
} else {
$data['product_seo_url'] = [];
}
// Layout
$this->load->model('design/layout');
$data['layouts'] = $this->model_design_layout->getLayouts();
if ($product_id) {
$data['product_layout'] = $this->model_catalog_product->getLayouts($product_id);
} else {
$data['product_layout'] = [];
}
$data['report'] = $this->getReport();
$data['user_token'] = $this->session->data['user_token'];
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');
$this->response->setOutput($this->load->view('catalog/product_form', $data));
}
/**
* Save
*
* @return void
*/
public function save(): void {
$this->load->language('catalog/product');
$json = [];
if (!$this->user->hasPermission('modify', 'catalog/product')) {
$json['error']['warning'] = $this->language->get('error_permission');
}
$required = [
'product_id' => 0,
'master_id' => 0,
'product_description' => [],
'model' => '',
'product_code' => [],
'location' => '',
'variant' => [],
'override' => [],
'quantity' => 0,
'minimum' => 0,
'subtract' => 0,
'stock_status_id' => 0,
'date_available' => '',
'manufacturer_id' => 0,
'shipping' => 0,
'price' => 0.0,
'points' => 0,
'weight' => 0.0,
'weight_class_id' => 0,
'length' => 0.0,
'length_class_id' => 0,
'status' => 0,
'tax_class_id' => 0,
'sort_order' => 0
];
$post_info = $this->request->post + $required;
foreach ($post_info['product_description'] as $language_id => $value) {
if (!oc_validate_length($value['name'], 1, 255)) {
$json['error']['name_' . $language_id] = $this->language->get('error_name');
}
if (!oc_validate_length($value['meta_title'], 1, 255)) {
$json['error']['meta_title_' . $language_id] = $this->language->get('error_meta_title');
}
}
if (!oc_validate_length($post_info['model'], 1, 64)) {
$json['error']['model'] = $this->language->get('error_model');
}
// Identifier
$this->load->model('catalog/identifier');
foreach ($post_info['product_code'] as $key => $product_code) {
$identifier_info = $this->model_catalog_identifier->getIdentifierByCode($product_code['code']);
if ($identifier_info && $identifier_info['validation'] && !oc_validate_regex($product_code['value'], $identifier_info['validation'])) {
$json['error']['code_' . $key] = sprintf($this->language->get('error_regex'), $product_code['code']);
}
}
$this->load->model('catalog/product');
if ($post_info['master_id']) {
$product_options = $this->model_catalog_product->getOptions($post_info['master_id']);
foreach ($product_options as $product_option) {
if (isset($post_info['override']['variant'][$product_option['product_option_id']]) && $product_option['required'] && empty($post_info['variant'][$product_option['product_option_id']])) {
$json['error']['option_' . $product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']);
}
}
}
// SEO
if ($post_info['product_seo_url']) {
$this->load->model('design/seo_url');
foreach ($post_info['product_seo_url'] as $store_id => $language) {
foreach ($language as $language_id => $keyword) {
if (!oc_validate_length($keyword, 1, 64)) {
$json['error']['keyword_' . $store_id . '_' . $language_id] = $this->language->get('error_keyword');
}
if (!oc_validate_path($keyword)) {
$json['error']['keyword_' . $store_id . '_' . $language_id] = $this->language->get('error_keyword_character');
}
$seo_url_info = $this->model_design_seo_url->getSeoUrlByKeyword($keyword, $store_id);
if ($seo_url_info && ($seo_url_info['key'] != 'product_id' || !isset($post_info['product_id']) || $seo_url_info['value'] != (int)$post_info['product_id'])) {
$json['error']['keyword_' . $store_id . '_' . $language_id] = $this->language->get('error_keyword_exists');
}
}
}
}
if (isset($json['error']) && !isset($json['error']['warning'])) {
$json['error']['warning'] = $this->language->get('error_warning');
}
if (!$json) {
if (!$post_info['product_id']) {
if (!$post_info['master_id']) {
// Normal product add
$json['product_id'] = $this->model_catalog_product->addProduct($post_info);
} else {
// Variant product add
$json['product_id'] = $this->model_catalog_product->addVariant($post_info['master_id'], $post_info);
}
} else {
if (!$post_info['master_id']) {
// Normal product edit
$this->model_catalog_product->editProduct($post_info['product_id'], $post_info);
} else {
// Variant product edit
$this->model_catalog_product->editVariant($post_info['master_id'], $post_info['product_id'], $post_info);
}
// Variant products edit if master product is edited
$this->model_catalog_product->editVariants($post_info['product_id'], $post_info);
}
$json['success'] = $this->language->get('text_success');
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
/**
* Delete
*
* @return void
*/
public function delete(): void {
$this->load->language('catalog/product');
$json = [];
if (isset($this->request->post['selected'])) {
$selected = (array)$this->request->post['selected'];
} else {
$selected = [];
}
if (!$this->user->hasPermission('modify', 'catalog/product')) {
$json['error'] = $this->language->get('error_permission');
}
if (!$json) {
// Product
$this->load->model('catalog/product');
foreach ($selected as $product_id) {
$this->model_catalog_product->deleteProduct($product_id);
}
$json['success'] = $this->language->get('text_success');
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
/**
* Copy
*
* @return void
*/
public function copy(): void {
$this->load->language('catalog/product');
$json = [];
if (isset($this->request->post['selected'])) {
$selected = (array)$this->request->post['selected'];
} else {
$selected = [];
}
if (!$this->user->hasPermission('modify', 'catalog/product')) {
$json['error'] = $this->language->get('error_permission');
}
if (!$json) {
$this->load->model('catalog/product');
foreach ($selected as $product_id) {
$this->model_catalog_product->copyProduct($product_id);
}
$json['success'] = $this->language->get('text_success');
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
/**
* Report
*
* @return void
*/
public function report(): void {
$this->load->language('catalog/product');
$this->response->setOutput($this->getReport());
}
/**
* Get Report
*
* @return string
*/
public function getReport(): string {
if (isset($this->request->get['product_id'])) {
$product_id = (int)$this->request->get['product_id'];
} else {
$product_id = 0;
}
if (isset($this->request->get['page']) && $this->request->get['route'] == 'catalog/product.report') {
$page = (int)$this->request->get['page'];
} else {
$page = 1;
}
$limit = 10;
$data['reports'] = [];
// Product
$this->load->model('catalog/product');
// Store
$this->load->model('setting/store');
$results = $this->model_catalog_product->getReports($product_id, ($page - 1) * $limit, $limit);
foreach ($results as $result) {
$store_info = $this->model_setting_store->getStore($result['store_id']);
if ($store_info) {
$store = $store_info['name'];
} elseif (!$result['store_id']) {
$store = $this->config->get('config_name');
} else {
$store = '';
}
$data['reports'][] = [
'ip' => $result['ip'],
'store' => $store,
'country' => $result['country'],
'date_added' => date($this->language->get('datetime_format'), strtotime($result['date_added']))
];
}
$report_total = $this->model_catalog_product->getTotalReports($product_id);
$data['pagination'] = $this->load->controller('common/pagination', [
'total' => $report_total,
'page' => $page,
'limit' => $limit,
'url' => $this->url->link('catalog/product.report', 'user_token=' . $this->session->data['user_token'] . '&product_id=' . $product_id . '&page={page}')
]);
$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));
return $this->load->view('catalog/product_report', $data);
}
/**
* Autocomplete
*
* @return void
*/
public function autocomplete(): void {
$this->load->language('catalog/product');
$json = [];
if (isset($this->request->get['filter_name'])) {
$filter_name = $this->request->get['filter_name'];
} else {
$filter_name = '';
}
if (isset($this->request->get['filter_model'])) {
$filter_model = $this->request->get['filter_model'];
} else {
$filter_model = '';
}
if (isset($this->request->get['limit'])) {
$limit = (int)$this->request->get['limit'];
} else {
$limit = $this->config->get('config_autocomplete_limit');
}
$filter_data = [
'filter_name' => $filter_name,
'filter_model' => $filter_model,
'start' => 0,
'limit' => $limit
];
// Product
$this->load->model('catalog/product');
// Option
$this->load->model('catalog/option');
// Subscription Plan
$this->load->model('catalog/subscription_plan');
$results = $this->model_catalog_product->getProducts($filter_data);
foreach ($results as $result) {
$option_data = [];
$product_options = $this->model_catalog_product->getOptions($result['product_id']);
foreach ($product_options as $product_option) {
$option_info = $this->model_catalog_option->getOption($product_option['option_id']);
if ($option_info) {
$product_option_value_data = [];
foreach ($product_option['product_option_value'] as $product_option_value) {
$option_value_info = $this->model_catalog_option->getValue($product_option_value['option_value_id']);
if ($option_value_info) {
$product_option_value_data[] = [
'product_option_value_id' => $product_option_value['product_option_value_id'],
'option_value_id' => $product_option_value['option_value_id'],
'name' => $option_value_info['name'],
'price' => (float)$product_option_value['price'] ? $this->currency->format($product_option_value['price'], $this->config->get('config_currency')) : false,
'price_prefix' => $product_option_value['price_prefix']
];
}
}
$option_data[] = [
'product_option_id' => $product_option['product_option_id'],
'product_option_value' => $product_option_value_data,
'option_id' => $product_option['option_id'],
'name' => $option_info['name'],
'type' => $option_info['type'],
'value' => $product_option['value'],
'required' => $product_option['required']
];
}
}
$subscription_plan_data = [];
$product_subscriptions = $this->model_catalog_product->getSubscriptions($result['product_id']);
foreach ($product_subscriptions as $product_subscription) {
$subscription_plan_info = $this->model_catalog_subscription_plan->getSubscriptionPlan($product_subscription['subscription_plan_id']);
if ($subscription_plan_info) {
$price = $this->currency->format($product_subscription['price'], $this->config->get('config_currency'));
$cycle = $subscription_plan_info['cycle'];
$frequency = $this->language->get('text_' . $subscription_plan_info['frequency']);
$duration = $subscription_plan_info['duration'];
if ($subscription_plan_info['duration']) {
$description = sprintf($this->language->get('text_subscription_duration'), $price, $cycle, $frequency, $duration);
} else {
$description = sprintf($this->language->get('text_subscription_cancel'), $price, $cycle, $frequency);
}
$subscription_plan_data[] = [
'subscription_plan_id' => $subscription_plan_info['subscription_plan_id'],
'customer_group_id' => $product_subscription['customer_group_id'],
'name' => $subscription_plan_info['name'],
'description' => $description
];
}
}
$json[] = [
'product_id' => $result['product_id'],
'name' => strip_tags(html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8')),
'model' => $result['model'],
'option' => $option_data,
'subscription' => $subscription_plan_data,
'price' => $result['price']
];
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
}