Урок 56. Шаблон корзины $BASKET$
Разработка шаблона корзины и размещение его в глобальных блоках интернет магазина
- Уроки
- Создание интернет магазина
- Корзина и заказы
- Урок 56. Шаблон корзины $BASKET$
Цель урока
Настроить, разработать и разместить шаблон корзины в интернет магазине.
Выбор типа корзины, сокращение названий позиций, визуальные эффекты при добавлении товара, вывод наценок опций и другое.
Шаблон
Чтобы начать редактирование шаблона корзины, перейдите в панель управления - дизайн - управление дизайном (шаблоны):

Прежде чем рассмотреть шаблон, давайте узнаем, какие переменные доступны в корзине:
| Основная часть страницы Используется для вывода добавленных товаров в расширенном типе корзине. При простом типе корзины | |
| Количество материалов Количество товаров добавленных в корзину. Для обработки пустой корзины, используется следующая конструкция: <?if $NUM_ENTIES$?>Сообщение для пустой корзины<?else?>Сообщения при наличии товаров в корзине<?endif?> | |
| Суммарное количество товарных позиций в заказе Используется для обработки сообщений о скидках, про которые мы говорили в уроке Матрицы цен для доставки от количества позиций в заказе: <?if $ORDER_NUM$>=2?>Сообщение о скидке на 2 позиции в заказе<?endif?> | |
| Суммарный вес заказа По аналогии с предыдущим пунктом выводится информация о скидке на доставку в зависимости от веса всех товаров (урок 21, урок 10). | |
| Суммарная стоимость товарных позиций в заказе Для информирования пользователя о сумме заказа, содержит значение валюты, например | |
| Значение суммарной стоимости товаров в заказе в чистом виде Также используется для вывода стоимости доставки в зависимости от суммы заказа. Не содержит валюты, например | |
| Скидка на текущую сумму в корзине Для информирования пользователя о размере скидки. Содержит значение валюты. | |
| Значение суммы дисконтной скидки на заказ в чистом виде | |
| Схема начисления и условия для увеличения скидки В данный момент не используется | |
| Cookie для самоcтоятельного использования администратором сайта. Имеет вид [id сайта]uShopCookie Рассмотрим в следующих уроках | |
| Скидка на текущий момент с текущим содержимым корзины Включает все скидки, которые настраиваются в соответствующем разделе настроек магазине (подробнее об этом). | |
| Значение скидки на текущий момент с текущим содержимым корзины в чистом виде |
Теперь взглянем на шаблон:
#1
<?if($BODY$)?><ul>$BODY$</ul><?endif?> <?if($NUM_ENTRIES$)?> <div class="total">Итого: $ORDER_AMOUNT$</div> <?if($ORDER_DISCOUNT$)?> <div class="disc"> Скидка: $ORDER_DISCOUNT$</div> <?if($DISCOUNT_INFO$)?> <hr> <div class="disc-info">$DISCOUNT_INFO$</div> <?endif?> <?endif?> <hr> <a class="basketclear" href="javascript://" rel="nofollow" onclick="return clearBasket();">Очистить</a> | <a class="basketorder" href="/shop/checkout">Оформить заказ</a> <?else?> <div class="empty">Ваша корзина пуста</div> <?endif?>#2
<style> #shop-basket ul { margin:0; padding:0; text-align:left; list-style:none } #shop-basket li { margin:0 0 5px 0; padding-left:35px } #shop-basket .sb-name { margin-right:18px; } #shop-basket .sb-cost { margin-right:18px; color: gray; } #shop-basket .sb-func { float:right; cursor:pointer; width:16px; height:16px; margin:0;} #shop-basket a.remove { background:url('/.s/img/sh/del.png') no-repeat 3px 0; } #shop-basket a.remove:hover { background:url('/.s/img/sh/del.png') no-repeat 3px -16px; } #shop-basket .empty { text-align:center; } #shop-basket .total {font-weight: bold;} #shop-basket .total, #shop-basket .disc { text-align:right; } #shop-basket .disc-info { font-style: italic; } </style>#3
<script language="Javascript"><!-- var lock_buttons = 0; function clearBasket(){ if(lock_buttons) return false; else lock_buttons = 1; var el = $('#shop-basket'); if(el.length){ var g=document.createElement("div"); $(g).addClass('myWinGrid').attr("id",'shop-basket-fade').css({"left":"0","top":"0","position":"absolute","border":"#CCCCCC 1px solid","width":$(el).width()+'px',"height":$(el).height()+'px',"z-index":5}).hide().bind('mousedown',function(e){e.stopPropagation();e.preventDefault();_uWnd.globalmousedown();}).html('<div class="myWinLoad" style="margin:5px;"></div>'); $(el).append(g); $(g).show(); } _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'clear'}}); ga_event('basket_clear'); return false; } function removeBasket(id){ if(lock_buttons) return false; else lock_buttons = 1; $('#basket-item-'+id+' .sb-func').removeClass('remove').addClass('myWinLoadS').attr('title',''); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'del', 'id':id}}); return false; } function add2Basket(id,pref){ if(lock_buttons) return false; else lock_buttons = 1; var opt = new Array(); var err_msg = ''; $('#b'+pref+'-'+id+'-basket').attr('disabled','disabled'); $('#'+pref+'-'+id+'-basket').removeClass('done').removeClass('err').removeClass('add').addClass('wait').attr('title',''); $('#'+pref+'-'+id+'-options-selectors').find('input:checked, select').each(function(){ opt.push(this.id.split('-')[3]+(this.value !== '' ? '-'+this.value :'')); if(this.value !== ''){ opt.push(this.id.split('-')[3]+(this.value !== '' ? '-'+this.value :'')); }else{ err_msg += '<li>'+$(this).parent().parent().find('span.opt').html().replace(':', '')+'</li>'; } }); if(err_msg == ''){ _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'add', 'id':id, 'pref':pref, 'opt':opt.join(':'), 'cnt':$('#q'+pref+'-'+id+'-basket').attr('value')}}); ga_event('basket_add'); }else{ lock_buttons = 0; shop_alert('<div class="MyWinError">Опции<ul>'+err_msg+'</ul>обязательны для выбора</div>','Замечания','warning',350,100,{tm:8000,align:'left',icon:'http://s79.ucoz.net/img/icon/warning.png', 'onclose': function(){ $('#b'+pref+'-'+id+'-basket').removeAttr('disabled'); $('#'+pref+'-'+id+'-basket').removeClass('wait').addClass('add'); }}); } return false; } function buyNow(id,pref){ if(lock_buttons) return false; else lock_buttons = 1; var opt = new Array(); var err_msg = ''; $('#b'+pref+'-'+id+'-buynow').attr('disabled','disabled'); $('#'+pref+'-'+id+'-buynow').removeClass('done').removeClass('err').removeClass('now').addClass('wait').attr('title',''); $('#'+pref+'-'+id+'-options-selectors').find('input:checked, select').each(function(){ if(this.value !== ''){ opt.push(this.id.split('-')[3]+'-'+this.value); }else{ err_msg += '<li>'+$(this).parent().parent().find('span.opt').html().replace(':', '')+'</li>'; } }); if(err_msg == ''){ _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'add', 'id':id, 'pref':pref, 'opt':opt.join(':'), 'cnt':$('#q'+pref+'-'+id+'-basket').attr('value'), 'now':1}}); ga_event('basket_buynow'); }else{ lock_buttons = 0; shop_alert('<div class="MyWinError">Опции<ul>'+err_msg+'</ul>обязательны для выбора</div>','Замечания','warning',350,100,{tm:8000,align:'left',icon:'http://s79.ucoz.net/img/icon/warning.png', 'onclose': function(){ $('#b'+pref+'-'+id+'-buynow').removeAttr('disabled'); $('#'+pref+'-'+id+'-buynow').removeClass('wait').addClass('add'); }}); } return false; } //--></script>
Я разделил этот шаблон на три части. Работать мы будет только с первой. Таким образом, от всего шаблона остается лишь малая часть:
#1.1
<?if($BODY$)?><ul>$BODY$</ul><?endif?>#1.2
<?if($NUM_ENTRIES$)?> <div class="total">Итого: $ORDER_AMOUNT$</div> <?if($ORDER_DISCOUNT$)?> <div class="disc"> Скидка: $ORDER_DISCOUNT$</div> <?if($DISCOUNT_INFO$)?> <hr> <div class="disc-info">$DISCOUNT_INFO$</div> <?endif?> <?endif?> <hr>#1.3
<a class="basketclear" href="javascript://" rel="nofollow" onclick="return clearBasket();">Очистить</a> | <a class="basketorder" href="/shop/checkout">Оформить заказ</a> <?else?>#1.4
<div class="empty">Ваша корзина пуста</div> <?endif?>
В свою очередь этот фрагмент шаблона также разделен на части и работает по такой схеме:
Так, работая с частями шаблона, можно без проблем его освоить, главное - понять схему работы.
Настройки
Чтобы настроить корзину, вспомните урок 34.
При настройке, есть нюанс, который мы не затрагивали ранее. Если выбрать тип корзины "Расширенный", то появится возможность настроить вид товара в корзине:
Делается это в панели управления - Дизайн - Управление дизайном (шаблоны) - Вид товара в корзине:
Шаблон вида товара в каталоге имеет вид:
<li id="basket-item-$ID$" >
<a class="sb-func remove" title="Удалить товар" onclick="return removeBasket('$ID$')" href="javascript://" rel="nofollow"> </a>
<div class="sb-name"><a href="$ENTRY_URL$">$NAME$</a><?if($OPTIONS$)?><br><small>$OPTIONS$</small><?endif?></div>
<div class="text-right">$COUNT$ x $PRICE$ </div>
</li>
Из шаблона видно, что каждый товар в корзине является пунктом <li>. Эти пункты выводятся в шаблоне корзины через $BODY$. В корзине это выглядит так:
... <ul>$BODY$</ul> ...
Размещение
За вывод корзины в шаблоне отвечает $BASKET$. Все, что мы рассматривали в первой части урока - выводится там, где размещена эта переменная:
<div id="shop-basket" style="position:relative;"> Шаблон корзины </div>
Обратите внимание, что шаблон корзины помещается в div с id="shop-basket" и style="position:relative;" (подробнее о свойстве CSS position - http://htmlbook.ru/css/position).
Подобная "обертка" позволяет сделать вывод корзины одинаковым для всех интернет магазинов uCoz и мы сейчас его рассмотрим.
Вариант 1. Размещение корзины на страницах. Здесь мы просто открываем любой глобальный блок (обычно шапка или сайдбар) и добавляем в желаемое место $BASKET$. Подробнее об этом в уроке 48 и 49.
Вариант 2. Зафиксировать корзину у края окна. Чтобы корзина была в зоне видимости даже при прокрутке страницы, достаточно добавить стили:
#shop-basket {
position: fixed !important;
top: 0px;
right: 0px;
}
Вам нужно только с помощью top или bottom и left или right уточнить положение корзины.
Вариант 3. Расположить корзину во всплывающем окне. Для это потребуется добавить стили для корзины:
#shop-basket {
display: none;
}
В шаблон требуется добавить кнопку, по нажатию на которую будет показываться содержимое корзины.
<a href="#" onclick="$.fancybox('#shop-basket');return false;">Корзина</a>
Вариант 4. Показать корзину после добавления товара. Как и 3-ем варианте скрываем корзину:
#shop-basket {
display: none;
}
А теперь идем в шаблон корзины и переходим к части #3. Находим функцию добавления в корзину add2Basket. И перед return false добавляем $.fancybox('#shop-basket');. Итого имеем:
function add2Basket(id,pref){
if(lock_buttons) return false; else lock_buttons = 1;
var opt = new Array();
var err_msg = '';
$('#b'+pref+'-'+id+'-basket').attr('disabled','disabled');
$('#'+pref+'-'+id+'-basket').removeClass('done').removeClass('err').removeClass('add').addClass('wait').attr('title','');
$('#'+pref+'-'+id+'-options-selectors').find('input:checked, select').each(function(){
opt.push(this.id.split('-')[3]+(this.value !== '' ? '-'+this.value :''));
if(this.value !== ''){
opt.push(this.id.split('-')[3]+(this.value !== '' ? '-'+this.value :''));
}else{
err_msg += 'Готово! Проверяем.
Упражнения
- Настройте корзину для своего магазина. Переключайте тип корзины и обратите внимание на изменения, которые происходят в корзине;
- Измените шаблон корзины так, чтобы при отсутствии добавленных товаров выводилось сообщение об акциях;
- Выберите место для корзины в верхней части сайта так, чтобы она была видна без прокручивания вниз страницы. Или любой другой из четырех вариантов размещения
Обсуждение
Всего комментариев: 3
Нет, данный код будет работать только в модуле магазин. Вы можете поставить, чтобы при посещений главной - открывался интернет магазин.
