Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Модуль OcBox Image Optimizer — масове стиснення фото товарів OpenCart і ocStore до 80% розміру: JPG / PNG / WebP, без втрати якості [Поддержка]


Recommended Posts

OcBox Image Optimizer — массовое сжатие фото товаров OpenCart и ocStore до 80% размера: JPG / PNG / WebP, без потери качества


OcBox Image Optimizer — массовое сжатие фото товаров OpenCart и ocStore до 80% размера: JPG / PNG / WebP, без потери качества



 

  • +1 1
Надіслати
Поділитися на інших сайтах


В 18.01.2026 в 11:43, Aktozdes сказав:

Цей модуль не видалить фото які в описі використовуються?

Не должен, но при использовании, крайне рекомендую всегда делать бекап магазина.

  • +1 1
Надіслати
Поділитися на інших сайтах


@OcBox отличный модуль с большими возможностями и удобным интерфейсом. При беглой проверке нашел ошибку - на  вкладке Панель -> нажать кнопку Старт для организации "Изображения брендов". Будет ошибка. В логах

2026-01-23 22:33:32 - Exception:  Error: Unknown column 'name' in 'field list' (1054) 
                SELECT name FROM `oc_manufacturer_description`
                WHERE manufacturer_id = 5 AND language_id = 1 in \system\library\db\mysqli.php on line 53

Причина ошибки - в таблице manufacturer_description  нет поля name. Таблица manufacturer - содержит общие данные о производителе (включая поле name), а таблица 

manufacturer_description — используется для мультиязычных описаний, там поля description, meta_title, meta_description, meta_keyword, а не name.

