- Свои ISO образы
- VDS с оплатой раз и навсегда
- Аренда VDS на любой срок, с оплатой по дням
- Большое разнообразие конфигураций
- Дата-центры в ЕС и России
Проверено на Opencart 3. Понадобится +/- 15 минут
После применения всех изменений, .jpg и .png изображения на сайте, к которым применяется изменение размера, будут выводиться в формате .webp (только в таком формате, независимо от браузера). Если же вам достаточно только добавить поддержку webp, смотрите в статье, какие изменения в этом случае лишние и не делайте их.
Если правильность вывода в старых версиях браузеров не важна, такой способ подойдет, иначе нужно смотреть или в сторону тега picture, или скрипта, который будет проверять поддерживает ли браузер webp и в зависимости от результата выводить нужное изображение
В этом варианте вносятся изменения в библиотеку image, а также в модель tool/image (в admin и catalog, всего 3 файла). Никаких правок в контроллерах и шаблонах не требуется.
Начать лучше с библиотеки /system/library/image.php, поскольку именно здесь происходит основная обработка и сюда идет обращение из моделей
Из коробки Opencart создает миниатюры для gif, png и jpeg. Добавим webp, для этого сначала найдем:
if ($this->mime == 'image/gif') {
$this->image = imagecreatefromgif($file);
} elseif ($this->mime == 'image/png') {
$this->image = imagecreatefrompng($file);
} elseif ($this->mime == 'image/jpeg') {
$this->image = imagecreatefromjpeg($file);
}
И добавим еще одну проверку с вызовом функции imagecreatefromwebp():
elseif ($this->mime == 'image/webp') {
$this->image = imagecreatefromwebp($file);
}
В результате должно получиться вот так:
if ($this->mime == 'image/gif') {
$this->image = imagecreatefromgif($file);
} elseif ($this->mime == 'image/png') {
$this->image = imagecreatefrompng($file);
} elseif ($this->mime == 'image/jpeg') {
$this->image = imagecreatefromjpeg($file);
} elseif ($this->mime == 'image/webp') {
$this->image = imagecreatefromwebp($file);
}
Далее найдем ту часть, где изображение сохраняется в файл:
if ($extension == 'jpeg' || $extension == 'jpg') {
imagejpeg($this->image, $file, $quality);
} elseif ($extension == 'png') {
imagepng($this->image, $file);
} elseif ($extension == 'gif') {
imagegif($this->image, $file);
}
Если вам нужна только поддержка webp, достаточно будет добавить сюда следующее:
elseif ($extension == 'webp') {
imagewebp($this->image, $file);
}
Если же в webp нужно конвертировать jpg и png, то нужно заменить функции imagejpeg() и imagepng() на функцию imagewebp(), в результате получится так:
if ($extension == 'jpeg' || $extension == 'jpg') {
imagewebp($this->image, $file, $quality);
} elseif ($extension == 'png') {
imagewebp($this->image, $file);
} elseif ($extension == 'gif') {
imagegif($this->image, $file);
} elseif ($extension == 'webp') {
imagewebp($this->image, $file);
}
Теперь переходим к правкам в моделях /catalog/model/tool/image.php и /admin/model/tool/image.php. Изменения в обоих файлах одинаковые.
Для начала сделаем так, что бы модель обрабатывала webp, а не игнорировала. Находим:
if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {
Добавим к этому списку IMAGETYPE_WEBP. Получим:
if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_WEBP))) {
Следующая правка нужна, только если хотите выводить jpeg и png как webp.
Если в библиотеке делали замену функций imagejpeg() и imagepng() на функцию imagewebp(), эта правка нужна, если не делали - не нужа.
Находим:
$extension = pathinfo($filename, PATHINFO_EXTENSION);
Ниже добавляем (делаем замену расширения файла):
$extension = str_replace(array('png','jpg','jpeg'),'webp',$extension);
Вот и все изменения.
USDT TRC-20: TYTHLkNVjGu7PMGKbW8Vh54w1zkkVjFbWT