2012-08-21 11 views
6

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". enter image description here

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) looks good

  • 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? placeholder (sin extensión ImageCdn)
  • No, porque

Mage_Catalog_Helper_Image se reescribió por 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 
} 

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?

Respuesta

0

No, no es un error. Es solo soporte heredado para sistemas Magento más antiguos. Me pregunto si alguna vez has curioseado sobre versiones anteriores de magento (como el comentario de la documentación en línea hace referencia a, < 1.1.3).

La esencia del asunto está antes de Mage 1.1.3, Mage_Catalog_Helper_Image instancias producen URL desde moldes de cuerdas, p. Ej.

$image = (some instance of Mage_Catalog_Helper_Image).. ; 
$imageUrl = (string) $image; 

__toString es probable que sea protected o private, no estoy seguro, pero lo que estoy seguro es la práctica habitual consiste en codificar siempre este método mágico con el fin de utilizarlo en una clase que está significando para reescribir algo con eso espera usar este tipo de conversión de datos.

+0

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

Cuestiones relacionadas