Ошибку вызывает /system/library/boximageoptimizer.php метод
 

    public function generateManufacturerSeoFilename($manufacturer_id, $language_id = 1, $max_length = 100) {
        $table_check = $this->db->query("SHOW TABLES LIKE '" . DB_PREFIX . "manufacturer_description'");
        
        if ($table_check->num_rows) {
            $query = $this->db->query("
                SELECT name FROM `" . DB_PREFIX . "manufacturer_description`
                WHERE manufacturer_id = " . (int)$manufacturer_id . " AND language_id = " . (int)$language_id
            );
            
            if ($query->num_rows && !empty($query->row['name'])) {
                $slug = $this->slugify($query->row['name'], $max_length - 12);
                return $slug . '-brand-' . $manufacturer_id;
            }
        }

Надіслати
Поділитися на інших сайтах


В 24.01.2026 в 07:35, Edvard сказав:

@OcBox отличный модуль с большими возможностями и удобным интерфейсом. При беглой проверке нашел ошибку - на  вкладке Панель -> нажать кнопку Старт для организации "Изображения брендов". Будет ошибка. В логах

2026-01-23 22:33:32 - Exception:  Error: Unknown column 'name' in 'field list' (1054) 
                SELECT name FROM `oc_manufacturer_description`
                WHERE manufacturer_id = 5 AND language_id = 1 in \system\library\db\mysqli.php on line 53

Причина ошибки - в таблице manufacturer_description  нет поля name. Таблица manufacturer - содержит общие данные о производителе (включая поле name), а таблица 

manufacturer_description — используется для мультиязычных описаний, там поля description, meta_title, meta_description, meta_keyword, а не name.

Ошибку вызывает /system/library/boximageoptimizer.php метод
 

    public function generateManufacturerSeoFilename($manufacturer_id, $language_id = 1, $max_length = 100) {
        $table_check = $this->db->query("SHOW TABLES LIKE '" . DB_PREFIX . "manufacturer_description'");
        
        if ($table_check->num_rows) {
            $query = $this->db->query("
                SELECT name FROM `" . DB_PREFIX . "manufacturer_description`
                WHERE manufacturer_id = " . (int)$manufacturer_id . " AND language_id = " . (int)$language_id
            );
            
            if ($query->num_rows && !empty($query->row['name'])) {
                $slug = $this->slugify($query->row['name'], $max_length - 12);
                return $slug . '-brand-' . $manufacturer_id;
            }
        }

 

 

Потрачено  FIx!

  • +1 1
Надіслати
Поділитися на інших сайтах


@OcBox еще ошибка - вкладка Оптимизация - нажать кнопку Сканировать - получаем ошибку, в логах.
 

Error:  Call to undefined method Boximageoptimizer::getLastSkipReason() in \admin\controller\extension\module\box_image_optimizer.php on line 474


 

Надіслати
Поділитися на інших сайтах


Причина ошибки, указанной в сообщении выше

В классе Boximageoptimizer отсутствует метод getLastSkipReason(), при этом контроллер использует его для статистики пропусков.

Нужно добавить в /system/library/boximageoptimizer.php

// добавить свойство
private $last_skip_reason = '' ;

//добавить метод
public function getLastSkipReason () {
return $this -> last_skip_reason ;
}


    //Исправить метод 
	addToQueue public function addToQueue ( $file , $priority = 5 ) {
	// сброс причины пропуска 
		$this -> last_skip_reason = '' ;  
        $path = $this -> getFullPath ( $file );     
  

		if (! file_exists ( $path )) {  
			$this -> last_skip_reason = 'file_not_found' ; return false ; }           
        
        $check = $this -> db -> query ( " 
            SELECT queue_id FROM `" . DB_PREFIX . "box_image_optimizer_queue`    
            WHERE file_path = '" . $this -> db -> escape ( $file ) . "'      
        " ); 
        
        if ( $check -> num_rows ) {  
		$this -> last_skip_reason = 'already_in_queue' ; return false ; }           

        $hash = md5_file ( $path );  
        $logCheck = $this -> db -> query ( " 
            SELECT log_id FROM `" . DB_PREFIX . "box_image_optimizer_log`    
            WHERE file_path = '" . $this -> db -> escape ( $file ) . "'      
            AND file_hash = '" . $this -> db -> escape ( $hash ) . "'      
            AND status = 'success'
            LIMIT 1
        " ); 
        
        if ( $logCheck -> num_rows ) {  
		$this -> last_skip_reason = 'already_optimized' ; return false ; }           

        $info = @getimagesize ( $ path );   
        
        $this -> db -> query ( "INSERT IGNORE INTO `" . DB_PREFIX . "box_image_optimizer_queue` SET     
            `file_path` = '" . $this -> db -> escape ( $file ) . "',      
            `file_hash` = '" . $this -> db -> escape ( $hash ) . "',      
            `file_size` = " . ( int ) filesize ( $path ) . ",          ` width ` 
            = " . ( int ) ( isset ( $ info [ 0 ) ) ? $ info [ 0 : 0 ) .              
            = " . ( int ) ( isset ( $ info [ 1 ) ) ? ` mime_type ` = ' " . $this -> db -> escape (isset ($info [' mime '])? $info [' mime ']:''). "' , `status` = 'pending' , `priority` = ". (int) $priority. " , `created_at` = NOW (), `updated_at` = NOW () ");                

        return $this -> db -> countAffected() > 0 ;
        }  
   

Также желательно подправить addToQueue() так, чтобы он выставлял причину ошибки (заделы на предстоящие улучшения). Текущая реализация addToQueue() возвращает только true/false, но не сообщает причину false:

  • return false, если файл не найден
  • return false, если уже есть в очереди
  • return false, если уже оптимизирован (по логу)

Контроллер различает только:

  • already_in_queue
  • already_optimized
  • "второе"

Еще одна ошибка: в addToQueue() используется таблица box_image_optimizer_* , а в resetAll() очищаются другие таблицы с именами box_imageoptimizer_* , что не соответствует реальным именам в базе. В коде
 

    public function resetAll() {
        $tables = array(
            'box_imageoptimizer_queue',
            'box_imageoptimizer_stats',
            'box_imageoptimizer_log'
        );

Должно быть
 

    public function resetAll() {
        $tables = array(
            'box_image_optimizer_queue',
            'box_image_optimizer_stats',
            'box_image_optimizer_log'
        );

И еще найдено нелогичное поведение оптимизации - после оптимизации файл может вырасти в размере (отрицательная оптимизация). 

Правильная логика: если результат не дал экономии (или ухудшил), откатываемся к исходному файлу и считаем операцию "skip".

Необходимо производить оптимизацию во временный файл, сравнивать размеры и только потом подменять оригинал.

Змінено користувачем Edvard
При редагуванні повідомлення псується оформлений код
Надіслати
Поділитися на інших сайтах


В 26.01.2026 в 13:29, clarionio сказав:

AI Slop

Не знаю, яку користь несе ваше повідомлення? Але бачу по лайках, що воно дуже корисне та змістовне. Набагато корисніше повідомлень про помилки, проблеми чи їх вирішення.

Необґрунтована заява. Будь-який модуль / шаблон, який продається тут на форумі містить купу помилок. І це платні рішення! При цьому більшість закодовані ионкубом або обфусцовані. У авторів через високе почуття власної важливості та замиленості очей не вистачає часу, бажання тощо, виправляти помилки. Тут безкоштовний модуль із відкритим кодом і що його допомагало написати – не має значення.

  • +1 2
Надіслати
Поділитися на інших сайтах


В 25.01.2026 в 10:12, Edvard сказав:

@OcBox еще ошибка - вкладка Оптимизация - нажать кнопку Сканировать - получаем ошибку, в логах.
 

Error:  Call to undefined method Boximageoptimizer::getLastSkipReason() in \admin\controller\extension\module\box_image_optimizer.php on line 474


 

Fix !

  • +1 1
Надіслати
Поділитися на інших сайтах


В 27.01.2026 в 10:01, georgiy1 сказав:

Добрый день, не работает модуль AJAX Error: error image.thumb.png.4edb5852c00036f6b1ecf56904fccd5e.png
Подскажите, как поправить?

Спасибо, разобрались с вами )

Надіслати
Поділитися на інших сайтах


26.01.2026 в 14:20, Edvard сказал:

Не знаю, яку користь несе ваше повідомлення? Але бачу по лайках, що воно дуже корисне та змістовне. Набагато корисніше повідомлень про помилки, проблеми чи їх вирішення.

Необґрунтована заява. Будь-який модуль / шаблон, який продається тут на форумі містить купу помилок. І це платні рішення! При цьому більшість закодовані ионкубом або обфусцовані. У авторів через високе почуття власної важливості та замиленості очей не вистачає часу, бажання тощо, виправляти помилки. Тут безкоштовний модуль із відкритим кодом і що його допомагало написати – не має значення.

 ОН имел ввиду, что это бессмысленный код который сгенерирован ИИ

Надіслати
Поділитися на інших сайтах


29.01.2026 в 23:22, Ana_Nik сказал:

 ОН имел ввиду, что это бессмысленный код который сгенерирован ИИ

Та всі зрозуміли , що він мав на увазі) То він просто гавкнув та й побіг далі дерева обсикати. Свої функції як безкоштовна версія модуль виконує, а як реалізовано не важливо.

Надіслати
Поділитися на інших сайтах


30.01.2026 в 13:18, cherednychenkoom сказал:

Та всі зрозуміли , що він мав на увазі) То він просто гавкнув та й побіг далі дерева обсикати. Свої функції як безкоштовна версія модуль виконує, а як реалізовано не важливо.

Такое тоже бывает)))) а как бесплатно, то да. Работает, да и норм. Поблагодари автора, если пользуешься и всё)

