22 августа 2016 г.

В OpenCart 1.5+ в административной части интерфейса товаров есть кнопка Копировать, которая отвечает за копирование отмеченных товаров из текущего списка товаров. Это не совсем удобно, так как после данной операции в системе сосздаются полноценные дубликаты, формы которых в любом случае придётся открывать и редактировать. Почему бы сразу не сделать копирование с последующим редактированием?

Для этого нам потребуется небольшая доработка двух системных файлов. В файле ./admin/controller/catalog/product.php добавляем код новой функции copy_insert():

public function copy_insert() {

if (isset($this->request->get['product_id'])) {

$this->load->model('catalog/product');
     
$product_info = $this->model_catalog_product->getProduct($this->request->get['product_id']);

if ($product_info) {

$data = array(
'model' => '', 'sku' => '', 'upc' => '', 'ean' => '', 'jan' => '', 'isbn' => '', 'mpn' => '',
'location' => '', /* 'keyword' => '', */ 'image' => '', 'model' => '', 'manufacturer_id' => '',
'shipping' => '', 'tax_class_id' => '', 'quantity' => '', 'minimum' => '', 'subtract' => '',
'stock_status_id' => '', 'status' => '', 'weight_class_id' => '', 'length_class_id' => '', 
'points' => '', 
);

foreach ($data as $key => $value) {
if ($value) {
$this->request->post[$key] = $value;
} else {
$this->request->post[$key] = $product_info[$key];
}
}

$this->load->model('tool/image');
$this->request->post['thumb'] = $this->model_tool_image->resize($product_info['image'], 100, 100);

$this->request->post['price'] = $this->currency->format($product_info['price'], false, false, false);

if ($product_info['date_available']) {
$this->request->post['date_available'] = date('Y-m-d', strtotime($product_info['date_available']));
}

$this->request->post['weight'] = $this->weight->format($product_info['weight'], false);
$this->request->post['length'] = $this->length->format($product_info['length'], false);
$this->request->post['width'] = $this->length->format($product_info['width'], false);
$this->request->post['height'] = $this->length->format($product_info['height'], false);

$this->request->post['product_description'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
$this->request->post['product_store'] = $this->model_catalog_product->getProductStores($this->request->get['product_id']);
$this->request->post['product_attribute'] = $this->model_catalog_product->getProductAttributes($this->request->get['product_id']);
$this->request->post['product_discount'] = $this->model_catalog_product->getProductDiscounts($this->request->get['product_id']);
$this->request->post['product_special'] = $this->model_catalog_product->getProductSpecials($this->request->get['product_id']);
$this->request->post['product_category'] = $this->model_catalog_product->getProductCategories($this->request->get['product_id']);
$this->request->post['product_option'] = $this->model_catalog_product->getProductOptions($this->request->get['product_id']);
$this->request->post['product_image'] = $this->model_catalog_product->getProductImages($this->request->get['product_id']);
$this->request->post['product_download'] = $this->model_catalog_product->getProductDownloads($this->request->get['product_id']);
$this->request->post['product_related'] = $this->model_catalog_product->getProductRelated($this->request->get['product_id']);
$this->request->post['product_reward'] = $this->model_catalog_product->getProductRewards($this->request->get['product_id']);
$this->request->post['product_layout'] = $this->model_catalog_product->getProductLayouts($this->request->get['product_id']);
unset($this->request->get['product_id']);
}

$this->insert();
}

Обратите внимание, поле keyword закомментировано, поскольку SEO URL должен быть уникальным на всю систему. Вы можете также поступить и с другими полями, если не хотите видеть их значения в копируемой форме. Кроме того, можно задать некоторым полям значения по умолчанию (в пустых одинарных ковычках).

Теперь модифицируем действие кнопки Копировать в шаблоне ./admin/view/template/catalog/product_list.tpl. А именно, найдём строку $('#form').attr('action', '<?php echo $copy; ?>'); $('#form').submit(); и заменим её на следующий код:

$checked = $('input[name*=\'selected\']').filter(':checked'); if ($checked.lenght > 1) { $('#form').attr('action', '<?php echo $copy; ?>'); $('#form').submit(); } else { location= $('#form').attr('action').replace('delete', 'copy_insert') + '&product_id=' + $checked.first().val(); }

Готово! Теперь если в списке товаров отметить один товар и нажать Копировать, то откроется новая форма с заполненными полями копируемого товара, после сохранения которой будет создан новый объект в системе. Если количество отмеченных товаров больше, то старая функция кнопки Копировать сохранится.

Примечание: Если у Вас нет опыта правки системного кода, то можете обратиться за нашей помощью.

0 comments:

Отправить комментарий

  • RSS
  • Twitter
  • Youtube