2012-08-21 7 views
6

Ich habe einige Fragen im Zusammenhang mit Magentos kostenlose Erweiterung OnePica ImageCdn.Magento: ImageCdn Fehler? (lange Geschichte)

Ein beschädigtes Bild erscheint im Frontend, wenn ich "beschädigtes Bild" hochgeladen habe. enter image description here

Ok, lassen Sie uns die lange Geschichte beginnen:

Ich bemerke es wegen ImageCdn Verlängerung passiert ist und „korrupt Bild“.

In einem Teil ImageCdn Code:

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(); 
} 

Meine Frage ist, weiß jemand, was ist der Zweck dieser Code? Ich verstehe nicht, was die Bedeutung ihres Kommentars oben ist. Ich denke, es ist ein Fehler wie immer return $this->_getModel()->getUrl();

Ist es wirklich ein Fehler oder es ist nur meine falsche Interpretation?

Das ist, was ich bisher getan habe:

  • ich ein Bild haben dummy.jpeg
  • Nach einigen Untersuchungen, wurde mir klar, dass eine „korrupte Bild“ ist.
  • ich mit getestet: <?php print_r(getimagesize('dummy.jpeg')); ?>

Ergebnis:

Array 
(
    [0] => 200 
    [1] => 200 
    [2] => 6 
    [3] => width="200" height="200" 
    [bits] => 24 
    [mime] => image/x-ms-bmp 
) 

Natürlich habe ich vom Ergebnis überrascht, weil es gut aussieht, wenn ich es Preview mit öffnen (auf Mac OSX) looks good

  • Dann öffne ich es Hex-Editor verwenden, werden die ersten beiden Bytes ist: BM die Kennung BMPs ist
  • Ich habe versucht, für ein Produkt laden .bmp Bild -> fehlgeschlagen ist, kann das Bild nicht wählen
  • ich mein Kollege fragte hochladen Es war auch (auf Ubuntu), er konnte die Auswahl für den Dateityp in "beliebige Dateien" ändern. Wenn er auf "Dateien hochladen" klickt, wird eine Fehlermeldung angezeigt, dass dieser Dateityp nicht zulässig ist.
  • Was mir in den Sinn kam ist: ein Admin versucht, .bmp Bild hochladen und fehlgeschlagen. Dann benennt er es in .jpeg um und erfolgreich. Obwohl ich es nicht verstehe, welche Art von Bildern umbenannt werden kann, ohne ein gebrochenes Bild-Logo zu zeigen (außerhalb des Themas).
  • Diese Szenarien lösen eine Exception aus, ich zerlege das, was ich zurückverfolgt habe.

Trace des Codes:

  • app/design/frontend/base/default/catalog/product/view/Medien.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'); 
?> 
  • Von diesem Code, ich weiß, dass Bild-URL mit erzeugt: $this->helper('catalog/image')->init($_product, 'image')
  • Ich habe Mage::log((string)$this->helper('catalog/image')->init($_product, 'image'));

Ergebnis: 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; 
} 
  • Der Fehler ausgelöst in . In einem Teil des Codes, wird es schließlich erreichen:

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]; 
} 
  • Die Ausnahme in dem vorherigen Code abgefangen wurde:
Mage_Catalog_Helper_Image 
public function __toString() 
{ 
    ... 
    } catch(Exception $e) { 
     $url = Mage::getDesign()->getSkinUrl($this->getPlaceholder()); 
    } 
    ... 
} 

die $ url wurde: http://local.m.com/skin/frontend/default/default/images/catalog/product/placeholder/image.jpg

  • So sollte es Platzhalter Bild rechts erzeugt haben? placeholder (ohne ImageCdn Erweiterung)
  • Nein, denn

Mage_Catalog_Helper_Image von 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 
} 

Im Fall neu geschrieben wurde Sie alle vergessen haben, schon die Frage: Jeder weiß, was ist der Zweck dieses Codes? Ich verstehe nicht, was ihre Kommentare oben bedeuten. Ist es wirklich ein Fehler oder ist es nur meine falsche Interpretation?

Antwort

0

Nein, es ist kein Fehler. Es ist nur Legacy-Unterstützung für ältere Magento-Systeme. Ich frage mich, ob Sie jemals in der Lage waren, frühere Versionen von Magento zu durchsuchen (wie der Inline-Dokumentationskommentar auf < 1.1.3 verweist)?

Der Kern der Sache ist vor Mage 1.1.3, Mage_Catalog_Helper_Image Instanzen produzieren URLs von To-String-Casts, z.

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

__toString ist wahrscheinlich entweder protected oder private, ich bin nicht sicher, aber was ich bin sicher, ist die übliche Praxis, diese magische Methode, um es in einer Klasse zu verwenden, um immer zu codieren up ist, das Sie bedeuten Um etwas neu zu schreiben, erwartet man, diese Art von Daten zu verwenden.

+0

Das Problem ist, 'OnePica_ImageCdn_Helper_Image' wird immer $ this -> _ getModel() -> getUrl()' selbst dann zurückgeben, wenn eine Ausnahme in 'parent :: __ toString(); 'aufgetreten ist. Wenn eine Ausnahme in der '__toString'-Funktion auftrat, sollte es' $ url = Mage :: getDesign() -> getSkinUrl ($ this-> getPlaceholder()) erzeugen; 'was in meinem Fall wegen' OnePica_ImageCdn_Helper_Image' nicht passiert ist – ivantedja