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

[Решено?..] Размер изображений?


Recommended Posts

Господа подскажите, как автоматом добавить в код, к изображениям, их размеры?

Версия движка 1.5.6.4
Вот нашел код
Откройте следующий файл в текстовом редакторе:  System/Library/Response.php

Найдите следующую строку кода в файле:          if ($this->level) {
Затем добавьте следующий код просто прежде чем выше линии:

//Q: Add width/height tags to all images for Google Page Speed tip:
//http://code.google.com/speed/page-speed/docs/rendering.html#SpecifyImageDimensions
preg_match_all('/<img[^>]+>/i', $this->output, $result);

$img = array();
foreach($result[0] as $img_tag) {
preg_match_all('/(width|height|src)=("[^"]*")/i',$img_tag, $img[$img_tag]);
}

foreach ($img as $k => $info) {
if (count($info) == 3 && $info[1][0] == 'src') {
//if (curl_init(str_replace('"', '', $info[2][0]))) {
$imgfile = str_replace('"', '', $info[2][0]);
$imgfile = str_replace(HTTP_SERVER, DIR_IMAGE . '../', $imgfile);
$imgfile = str_replace(HTTPS_SERVER, DIR_IMAGE . '../', $imgfile);
if (file_exists($imgfile)) {
$image_info = getImageSize(str_replace('"', '', $imgfile));
$k = trim($k, '/>');
$k = trim($k, '>');
$this->output = str_replace($k, ($k . ' ' . $image_info[3]), $this->output);
}
}
}
//

Но он не работает, : ???    Выдает на всю страницу:

ache/vq2-system_library_response.php on line 97 }kƕs?iHF >~+KXYj"0-9~N8'I/sV%KK[ $f䳂&Yuνq<Ϛ^]<n8;s2ԭNf jMqyF;}tl˰my܂܂

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


Повторюсь, нельзя так делать, особенно на адаптивных шаблонах типа Shoppica2.

 

Во первых, getImageSize ооооооооооооочень долгая, чтобы получить размер одного изображения иногда уходит 0.5 секунд. Сайт будет грузиться долго.

 

Во вторых, замена всех image реплейсом из класса response - очень плохая идея, которая никак не сходится с архитектурой OpenCart, получается говнокод. Хотите сделать из магазина помойку, пожалуйста.

Самый правильный способ - указать размеры только для тех изображений, которым это необходимо. Как узнать каким изображениям это необходимо?

Во первых, это все изображения в шапке сайта т.е. чаще всего это только логотип. для этого необходимо открыть логотип, узнать его размер. Открыть файл catalog/view/theme/название-темы/common/header.tpl найти вывод логотипа и вручную указать высоту и ширину. Так же с остальными изображениями в шапке сайта.

 

Во вторых, изображения категорий и модулей, которые стоят в начале страницы, т.е. модулей, которые показаны при загрузке сайта без прокрутки страницы.
В обоих случаях необходимо получить настройки (ширина/высота) изображений в контроллере и передать их в шаблон. Но чтобы ускорить процесс, можно получить и вставить ширину и высоту прямо в файле шаблона.

Открываем файл шаблона категории, находим вывод изображения товара и добавляем ширину и высоту:

<div class="image">
<a href="<?php echo $product['href']; ?>">
<img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" width="<?php echo $this->config->get('config_image_product_width') ?>" height="<?php echo $this->config->get('config_image_product_height') ?>" alt="<?php echo $product['name']; ?>" />
</a>
</div>

Аналогично с файлами шаблонов модулей.

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

А почему не вынимать еще из контроллера размеры? Ведь указываются они еще в админке, потом в контролере используются для изменения размеров изображений, шлепаем в переменные и вызывает вместе с путем каринки, профит. 

не знаю какой вариант лучше, мой или пользователя 

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


Повторюсь, нельзя так делать, особенно на адаптивных шаблонах типа Shoppica2.

 

Во первых, getImageSize ооооооооооооочень долгая, чтобы получить размер одного изображения иногда уходит 0.5 секунд. Сайт будет грузиться долго.

 

Во вторых, замена всех image реплейсом из класса response - очень плохая идея, которая никак не сходится с архитектурой OpenCart, получается говнокод. Хотите сделать из магазина помойку, пожалуйста.

