我有一些与 Magento 的免费扩展OnePica ImageCdn有关的问题。
当我上传“损坏的图像”时,前端出现损坏的图像。
好的,让我们开始长篇大论:
我注意到这是因为 ImageCdn 扩展和“损坏的图像”而发生的。
在 ImageCdn 的部分代码中:
OnePica_ImageCdn_Helper_Image
/**
* In older versions of Magento (<1.1.3) this method was used to get an image URL.
* However, 1.1.3 now uses the getUrl() method in the product > image model. This code
* was added for backwards compatibility.
*
* @return string
*/
public function __toString()
{
parent::__toString();
return $this->_getModel()->getUrl();
}
我的问题是,有人知道该代码的目的是什么吗?我不明白他们上面的评论是什么意思。我认为这是一个错误,因为它总是return $this->_getModel()->getUrl();
真的是一个错误还是只是我的错误解释?
这是我到目前为止所做的:
- 我有一张图片
dummy.jpeg
- 经过一番调查,我才意识到这是一个“腐败的形象”。
- 我测试使用:
<?php print_r(getimagesize('dummy.jpeg')); ?>
结果:
Array ( [0] => 200 [1] => 200 [2] => 6 [3] => width="200" height="200" [bits] => 24 [mime] => image/x-ms-bmp )
当然,我对结果感到惊讶,因为当我使用Preview
(在 Mac OSX 上)
打开它时它看起来不错
- 然后我用十六进制编辑器打开它,前两个字节是:
BM
这是BMP的标识符 - 我尝试为产品上传 .bmp 图片 -> 失败,无法选择图片
- 我让我的同事也上传它(在 Ubuntu 上),他能够将文件类型的选择更改为“任何文件”。当他单击“上传文件”时,显示的错误消息表明不允许该类型的文件。
- 我脑海中闪过的是:管理员试图上传
.bmp
图片但失败了。然后他将其重命名为.jpeg
并成功。虽然我不明白什么样的图像可以重命名而不显示损坏的图像徽标(超出主题)。 - 这些场景会触发异常,我将分解我所追踪的内容。
代码跟踪:
- app/design/frontend/base/default/catalog/product/view/media.phtml
<?php
$_img = '<img id="image" src="'.$this->helper('catalog/image')->init($_product, 'image').'" alt="'.$this->htmlEscape($this->getImageLabel()).'" title="'.$this->htmlEscape($this->getImageLabel()).'" />';
echo $_helper->productAttribute($_product, $_img, 'image');
?>
- 从该代码中,我知道图像 url 是使用以下方法生成的:
$this->helper('catalog/image')->init($_product, 'image')
- 我做了
Mage::log((string)$this->helper('catalog/image')->init($_product, 'image'));
结果:
http://local.m.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/d/u/dummy.jpeg
.
- Mage_Catalog_Helper_Image
public function __toString()
{
try {
if( $this->getImageFile() ) {
$this->_getModel()->setBaseFile( $this->getImageFile() );
} else {
$this->_getModel()->setBaseFile( $this->getProduct()->getData($this->_getModel()->getDestinationSubdir()) );
}
if( $this->_getModel()->isCached() ) {
return $this->_getModel()->getUrl();
} else {
if( $this->_scheduleRotate ) {
$this->_getModel()->rotate( $this->getAngle() );
}
if ($this->_scheduleResize) {
$this->_getModel()->resize();
}
if( $this->getWatermark() ) {
$this->_getModel()->setWatermark($this->getWatermark());
}
Mage::log('pass');
$url = $this->_getModel()->saveFile()->getUrl();
Mage::log('not pass');
}
} catch( Exception $e ) {
$url = Mage::getDesign()->getSkinUrl($this->getPlaceholder());
}
return $url;
}
- 中触发的错误
$this->_getModel()->saveFile()->getUrl()
。在代码的某些部分,它最终会达到:
Varien_Image_Adapter_Gd2
private function _getCallback($callbackType, $fileType = null, $unsupportedText = 'Unsupported image format.')
{
if (null === $fileType) {
$fileType = $this->_fileType;
}
if (empty(self::$_callbacks[$fileType])) {
//reach this line -> exception thrown
throw new Exception($unsupportedText);
}
if (empty(self::$_callbacks[$fileType][$callbackType])) {
throw new Exception('Callback not found.');
}
return self::$_callbacks[$fileType][$callbackType];
}
- 在前面的代码中捕获了异常:
Mage_Catalog_Helper_Image
public function __toString()
{
...
} catch( Exception $e ) {
$url = Mage::getDesign()->getSkinUrl($this->getPlaceholder());
}
...
}
$url 变成了:
http://local.m.com/skin/frontend/default/default/images/catalog/product/placeholder/image.jpg
- 那么,它应该已经生成了占位符图像吧? (没有 ImageCdn 扩展名)
- 没有为什么
Mage_Catalog_Helper_Image
被重写OnePica_ImageCdn_Helper_Image
public function __toString()
{
parent::__toString(); //the result is http://local.m.com/skin/frontend/default/default/images/catalog/product/placeholder/image.jpg but no variable store/process its value
return $this->_getModel()->getUrl(); //in the end it will return http://local.m.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/d/u/dummy.jpeg
}
万一你们都已经忘记了这个问题:有人知道该代码的目的是什么吗?我不明白他们上面的评论是什么意思。这真的是一个错误还是只是我的错误解释?