Кешируем превью (Thumbnail)
При разработке последнего проекта, при выводе шаблона нужно было показывать большое количество превь-картинок (thumbnails). Самым быстрым решением было сжимать картинки до нужных размеров на лету . Но такой подход не очень хорош с точки зрения производительности скрипта.
Есть у Symfony очень хороший плагин для генерации превью – sfThumbnailPlugin, но есть одно свойство плагина, затрудняющее его использование – превью нужно генерировать или при загрузке файла на сервер или же по запросу. Идеально если б превью создавалось при первом обращении к картинке, а при последующих обращениях отдавался бы созданный файл.
Для этого возьмем снипет:
function getThumbnail($image,$width=null,$height=null, $scale = true, $inflate = true, $quality = 75)
{
$image_dir=dirname($image);
$image_file=basename($image);
$thumbnail_dir='';
if ($width>0) $thumbnail_dir.=$width;
if ($height>0) $thumbnail_dir.='x'.$height;
if ($width>0 || $height>0) $thumbnail_dir.='/';
if (!file_exists(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir.$image_file) && ($width!=null || $height!=null))
{
if (!is_dir(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir))
{
mkdir (sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir,0777);
}
$thumbnail = new sfThumbnail($width, $height,$scale,$inflate,$quality);
$thumbnail->loadFile(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$image_file);
$thumbnail->save(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir.$image_file);
}
return '/uploads'.'/'.$image_dir.'/'.$thumbnail_dir.$image_file;
}
Этот код ложим в файл myapp/lib/ThumbnailHelper.php и добавляем в модель вот такой код:
public function getThumbnail($img=null,$width=null,$height=null)
{
sfLoader::loadHelpers('Thumbnail');
return getThumbnail('images/'.$img,$width,$height);
}
Дальше, в представлении можно писать следующее:
image_tag($item->getThumbnail($item->getImg(), 150,120))
где $item – экземпляр класса, в модель которого мы добавляли код, getImg() – функция, возращающая путь к изображению.
Теперь при обращении к картинке, создается превью и кладется в каталог, соответствующий размеру.
Вы можете оставить комментарий или подписаться на RSS feed



А почему бы не попробовать эту штучку сделать фильтром? По-моему, это как раз для фильтров работа.