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

Оценок: 2

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

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