Main menu

Я уже рассказывал о доработке блога категории Joomla! 2.5 в этой статье, однако этот способ мне со временем показался не совсем совершенным. Дело в том, что данный вариант просто указывает размер изображений, которые указывают в блоке справа Изображения и ссылки в поле Изображение для вступительного текста материала. То есть размер изображения изменялся только визуально, но не фактически. Что же делать, если этот способ нам не подходит? Минусы в нем очевидны: используется оригинальное изображение, не обрезанное. Получается что изображение становится некрасивым, если его пропорции не были соблюдены при изменении размера. Кроме того оно весит больше, чем хотелось бы, так как изображение мы не обрезаем. Мне показалось, что именно обрезка изображений и последующая их замена оригиналов в блоге категории была бы максимально подходящим вариантом. Об этом далее...

Итак мы хотим добиться следующего функционала: при выборе Изображения для вступительного текста материала в блоке Изображения и ссылки изображение должно обрезаться по указанным параметрам, сохранятся в ту же папку с определенным префиксом в названии файла и в итоге выводиться в блоге категории. Это позволит нам значительно сократить размер страниц сайта, а именно блогов категорий, а так же сохранит более или менее понятный вид изображений. По крайней мере они будут аккуратно обрезаны, а не сжаты как попало.

Для этого нам нужно найти в файле  \components\com_content\views\category\tmpl\blog_item.php  этот код:

<?php if (isset($images->image_intro) and !empty($images->image_intro)) : ?>
<?php $imgfloat = (empty($images->float_intro))? $params->get('float_intro') : $images->float_intro; ?>
<div class="img-intro-<?php echo htmlspecialchars($imgfloat); ?>">
<img
<?php if ($images->image_intro_caption):
echo 'class="caption"'.' title="' .htmlspecialchars($images->image_intro_caption).'"';
endif; ?>
src="<?php echo htmlspecialchars($images->image_intro); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt); ?>"/>
</div>
<?php endif; ?> 

И заменить его нижепреведенным:

<?php
$img = json_decode($this->item->images);
$imgsrc = (isset($img->image_intro))?  $img->image_intro: '';
if ($imgsrc)
{
  echo '<div class="img-blog">';
  $h = 100; //Высота изображения
  $w = 150; //Ширина изображения
  $l = 100; //Отступ обрезки слева
  $t = 150; //Отступ обрезки сверху
  $path_parts = pathinfo($imgsrc);
  $file_thumb = $path_parts['dirname'].'/'.$path_parts['filename'].'_'.$h.'_'.$w.'.'.$path_parts['extension'];
  if (!file_exists($file_thumb) || filemtime($file_thumb) <= filemtime($imgsrc))
  {
    $image = new JImage($imgsrc);
    $new_image = $image->crop($w, $h, $l, $t, true, JImage::SCALE_INSIDE );
    $properties = $image->getImageFileProperties($imgsrc);
    switch ($properties->mime)
    {
      case 'image/jpeg':
      $type = IMAGETYPE_JPEG;
      break;
      case 'image/png':
      $type = IMAGETYPE_PNG;
      break;
      case 'image/gif':
      $type = IMAGETYPE_GIF;
      break;
    }
    $new_image->toFile($file_thumb, $type);
  }
$attr = getimagesize(JURI::base().$file_thumb);
echo '<a href="'.JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid)).'">';
echo JHTML::_('image', $file_thumb, htmlspecialchars($img->image_intro_alt), $attr[3]).'</a></div>';
}
?>

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

Остается немного поиграться с размерами, которые Вам нужны и пользоваться. Ну и не без ложки дегтя, все таки. На мой взгляд остается единственный минус: размер и отступы изображений будут одинаковы для всех категорий. В остальном все прекрасно функционирует, а учитывая то, что все функции выполняет движок Joomla! нагрузки не будет абсолютно.

погода на сегодня кременчуг