Magento media дублирует изображения и обменивается ими, когда это не требуется
Я столкнулся со странной проблемой. Таким образом, на странице продуктов magento создает дубликаты изображений для каждого изображения из галереи "Больше просмотров".
Я нашел соответствующий код в файле media.phtml и, в частности:
<?php $i=0; foreach ($this->getGalleryImages() as $_image): ?>
<?php if ($this->isGalleryImageVisible($_image)): ?>
<img id="image-<?php echo $i; ?>"
class="gallery-image"
src="<?php echo $this->getGalleryImageUrl($_image); ?>"
data-zoom-image="<?php echo $this->getGalleryImageUrl($_image); ?>" />
<?php endif; ?>
<?php $i++; endforeach; ?>
Есть ли способ остановить это ненужное дублирование изображений?
Кроме того, галерея не учитывает текущее основное изображение. При этом, если изображение 1 является основным изображением, и вы нажимаете на миниатюру изображения 1 он все еще выполняет обмен. Итак, могу ли я изменить галерею, чтобы она меняла местами только то, что еще не является основным изображением?
Копая дальше, я считаю, что следующая функция отвечает за изменение изображения(изображений):
swapImage: function(targetImage) {
targetImage = $j(targetImage);
targetImage.addClass('gallery-image');
ProductMediaManager.destroyZoom();
var imageGallery = $j('.product-image-gallery');
if(targetImage[0].complete) { //image already loaded -- swap immediately
imageGallery.find('.gallery-image').removeClass('visible');
//move target image to correct place, in case it's necessary
imageGallery.append(targetImage);
//reveal new image
targetImage.addClass('visible');
//wire zoom on new image
ProductMediaManager.createZoom(targetImage);
} else { //need to wait for image to load
//add spinner
imageGallery.addClass('loading');
//move target image to correct place, in case it's necessary
imageGallery.append(targetImage);
//wait until image is loaded
imagesLoaded(targetImage, function() {
//remove spinner
imageGallery.removeClass('loading');
//hide old image
imageGallery.find('.gallery-image').removeClass('visible');
//reveal new image
targetImage.addClass('visible');
//wire zoom on new image
ProductMediaManager.createZoom(targetImage);
});
}
}
1 answers
Решение вышеупомянутой проблемы довольно простое.
- Если это еще не сделано, то мы создадим копию файла media.phtml (" Найден по адресу:{Magento_root}/приложение/дизайн/интерфейс/rwd/по умолчанию/шаблон/каталог/продукт/представление") в нашей пользовательской теме.
- Далее нам нужно внести в него изменения, удалив строки с 47 по 54. Блок кода, отвечающий за дублирование изображений.
-
Затем в теге привязки миниатюр изображений ("строка 59/65") мы нужно добавить атрибут id вот так:
id="image-<?php echo $i; ?>"
-
В том же теге привязки нам также теперь нужно добавить два новых атрибута данных data-main и data-zoom-mage, каждый из которых содержит URL-адрес изображения галереи. Вот так:
data-main="<?php echo $this->getGalleryImageUrl($_image); ?>" data-zoom-image="<?php echo $this->getGalleryImageUrl($_image); ?>"
-
Это единственные изменения, необходимые в файле media.phtml. Полный файл теперь должен выглядеть следующим образом:
<?php $_product = $this->getProduct(); $_helper = $this->helper('catalog/output'); ?> <div class="product-image product-image-zoom"> <div class="product-image-gallery"> <img id="image-main" itemprop="image" class="gallery-image visible" src="<?php echo $this->helper('catalog/image')->init($_product, 'image') ?>" alt="<?php echo $this->escapeHtml($this->getImageLabel()) ?>" title="<?php echo $this->escapeHtml($this->getImageLabel()); ?>" /> </div> </div> <?php if (count($this->getGalleryImages()) > 0): ?> <div class="more-views"> <h2><?php echo $this->__('More Views') ?></h2> <ul class="product-image-thumbs"> <?php $i=0; foreach ($this->getGalleryImages() as $_image): ?> <?php if ($this->isGalleryImageVisible($_image)): ?> <li> <a class="thumb-link" href="#" title="<?php echo $this->escapeHtml($_image->getLabel()) ?>" id="image-<?php echo $i; ?>" data-image-index="<?php echo $i; ?>" data-main="<?php echo $this->getGalleryImageUrl($_image); ?>" data-zoom-image="<?php echo $this->getGalleryImageUrl($_image); ?>"> <img src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(75); ?>" width="75" height="75" alt="<?php echo $this->escapeHtml($_image->getLabel()) ?>" /> </a> </li> <?php endif; ?> <?php $i++; endforeach; ?> </ul> </div> <?php endif; ?> <?php echo $this->getChildHtml('after'); ?>
Далее, в нашей пользовательской теме нам нужно сделать копию файла app.js . ("Найдено в: {Magento_root/скин/внешний интерфейс/rwd/по умолчанию/js}").
- В нашей копии app.js файл перейдите в строку 1197, и вы должны увидеть функцию Swapimage.
-
Нам нужно изменить функцию, чтобы отразить изменения в файле media.phtml. Итак, удалите все, что находится в скобках функции. Строки с 1198 по ~1241. Затем объявите две новые переменные. Один содержит основной элемент изображения, который по умолчанию будет иметь идентификатор
image-main
, а другой содержит значение атрибута data-main, который мы определили ранее в media.phtml. Отсюда нам нужно затем уничтожить масштаб текущего основного изображения, выполнить замену изображения, а затем воссоздать масштаб. Обратите внимание, что повторите масштабирование после загрузки изображения. Готовый код функции будет выглядеть следующим образом:swapImage: function(targetImage) { mainImage = $j("#image-main"); targetImage = $j(targetImage).data("main"); ProductMediaManager.destroyZoom(); mainImage.src = targetImage; mainImage.attr('src', targetImage).load(function(){ ProductMediaManager.createZoom(mainImage); }); }
Эти шаги, описанные выше, просто устранят ненужное дублирование изображений для обмена изображениями.