Самый правильный способ - указать размеры только для тех изображений, которым это необходимо. Как узнать каким изображениям это необходимо?

Во первых, это все изображения в шапке сайта т.е. чаще всего это только логотип. для этого необходимо открыть логотип, узнать его размер. Открыть файл catalog/view/theme/название-темы/common/header.tpl найти вывод логотипа и вручную указать высоту и ширину. Так же с остальными изображениями в шапке сайта.

 

Во вторых, изображения категорий и модулей, которые стоят в начале страницы, т.е. модулей, которые показаны при загрузке сайта без прокрутки страницы.

В обоих случаях необходимо получить настройки (ширина/высота) изображений в контроллере и передать их в шаблон. Но чтобы ускорить процесс, можно получить и вставить ширину и высоту прямо в файле шаблона.

Открываем файл шаблона категории, находим вывод изображения товара и добавляем ширину и высоту:

<div class="image">
<a href="<?php echo $product['href']; ?>">
<img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" width="<?php echo $this->config->get('config_image_product_width') ?>" height="<?php echo $this->config->get('config_image_product_height') ?>" alt="<?php echo $product['name']; ?>" />
</a>
</div>
Аналогично с файлами шаблонов модулей.
 

В общем все работает, единственное непонятно; в некоторых картинках размер указан, а gtmetrix.com говорит что надо поставить???

Пробовал так и этак результат одинаковый:

<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title=" <?php echo $name; ?>" "width: 500px; height: 60px;" alt=" <?php echo $name; ?>" /></a></div>
<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title=" <?php echo $name; ?>" style= "width: 500px; height: 60px;" alt=" <?php echo $name; ?>" /></a></div>
Надіслати
Поділитися на інших сайтах


А почему не вынимать еще из контроллера размеры? Ведь указываются они еще в админке, потом в контролере используются для изменения размеров изображений, шлепаем в переменные и вызывает вместе с путем каринки, профит. 

не знаю какой вариант лучше, мой или пользователя 

halfhope

 

Можно и так, так даже правильней. Я просто чтобы пользователи не путались так сделал.

 

В общем все работает, единственное непонятно; в некоторых картинках размер указан, а gtmetrix.com говорит что надо поставить???

Пробовал так и этак результат одинаковый:

<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title=" <?php echo $name; ?>" "width: 500px; height: 60px;" alt=" <?php echo $name; ?>" /></a></div>
<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title=" <?php echo $name; ?>" style= "width: 500px; height: 60px;" alt=" <?php echo $name; ?>" /></a></div>
 

Вы неправильно указываете размеры!!! В формате HTML!!! Откуда Вы взяли "width: 500px; height: 60px;" и style= "width: 500px; height: 60px;" ?????

Нужно вот так

<img src="<?php echo $logo; ?>" title=" <?php echo $name; ?>" width="500" height="60" alt=" <?php echo $name; ?>" />
Надіслати
Поділитися на інших сайтах

Можно и так, так даже правильней. Я просто чтобы пользователи не путались так сделал.

 

 

Вы неправильно указываете размеры!!! В формате HTML!!! Откуда Вы взяли "width: 500px; height: 60px;" и style= "width: 500px; height: 60px;" ?????

Нужно вот так

<img src="<?php echo $logo; ?>" title=" <?php echo $name; ?>" width="500" height="60" alt=" <?php echo $name; ?>" />
Эфект тот же. Главное что, в исходном коде страницы  есть размеры, а gtmetrix.com по прежнему утверждает что нет.

 

когда использовал :

width="<?php echo $this->config->get('config_image_product_width') ?>" height="<?php echo $this->config->get('config_image_product_height') ?>"
gtmetrix.com сказл ОК!  а конкретные размеры не хочет???
Надіслати
Поділитися на інших сайтах


Имею ввиду те размеры, какие прописывал вручную, а не где подставлялось значение.

Все размеры есть, кроме логотипа в хедере - размеры указаны а gtmetrix.com утверждает что нет.

Рядом другая картинка стоит - так с ней все нормально, прописано одинаково, - мистика какая то ?

Пробовал загружать другие страницы в gtmetrix.com все равно упорно не видит.

