Как сравнить изображения товара в Magento? - PullRequest
1 голос
/ 29 января 2012

Я хотел бы знать надежный способ циклически просматривать изображения галереи продукта и извлекать базовое изображение, проверяя, совпадают ли они.

Я настраиваю шаблон мультимедиа на странице продукта (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 s, у каждого из которых есть так называемый «идентификатор значения», который идентифицирует изображения галереи. Я не знаю, какова область действия этого идентификатора, и с этим его полезность. Базовое изображение продукта возвращается как Mage_Product_Helper_Image, благодаря которому я не могу получить какой-либо идентификатор или свойство, похожее на идентификатор (даже через модель изображения продукта, которую я раскрыл, переписав класс помощника).

Я также пытался сопоставить их по имени файла. Это работало в течение нескольких дней, потому что изображения галереи хранятся в атрибуте 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 (базовое изображение, без проверки);
  • S (маленькое изображение, исключено ПРОВЕРЕНО);
  • T (большой палец, без проверки);
  • N (универсальный, исключен UNchecked);
  • P (универсальный, не проверяется).

Коллекция изображений галереи будет включать все изображения, которые явно не "исключены" из галереи. В нашем примере коллекция изображений галереи будет включать: B, T, N и P. Это изображения, которые я хочу отобразить в селекторе изображений, , но I всегда хочу Базовое изображение включено, независимо от того, что оно может быть исключено из галереи.

Если я не могу сравнить изображения галереи с базовым изображением, я получу что-то вроде этого: B, T, N, P, B. Базовое изображение отображается дважды.

Есть два способа предотвратить это:

  • Установите флажок «Исключить» для базового изображения, но я не могу этого сделать, потому что я создаю тему, поэтому пользователь темы должен будет это сделать, но я не хочу, чтобы это было необходимо .
  • Проверьте, находится ли базовое изображение среди изображений галереи, и извлеките его или не отображайте вручную после того, как я переберу изображения галереи.

Полагаю, решение заключается в сравнении изображений друг с другом с помощью идентификатора или некоторого идентичного идентификатору свойства.

Ответы [ 2 ]

1 голос
/ 19 мая 2013

Мне нужно было сделать что-то подобное, и в итоге я сделал это так.

Сначала, непосредственно перед исходным изображением (которое не входит в цикл foreach галереи), добавьте следующее:

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

затем сразу в цикле foreach добавьте:

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

и затем поместите новые изображения в другой цикл foreach:

if ($base != $image):

Сравнивает имена изображений без учета остальной части URL.

0 голосов
/ 06 июля 2012

Мое решение состояло в том, чтобы искать имя изображения. У меня была та же проблема, потому что я хотел нарисовать границу вокруг изображения большого пальца и показать, что было выбрано в то время. Итак, для названия изображения товара:

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

Надеюсь, это поможет.

...