我有一个基于Tim Bezhashvyly帖子的函数,关于调整Magento中url的图像大小。我的问题在于缓存以及当有人更改具有相同名称的图像时。
示例:我有供应商徽标,名称为:mylogo.png。如果我想用不同的徽标更改此徽标但名称相同:mylogo.png徽标的前端版本不会更改,因为该功能检查是否有mylogo.png的缓存版本并且有一个显示旧的。
上传的徽标不是由我而是由供应商完成的,我不能阻止他命名所有他的logo version logo.png。我需要一种智能方法来更改缓存系统。每次加载前端页面时都会调用此函数,这就是为什么我需要缓存图像的原因我不想在页面加载时重新调整evreytime。
public function resizeImage($path='',$width=100,$height=null,$constrainOnly=true,$keepAspectRatio=true,$keepFrame=true,$keepTransparency=true){
$Tpath = explode('/',$path);
$end = end($Tpath);
$path = '';
for ($i=0; $i < count($Tpath)-1 ; $i++) {
if($i!=count($Tpath)){
$path .= $Tpath[$i].'/';
}else{
}
}
if($end!='')$_file_name = $end;
else $_file_name = '404.png';
$_media_dir = Mage::getBaseDir('media') . DS . $path;
$cache_path = $path . 'cache' . DS . $width.'X'.$height . DS;
$cache_dir = $_media_dir . 'cache' . DS . $width.'X'.$height . DS;
if (file_exists($cache_dir . $_file_name)) {
return Mage::getBaseUrl('media') . $cache_path . $_file_name;
} elseif (file_exists($_media_dir . $_file_name)) {
if (!is_dir($cache_dir)) {
mkdir($cache_dir);
}
$_image = new Varien_Image($_media_dir . $_file_name);
$_image->constrainOnly($constrainOnly);
$_image->keepAspectRatio($keepAspectRatio);
$_image->keepFrame($keepFrame);
$_image->keepTransparency($keepTransparency);
$_image->resize($width, $height);
$_image->save($cache_dir . $_file_name);
return Mage::getBaseUrl('media') . $cache_path . $_file_name;
}
}
答案 0 :(得分:0)
您可以尝试不同的方法:在上传新图像时清除该特定图像的缓存。因此,下次您的前端帮助程序尝试输出图像时,将生成一个新的缓存图像。
注意:如果对缓存的图像使用相同的URL,即使上传了新的图像,也请考虑处理浏览器缓存,否则,根据原始图像的校验和生成缓存图像的名称。
修改强>
一个好的做法是使用实体名称生成图像名称,在本例中为品牌名称。
在搜索引擎优化方面,使用可接受的关键字帮助您的网页在搜索引擎上排名非常重要。创建描述性,关键字丰富的文件名对于图像优化至关重要。搜索引擎不仅会抓取您网页上的文字,还会搜索图片文件名中的关键字。
来自:shopfiy
如果清除缓存太麻烦,你可以附加新文件校验和的前4个字母:
<?php
$fileName = sprintf("%s-%s.%s",
convert_text_to_friendly_url_function($brandName),
substr(md5_file($newUploadedFile), 0, 4).
$fileExtension
);
// now you have a new fileName, do whatever you need with it.
?>