【问题标题】:How to compare a product's images in Magento?如何在 Magento 中比较产品的图像?
【发布时间】:2012-01-28 22:12:28
【问题描述】:

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

我正在自定义产品页面 (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_Objects 的数组,它们都有一个所谓的“值ID”来标识库图像。我不知道这个 ID 的范围是什么,以及它的用处。产品的基本图像以Mage_Product_Helper_Image 的形式返回,通过它我似乎无法获得任何 ID 或类似 ID 的属性(甚至无法通过我通过重写帮助程序类公开的产品图像模型)。

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

/8/2/8280.jpg

helper 类的__toString() 方法一开始返回的是上述格式的文件名,但过了一会儿又开始返回一个缓存图片的url:

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

不可靠。

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

编辑:

澄清:

假设产品 X 有 5 张相关联的图片,方便地称为:

  • B(基本图像,未选中排除);
  • S(小图,已排除 CHECKED);
  • T(拇指,未选中排除);
  • N(通用,未选中排除);
  • P(通用,未选中排除)。

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

如果我无法将图库图片与基本图片进行比较,我会得到如下信息:B、T、N、P、B。基本图片显示两次。

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

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

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

【问题讨论】:

  • 如果您循环使用产品 ID,它应该是唯一的(small_image 或 image),不是吗?
  • 确实如此,但这不是问题所在。请参阅我的问题的补充以进行澄清。
  • 我可能误解了您的评论。 “如果您循环使用产品 ID”到底是什么意思?我该怎么做?
  • 我不确定你到底想做什么,但你试过$this-&gt;helper('catalog/image')-&gt;init($_product, 'small_image')
  • 另外,还有三个函数可以获取图片的 url。 getImageUrl getSmallImageUrlgetThumbnailUrl

标签: image magento compare gallery


【解决方案1】:

我需要做类似的事情,结果就这样做了。

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

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

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

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

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

if ($base != $image):

这会比较图像名称,但不包括 URL 的其余部分。

【讨论】:

    【解决方案2】:

    我的解决方案是搜索图像名称。我遇到了同样的问题,因为我想在拇指图像周围画一个边框并显示当时选择的。所以,对于产品图片名称:

    <?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
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多