Надіслати
Поділитися на інших сайтах


  • 1 month later...

Під час SEO перейменування зображень для кожного товару створюється окрема папка для зображень? Коли є тисячі товарів з одним фото на товар - це не дуже виправдано.

Надіслати
Поділитися на інших сайтах


В 06.03.2026 в 14:40, vlrvvv сказав:

Під час SEO перейменування зображень для кожного товару створюється окрема папка для зображень? Коли є тисячі товарів з одним фото на товар - це не дуже виправдано.

Как вы предлагаете это решить? Сложить в одну папку несколько десятков тысяч изображений и получить bottleneck производительности файловой системы ?

Надіслати
Поділитися на інших сайтах


В 06.03.2026 в 15:49, OcBox сказав:

Как вы предлагаете это решить? Сложить в одну папку несколько десятков тысяч изображений и получить bottleneck производительности файловой системы ?

Можливо якось так?
image/catalog/products/topCategory/brand/seoproductName-product_id_or_sku.jpg

Надіслати
Поділитися на інших сайтах


В 06.03.2026 в 15:57, niger сказав:

Можливо якось так?
image/catalog/products/topCategory/brand/seoproductName-product_id_or_sku.jpg

а если у вас 10 000 товаров одного бренда ?
Это частные случаи. В данной ситуации универсальный метод, который подходит для 99% ситуаций - это как есть.

Надіслати
Поділитися на інших сайтах


В 06.03.2026 в 16:05, OcBox сказав:

а если у вас 10 000 товаров одного бренда ?
Это частные случаи. В данной ситуации универсальный метод, который подходит для 99% ситуаций - это как есть.

Модуль ваш і вам краще знати як легше.

Мені здається якби додати три опції - кожен товар у окремій теці, або ось таке формування, чи ще якесь - стало б краще.
Три варіанти завжди краще ніж один. 
Але то вам обирати. Тим паче що модуль безкоштовний. 

Надіслати
Поділитися на інших сайтах


В 06.03.2026 в 18:11, niger сказав:

Модуль ваш і вам краще знати як легше.

Мені здається якби додати три опції - кожен товар у окремій теці, або ось таке формування, чи ще якесь - стало б краще.
Три варіанти завжди краще ніж один. 
Але то вам обирати. Тим паче що модуль безкоштовний. 


Это избыточно. И каждый паттерн будет требовать тестирования.

Надіслати
Поділитися на інших сайтах


  • 1 month later...
В 26.04.2026 в 09:52, gontagro сказав:

Каждая функция updateXxxReferences обновляет ссылку только в своей таблице. Если файл используется в 5 разных таблицах — обновится только 1.

Проверим! Спасибо!

Надіслати
Поділитися на інших сайтах


В 26.04.2026 в 09:52, gontagro сказав:

Каждая функция updateXxxReferences обновляет ссылку только в своей таблице. Если файл используется в 5 разных таблицах — обновится только 1.



фикс: updateAllImageReferences() теперь сканирует все колонки image/thumb/logo/banner/icon во всех таблицах через INFORMATION_SCHEMA. Если файл использовался в 5 таблицах — все 5 обновятся за один вызов.


Спасибо пофиксили !

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
Гість
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.