0

Magento: Стилизация изображений товара

Posted марта 4, 2010 in Javascript, Magento and tagged , , , , by SpiRi7


Сегодня я хотел бы поговорить о стилизации дополнительных изображений товара. По умолчанию magento производит вывод списка изображений подрядят. Если с товаром указывается много фотографий в дизайне это может выглядеть наляписто. Для решения этой проблемы можно использовать слайдер – позволяющий листать изображения в фиксированном боксе. Реализацию данной возможности Я и рассмотрю далее.



Выше представлено изображения окончательного варианта. Я не буду рассматривать тонкости верстки такого блока, единственное что необходимо учитывать это наличие нескольких контейнеров.
На первом этапе производим изменения файла отображения изображений товара. Это файл: app/design/frontend/default/default/template/catalog/product/view/media.phtml
Нас интересует слейдующий кусок кода:

<?php if (count($this->getGalleryImages()) > 0): ?>
<div class="more-views">
    <h4><?php echo $this->__('More Views') ?></h4>
    <ul>
    <?php foreach ($this->getGalleryImages() as $_image): ?>
        <li>
            <a href="#" onclick="popWin('<?php echo $this->getGalleryUrl($_image) ?>', 'gallery', 'width=300,height=300,left=50,top=50,location=no,status=yes,scrollbars=yes,resizable=yes'); return false;"><img src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(56); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" title="<?php echo $this->htmlEscape($_image->getLabel()) ?>" /></a>
        </li>
    <?php endforeach; ?>
    </ul>
</div>
<?php endif; ?>

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

<div class="more-view-page">Страница <span id="img-more-page">1</span> из <?php echo $pageNumber; ?></div>
	  <div class="more-view-arrow step-left-passive" id="more-view-step-left"></div>
	    <div class="more-view-fix">
		    <ul id="more-view-slider">
			    <?php $i = 0;foreach ($this->getGalleryImages() as $_image): ?>
				<li>
	  		             <a href="#"><img src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(51); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" title="<?php echo $this->htmlEscape($_image->getLabel()) ?>" /></a>
				</li>
			    <?php endforeach; ?>
		    </ul>
	    </div>
<div class="more-view-arrow step-right-active" id="more-view-step-right"></div>

Обратите внимание что в стилях необходимо будет для контейнера c классом “more-view-fix” задать фиксированную высоту. И для элементов li указать float: left.
Идея скрола заключается в следующем – мы производим изменение css свойства margin-left для элемента ul в отрицательный диапазон. Для анимации движения я предлагаю использовать библиотеку для prototype animator.js

Производим измение шаблона

<!-- Load animator js lib -->
<script src="<?php echo $this->getSkinUrl('js/animator.js');?>" type="text/javascript"></script>
<?php
     // Total number of images
    $_imageNumber =  count($this->getGalleryImages());
    // Total number of scroll page
    $pageNumber = ceil($_imageNumber/5);
?>
 
<script>
 
var startMargin = 0;
// Width of one set of images, how change margin from one click
var marginStep = 340;
var currentPage = 1;
 
// Scroll on left arrow
function sLeft() {
    // Block if first page
    if (currentPage<=1) {
       return;
    }
    currentPage--;
 
    // Hide left arrow if first page
    if (currentPage<=1) {
	$('more-view-step-left').removeClassName('step-left-active');
	$('more-view-step-left').addClassName('step-left-passive');
    }
 
    // Show right arrow if not last page
    if (currentPage< <?php echo $pageNumber;?>) {
	$('more-view-step-right').removeClassName('step-right-passive');
 	$('more-view-step-right').addClassName('step-right-active');
    }
    // Change current page number
    $('img-more-page').innerHTML = currentPage;
 
    var scrollElement = $('more-view-slider');
 
    var newMargin = startMargin + marginStep;
 
    var animationObject = new Animator();
    animationObject.addSubject(new NumericalStyleSubject(scrollElement, 'margin-left', startMargin, newMargin));
    animationObject.play();
 
    startMargin = newMargin;
 
}
// Click on righ arrow
function sRight() {
    // Block if last page
    if (currentPage>=<?php echo $pageNumber;?>) {
       return;
    }
    currentPage++;
    // Hide right arrow for last page
    if (currentPage>=<?php echo $pageNumber;?>) {
 	$('more-view-step-right').removeClassName('step-right-active');
	$('more-view-step-right').addClassName('step-right-passive');
    }
 
    // Show left arrow if page not first
    if (currentPage>1) {
 	$('more-view-step-left').removeClassName('step-left-passive');
	$('more-view-step-left').addClassName('step-left-active');
    }
    // Change current page - show on of slider
    $('img-more-page').innerHTML = currentPage;
 
    var scrollElement = $('more-view-slider');
 
    var newMargin = startMargin - marginStep;
 
    var animationObject = new Animator();
    animationObject.addSubject(new NumericalStyleSubject(scrollElement, 'margin-left', startMargin, newMargin));
    animationObject.play();
 
    startMargin = newMargin;
 
}
 
document.observe('dom:loaded', function(){
// Add event for click action for our arrow 
  $('more-view-step-left').observe('click', sLeft);
  $('more-view-step-right').observe('click', sRight);
})
 
</script>

Этот маленький кусок кода позволяет менять текущий номер страницы скролла, изменять состояние стрелок влево/вправо на активная/пассивная. На мой взгляд этого более чем достаточно для реализации скролла. Спасибо за внимание.

Похожие посты:

Leave a Reply