2012-08-21 10 views
6

Mam pewne pytanie związane z bezpłatnym rozszerzeniem Magento OnePica ImageCdn.Błąd Magento: ImageCdn? (długa historia)

Zepsuty obraz pojawia się w interfejsie po przesłaniu "uszkodzonego obrazu". enter image description here

Ok, zacznijmy długą historię:

Zauważyłem, że jest się z powodu przedłużenia ImageCdn i „skorumpowanego obraz”.

w jakiejś części kodu ImageCdn za:

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

Moje pytanie jest, każdy wie, co jest celem tego kodu? Nie rozumiem, jaki jest sens ich komentarza powyżej. Myślę, że jest to błąd, ponieważ zawsze return $this->_getModel()->getUrl();

Czy to naprawdę błąd, czy to tylko moja zła interpretacja?

To, co zrobiłem do tej pory:

  • Mam obrazu dummy.jpeg
  • Po pewnym dochodzenia, zdałem sobie sprawę, że jest „uszkodzony obraz”.
  • I badane przy użyciu: <?php print_r(getimagesize('dummy.jpeg')); ?>

Wynik:

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

Oczywiście byłem zaskoczony wynikiem, bo to wygląda dobrze, kiedy go otworzyć za pomocą Preview (w systemie Mac OS X) looks good

  • Potem otwórz go za pomocą edytora szesnastkowego, pierwsze dwa bajty to: BM który jest bmp identyfikator
  • Próbowałem przesłać .bmp zdjęcie produktu -> nie powiodło się, nie można wybrać obraz
  • Poprosiłem mojego kolegę przesłać również (w systemie Ubuntu) był w stanie zmienić opcje dla typu pliku na "dowolne pliki". Po kliknięciu przycisku "Prześlij pliki" wyświetlany komunikat o błędzie informuje, że ten typ pliku jest niedozwolony.
  • To, co przyszło mi do głowy to: administrator próbował przesłać obraz .bmp i poniósł niepowodzenie. Następnie zmienił nazwę na .jpeg i zakończył się sukcesem. Chociaż nie rozumiem, jak można zmienić nazwy obrazów bez wyświetlania uszkodzonego obrazu (poza tematem).
  • Te scenariusze wywołują wyjątek, zepsuję to, co wyśledziłem.

Ślad kodów:

  • app/design/frontend/base/default/Katalog/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'); 
?> 
  • Od tego kodu, wiem, że obraz jest generowany przy użyciu url: $this->helper('catalog/image')->init($_product, 'image')
  • zrobiłem Mage::log((string)$this->helper('catalog/image')->init($_product, 'image'));

Wynik: 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; 
} 
  • Błąd wyzwalany w . W jakiejś części kodu, to w końcu dotrzeć:

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]; 
} 
  • Wyjątek został przechwycony w poprzednim kodzie:
Mage_Catalog_Helper_Image 
public function __toString() 
{ 
    ... 
    } catch(Exception $e) { 
     $url = Mage::getDesign()->getSkinUrl($this->getPlaceholder()); 
    } 
    ... 
} 

$ url stała: http://local.m.com/skin/frontend/default/default/images/catalog/product/placeholder/image.jpg

  • Tak, powinien on generowany prawo zastępczy obrazu? placeholder (bez rozszerzenia ImageCdn)
  • Nie, ponieważ

Mage_Catalog_Helper_Image został przepisany przez 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 
} 

W przypadku, gdy wszyscy już zapomnieli pytanie: ktoś wie co jest celem tego kodu? Nie rozumiem, jaki jest sens ich komentarza powyżej. Czy to naprawdę błąd, czy to tylko moja zła interpretacja?

Odpowiedz

0

Nie, to nie jest błąd. To tylko starsze wsparcie dla starszych systemów Magento. Zastanawiam się, czy zdarzyło Ci się kiedyś przeglądać wcześniejsze wersje Magento (jak w komentarzu do uwag do dokumentacji w dokumencie, < 1.1.3)?

Istota sprawy jest przed Magiem 1.1.3, Mage_Catalog_Helper_Image instancje powodują tworzenie adresów URL z rzutów na ciągi, np.

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

__toString jest prawdopodobnie albo protected lub private, nie jestem pewien, ale jestem pewien, co jest powszechną praktyką jest, aby zawsze kodować tę metodę Magia w celu wykorzystania go w klasie, które są oznaczającego przepisać coś, co oczekuje użycia tego rodzaju danych.

+0

Problem polega na tym, że 'OnePica_ImageCdn_Helper_Image' zawsze" zwróci $ this -> _ getModel() -> getUrl() 'nawet, gdy wystąpi wyjątek w' parent :: __ toString(); '. Gdy wystąpi wyjątek w funkcji '__toString', powinien wygenerować' $ url = Mage :: getDesign() -> getSkinUrl ($ this-> getPlaceholder()); 'co nie stało się w moim przypadku z powodu' OnePica_ImageCdn_Helper_Image' – ivantedja