Оценок: 3
453
Изображения Opencart. Изменение размера при загрузке, удаление вместе с товаром

Изображения Opencart. Resize при загрузке, удаление вместе с товаром

Здесь расскажу, как сделать удаление изображений товара вместе с удалением этого самого товара. А еще - как менять размер оригинального изображение (во время загрузки). Не самые необходимые возможности, но иногда бывает нужно.

Удаление изображений вместе с товаром

Для этого понадобится немного дописать функцию удаления товара. Найти ее можно по следующему пути:
/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. Это округляет к меньшему значению и в этом случае почти всегда получается без белых полей, а вот если в большую сторону округлить, то почти всегда есть небольшое поле.

Оценок: 3

Комментарии (0)

    Надежный хостинг VPS серверов
    • Свои ISO образы
    • VDS с оплатой раз и навсегда
    • Аренда VDS на любой срок, с оплатой по дням
    • Большое разнообразие конфигураций
    • Дата-центры в ЕС и России
    + скидка 10%