Tengo alguna pregunta relacionada con la extensión gratuita de Magento OnePica ImageCdn.Magento: ¿Error ImageCdn? (larga historia)
Aparece una imagen rota en el frontend cuando subí "imagen dañada".
Ok, vamos a empezar la larga historia:
noto que se ocurrió a causa de la extensión ImageCdn y "imagen corrupta".
En alguna parte del código de 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();
}
Mi pregunta es, ¿Alguien sabe cuál es el propósito de ese código? No entiendo cuál es el significado de su comentario anterior. Creo que es un error, ya que siempre return $this->_getModel()->getUrl();
¿Es realmente un error o simplemente es mi interpretación incorrecta?
Esto es lo que he hecho hasta ahora:
- tengo una imagen
dummy.jpeg
- Después de algunas investigaciones, me he dado cuenta de que es una "imagen corrupta".
- He probado usando:
<?php print_r(getimagesize('dummy.jpeg')); ?>
Resultado:
Array ( [0] => 200 [1] => 200 [2] => 6 [3] => width="200" height="200" [bits] => 24 [mime] => image/x-ms-bmp )
Por supuesto que estaba sorprendido por el resultado porque se ve bien cuando lo abro usando Preview
(en Mac OS X)
- Luego abrirlo con el editor hexadecimal, los dos primeros bytes es:
BM
que es el identificador del BMP - Probé imagen para subir .bmp para el producto -> fallado, no se puede seleccionar la imagen
- le pregunté a mi colega para cargar también (en Ubuntu), fue capaz de cambiar las opciones para el tipo de archivo en "cualquier archivo". Cuando hace clic en "Subir archivos", aparece el mensaje de error que indica que ese tipo de archivo no está permitido.
- Lo que me pasó por la mente es: un administrador intentó subir la imagen
.bmp
y falló. Luego lo renombra en.jpeg
y lo logra. Aunque no entiendo qué tipo de imágenes se pueden cambiar de nombre sin mostrar el logo de la imagen rota (fuera del tema). - Escenarios desencadenan una excepción, voy a analizar lo que he rastreado.
Rastro de los códigos:
- app/design/frontend/base/default// Catálogo de productos/foto/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');
?>
- A partir de ese código, sé que URL de la imagen se genera usando:
$this->helper('catalog/image')->init($_product, 'image')
- hice
Mage::log((string)$this->helper('catalog/image')->init($_product, 'image'));
Resultado:
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;
}
- El error provocó en . En alguna parte del código, con el tiempo se alcance:
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];
}
- La excepción fue apresado en el código anterior:
Mage_Catalog_Helper_Image
public function __toString()
{
...
} catch(Exception $e) {
$url = Mage::getDesign()->getSkinUrl($this->getPlaceholder());
}
...
}
la $ url se convirtió en:
http://local.m.com/skin/frontend/default/default/images/catalog/product/placeholder/image.jpg
- Por lo tanto, debería haber generado marcador de imagen de la derecha? (sin extensión ImageCdn)
- No, porque
Mage_Catalog_Helper_Image
se reescribió porOnePica_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
}
En caso de que todos ya olvidado la pregunta: Alguien sabe lo es el propósito de ese código? No entiendo cuál es el significado de su comentario anterior. ¿Es realmente un error o simplemente es mi interpretación incorrecta?
El problema es que 'OnePica_ImageCdn_Helper_Image' siempre' devolverá $ this -> _ getModel() -> getUrl() 'incluso cuando ocurra una excepción en' parent :: __ toString(); '. Cuando se produjo una excepción en la función '__toString', debería generar' $ url = Mage :: getDesign() -> getSkinUrl ($ this-> getPlaceholder()); 'que no ocurrió en mi caso debido a' OnePica_ImageCdn_Helper_Image' – ivantedja