如何捕获此PHP / Magento错误:当没有缩略图时,代码中断

时间:2012-06-06 20:46:17

标签: php magento

我有自定义销售点管理员Magento扩展程序。我正在尝试在POS页面上的管理产品网格中添加缩略图。当每个产品都有缩略图时,它可以100%正常工作。但是当有没有图像的产品时,代码就完全破坏了。

如何修改此代码以检查是否有缩略图,如果没有,则显示占位符(任何替代html都可以)?

<?php

  class MDN_PointOfSales_Block_Widget_Grid_Column_Renderer_Thumbnail
    extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
  {
    public function render(Varien_Object $row)
    {      

    $cProduct = Mage::getModel("catalog/product");
    $cProductId = $row->getId();
    $cProduct->load($cProductId);  // works for product IDs w/ a thumbnail. Breaks if no thumbnail set.
    // For example, the following line works, loading the thumbnail for the 5533 product for all rows in the grid:  
    // $cProduct->load(5533);

    $cMyUrl = $cProduct->getThumbnailUrl();

    $html = '<img ';
    $html .= 'src="' . $cMyUrl . '"';
    $html .= 'class="grid-image ' . $cProductId . '"/>';

    return $html;      

    }
  }
?>

如果没有缩略图,整个页面会导致错误: http://www.screencast.com/t/zk6jVChiAC

2 个答案:

答案 0 :(得分:7)

您可以在try catch块中包装触发异常的调用,并将代码放入以执行占位符:

try {
    $cMyUrl = $cProduct->getThumbnailUrl();
} catch (Exception $e) {
    //Do something here
}

但不要。这只是掩盖了潜在的问题:

/ skin / frontend / your_package / your_theme / images / catalog / product / placeholder及其继承的主题

缺少占位符图片

您可以在app/code/core/Mage/Catalog/Model/Product/Image.php方法的setBaseFile()中看到抛出的异常(以及原因:无图像和没有占位符)。

我宁愿让Magento正确处理占位符,而不是让这个异常不必要地抛出并且必须围绕它编写代码。

因此,将占位符图像添加到上面提到的皮肤图像目录中 - 您应该具有以下内容:

/skin/frontend/your_package/your_theme/images/catalog/product/placeholder/image.jpg
/skin/frontend/your_package/your_theme/images/catalog/product/placeholder/small_image.jpg
/skin/frontend/your_package/your_theme/images/catalog/product/placeholder/thumbnail.jpg

或至少部分基本主题

/skin/frontend/base/default/images/catalog/product/placeholder/image.jpg
/skin/frontend/base/default/images/catalog/product/placeholder/small_image.jpg
/skin/frontend/base/default/images/catalog/product/placeholder/thumbnail.jpg

答案 1 :(得分:-1)

当目录/图像助手尝试初始化图库并加载缩略图时,Mage_Catalog_Model_Product_Image :: setBaseFile($ file)中会抛出异常。 当您尝试获取缩略图网址时,而不是在加载产品时,会发生这种情况。

避免这种情况的最简单方法是使用

捕获异常
try {
    $cMyUrl = $cProduct->getThumbnailUrl();
} catch (Exception $e) {
    $cMyUrl = 'default_thumbnail.jpg'; // or something else ;-)
}