- Свои ISO образы
- VDS с оплатой раз и навсегда
- Аренда VDS на любой срок, с оплатой по дням
- Большое разнообразие конфигураций
- Дата-центры в ЕС и России
Здесь расскажу, как сделать удаление изображений товара вместе с удалением этого самого товара. А еще - как менять размер оригинального изображение (во время загрузки). Не самые необходимые возможности, но иногда бывает нужно.
Для этого понадобится немного дописать функцию удаления товара. Найти ее можно по следующему пути:
/admin/model/catalog/product.php
Здесь нужно найти:
public function deleteProduct($product_id) {
В функцию добавляем дополнительный параметр "$wi = false" (чуть дальше будет добавление отдельной кнопки), получится так:
public function deleteProduct($product_id, $wi = false) {
И в самом начале этой функции добавляем (здесь и далее буду приводить код с отступами, для более удобной замены):
if ($wi) {
$query = $this->db->query("SELECT p.image FROM " . DB_PREFIX . "product p WHERE p.product_id = '" . (int)$product_id . "'");
if ($query->num_rows) {
if ($query->row['image'] && file_exists(DIR_IMAGE.$query->row['image'])) {
unlink(DIR_IMAGE.$query->row['image']);
}
$query = $this->db->query("SELECT pi.image FROM " . DB_PREFIX . "product_image pi WHERE pi.product_id = '" . (int)$product_id . "'");
if ($query->num_rows) {
foreach ($query->rows as $value) if (file_exists(DIR_IMAGE.$value['image'])) {
unlink(DIR_IMAGE.$value['image']);
}
}
}
}
Получили изображение товара - удалили, затем то же самое с дополнительными. Единственное, при таком варианте лучше внимательно следить за тем, что удаляете.
Для безопасности (да и в целом полезно будет) можно вывести дополнительную кнопку удаления.
Вносим изменения в контроллер товара и шаблон (список). Для начала
/admin/controller/catalog/product.php
Здесь сначала найдем, Для Opencart 2.3:
$data['delete'] = $this->url->link('catalog/product/delete', 'token=' . $this->session->data['token'] . $url, true);
Ниже продублируем, с небольшим изменением:
$data['delete_wi'] = $this->url->link('catalog/product/delete', 'token=' . $this->session->data['token'] . $url.'&wi=1', true);
Тоже самое для Opencart 3, находим:
$data['delete'] = $this->url->link('catalog/product/delete', 'user_token=' . $this->session->data['user_token'] . $url, true);
Ниже вставляем:
$data['delete_wi'] = $this->url->link('catalog/product/delete', 'user_token=' . $this->session->data['user_token'] . $url.'&wi=1', true);
Как видно, разница только в 'token' -> 'user_token'. Теперь здесь же правки в функции delete. Находим:
foreach ($this->request->post['selected'] as $product_id) {
$this->model_catalog_product->deleteProduct($product_id);
}
Нужно заменить на следующее:
if (isset($this->request->get['wi'])) {
$wi = 1;
} else {
$wi = false;
}
foreach ($this->request->post['selected'] as $product_id) {
$this->model_catalog_product->deleteProduct($product_id,$wi);
}
Осталось вывести кнопку в шаблон
/admin/view/template/catalog/product_list.tpl для OC 2.3, или /admin/view/template/catalog/product_list.twig для OC 3
Для Opencart 2 находим:
<button type="button" data-toggle="tooltip" title="<?php echo $button_delete; ?>" class="btn btn-danger" onclick="confirm('<?php echo $text_confirm; ?>') ? $('#form-product').submit() : false;"><i class="fa fa-trash-o"></i></button>
И ниже:
<button type="button" form="form-product" formaction="<?php echo $delete_wi; ?>" data-toggle="tooltip" onclick="confirm('<?php echo $text_confirm; ?>') ? $('#form-product').submit() : false;" title="<?php echo $button_delete; ?> & IMAGE" class="btn btn-danger"><i class="fa fa-image"></i></button>
Для Opencart 3 находим:
<button type="button" form="form-product" formaction="{{ delete }}" data-toggle="tooltip" title="{{ button_delete }}" class="btn btn-danger" onclick="confirm('{{ text_confirm }}') ? $('#form-product').submit() : false;"><i class="fa fa-trash-o"></i></button>
Ниже нужно добавить:
<button type="button" form="form-product" formaction="{{ delete_wi }}" data-toggle="tooltip" title="{{ button_delete }} & IMAGE" class="btn btn-danger" onclick="confirm('{{ text_confirm }}') ? $('#form-product').attr('action', $(this).attr('formaction')).submit() : false;"><i class="fa fa-image"></i></button>
Здесь в onclick пришлось продублировать замену "action" формы, иначе не срабатывает нормально.
Вот и все. Но опять же, не забываем про внимательность.
Необходимость этой функции меньше, чем прошлой, но смысл может быть, например, если на сайт загружаются изображения избыточного размера. Еще можно сразу при загрузке уменьшить и убрать изменение размера для popup при выводе. Так и место получиться сэкономить и даже чуть-чуть (совсем) загрузку ускорить
Учитывая, что это коснется всех загружаемых через админку файлов, я решил сделать изменение размера только для jpg и не трогать другие расширения.
Правок не много и делаются в
/admin/controller/common/filemanager.php
Здесь нужно найти:
move_uploaded_file($file['tmp_name'], $directory . '/' . $filename);
И заменить следующим кодом:
$allowed_resize = array(
'image/jpeg',
'image/pjpeg'
);
if (in_array($file['type'], $allowed_resize)) {
list($width_orig, $height_orig, $image_type) = getimagesize($file['tmp_name']);
if ($width_orig > 400) {//для примера взял 400, здесь и ниже замените 400 на свою ширину
$new_width = 400;
//новая высота будет вычисляться по соотношению сторон
$new_height = round($new_width/($width_orig/$height_orig), 0, PHP_ROUND_HALF_DOWN);
$image = new Image($file['tmp_name']);
$image->resize($new_width, $new_height);
$image->save($directory . '/' . $filename);
} else {
move_uploaded_file($file['tmp_name'], $directory . '/' . $filename);
}
} else {
move_uploaded_file($file['tmp_name'], $directory . '/' . $filename);
}
При вычислении новой высоты изображения использовал параметр "PHP_ROUND_HALF_DOWN" для функции round. Это округляет к меньшему значению и в этом случае почти всегда получается без белых полей, а вот если в большую сторону округлить, то почти всегда есть небольшое поле.
USDT TRC-20: TYTHLkNVjGu7PMGKbW8Vh54w1zkkVjFbWT