К cloudflare не подключен.

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


qqq64, дружище, ты проблему решаешь или "gtmetrix" рекламируешь?

А как реализовать мой вариант?)

в твоем варианте ты и так уже написал, как реализовать - передавай размеры из настроек в переменную и используй в шаблонах.

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

А как реализовать мой вариант?)

 

Мой вариант идет в обход контроллера. Я получаю данные в шаблне сразу из настроек магазина, минуя присвоение в контроллере. Заметь, что хэндл приложения доступен в шаблоне т.е. в шаблоне можно использовать $this и все его плюшки минуя контроллер. Я именно так и сделал т.к. лень передавать данные из контроллера в шаблон.

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

так по дефолту мы берем данные из контроллера в шаблон =\ как я понимаю, вся работаю заключается в одной строчке где берем оригинальную картинку, размеры из админки и все это заворачиваем в ... метод? О_О не знаю точного названия, пускай будет в функцию. Ну да, для каждого "шаблона" (каталог, карточка и т.д.) доделывать, но по сути копи паст =\ имхо. 

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


  • 7 months later...

Уважаемый, halfhope!

 

Нашел эту тему случайно. Модифицировал себе response.php как у топикстартера с getImageSize. На сервере вроде не тормозило. А вот на локальном сервере - тормоза очень приличные.

 

Удалил нафиг этот метод добавления размеров.

 

А что Вы скажете на такой способ решения проблемы с добавлением размеров изображений (нашел здесь: http://forum.opencart.com/viewtopic.php?f=121&t=20057):

 

 "Modifying the individual controllers and templates is the best method to implement width/height tags. For those who are lazy and don't mind some sloppy code they can just replace:

catalog/model/tool/image.php

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
         return HTTPS_IMAGE . $new_image;
      } else {
         return HTTP_IMAGE . $new_image;
      }

with

  if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
         return HTTPS_IMAGE . $new_image . '" width="' . $width . '" height="' . $height;
      } else {
         return HTTP_IMAGE . $new_image . '" width="' . $width . '" height="' . $height;
      }

and that will automatically add it everywhere an image is generated. This won't work for any images which aren't resized."

 

И вот такая модификация этого кода:

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
         return $this->config->get('config_ssl') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
      } else {
         return $this->config->get('config_url') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
      }   

Не знаю чем этот вариант отличается.

 

Спасибо за консультацию!

Змінено користувачем sadko
Надіслати
Поділитися на інших сайтах


Супер, в данном случае OpenCart уже знает размеры изображения и Вы просто выводите их. Это лучший вариант! Только скорей всего не прокатит со слайдерами и другими javascript модулями, им нужен чистый путь к изображению, без лишнего HTML.

Змінено користувачем afwollis
Надіслати
Поділитися на інших сайтах

а что особенного в этом варианте:

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
         return $this->config->get('config_ssl') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
      } else {
         return $this->config->get('config_url') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
      }   

?

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


Не используется getImageSize, используются заданные в OpenCart размеры и править необходимо всего в одном месте, а не в шаблоне/контроллере. Хотя с точки зрения MVC это не очень правильно. Зато очень быстро.

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

Я имел ввиду чем отличаются между собой эти два варианта:

 if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
         return HTTPS_IMAGE . $new_image . '" width="' . $width . '" height="' . $height;
      } else {
         return HTTP_IMAGE . $new_image . '" width="' . $width . '" height="' . $height;
      }

и

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
         return $this->config->get('config_ssl') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
      } else {
         return $this->config->get('config_url') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
      }   

тут строки по разному записаны:

return HTTPS_IMAGE . $new_image . '" width="' . $width . '" height="' . $height;

и эта же строка во 2-м варианте:

 return $this->config->get('config_ssl') . 'image/' . $new_image . '" width="' . $width . '" height="' . $height;
Надіслати
Поділитися на інших сайтах


Сделал себе на сайте. Работает. Есть небольшое НО, которое и было описано в исходнике - не ставит размеры на картинки, которым не делается resize. К примеру - логотип. На картинках которые в fancy-box увеличиваются на странице товара. Баннеры.

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


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

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

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

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

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

Вхід

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

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

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

Important Information

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