如何在Magento中比较产品的图像?

时间:2012-01-28 22:12:28

标签: image magento compare gallery

我想知道一种可靠的方法来浏览产品的图库图像,并通过检查它们是否相同来取出基本图像。

我正在自定义产品页面的媒体模板(catalog/product/view/media.phtml),我想将所有图库图像与基本图像放在图像选择器中,而基本图像不会显示两次(如果在后端没有“排除”,就会发生这种情况。)

我从原始模板中了解到,图库图像显示如下:

<?php foreach ($this->getMediaGallery() as $_image): ?>
    <img src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile()) ?>" />
<?php endforeach; ?>

,产品的基本图像显示如下:

<img src="<?php echo $this->helper('catalog/image')->init($_product, 'image') ?>" />

我研究了媒体库的起源,发现它是一个Varien_Object的数组,它们都有一个所谓的“价值ID”,用于识别图库图像。我不知道这个ID的范围是什么,以及它的用处。产品的基本映像作为Mage_Product_Helper_Image返回,通过它我似乎无法获得任何ID或ID类属性(甚至不通过产品映像模型,我通过重写帮助程序类公开)

我也尝试按文件名匹配它们。它工作了几天,因为图库图像'存储在Varien_Object(file)的一个属性中,产生了这样的东西:

/8/2/8280.jpg

帮助程序类的__toString()方法首先以上面的格式返回文件名,但过了一段时间它开始返回缓存图像的URL:

http://domain.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/8/2/8280.jpg

不可靠。

如果有人知道更好的方法来检索产品的图像,同时知道哪一个是基本图像,能够阻止同一图像显示两次,那么请告诉我。

编辑:

澄清:

假设产品X有5个相关图像,方便地称为:

  • B(基本图像,排除UNchecked);
  • S(小图片,不包括CHECKED);
  • T(拇指,排除UNchecked);
  • N(通用,排除UNchecked);
  • P(通用,排除UNchecked)。

图库图像集合将包括未从图库中明确“排除”的所有图像。在我们的示例中,图库图像集合将包括:B,T,N和P.这些是我想要在图像选择器中显示的图像,但是总是想要包含基本图像,无论它是否可以从图库中排除。

如果我无法将图库图像与基本图像进行比较,我会得到这样的结果:B,T,N,P,B。基本图像显示两次。

有两种方法可以防止这种情况发生:

  • 检查基本图像的“排除”,但我不能这样做,因为我正在构建一个主题,所以主题的用户必须这样做,但我不希望这是必要的
  • 检查基本图像是否在图库图像中并将其取出,或者在我遍历图库图像后不手动显示它。

我的猜测是,解决方案在于通过ID或类似ID的属性将图像相互比较。

2 个答案:

答案 0 :(得分:1)

我需要做类似的事情,最后这样做。

首先,在初始图像(不在图库foreach循环内)之前添加以下内容:

$base = basename($_product->getData('image'))

然后,在foreach循环中立即添加:

$image = basename($this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile()))

然后将新图像放在另一个foreach循环中:

if ($base != $image):

这会比较图像名称,而不包括其余的网址。

答案 1 :(得分:0)

我的解决方案是搜索图片名称。我有同样的问题,因为我想在拇指图像周围绘制一个边框,并显示当时选中的边框。因此,对于产品图片名称:

<?php $product_image_name = substr($image_url, strrpos($image_url, '/') + 1); ?>

然后,对于图库中的每个图像:

foreach ($this->getGalleryImages() as $_image){
      $image_name = substr($_image->getUrl(), strrpos($_image->getUrl(), '/') + 1);
      if ($product_image_name == $image_name) // Do stuff here
}

希望这有帮助。