Данная функция вызывается только javascript'ом, и использует для хранения cookie и базу данных trade. На странице происходит определение: если пользователь не авторизован, использовать cookie для хранения; если пользователь авторизован, использовать базу данных trade для хранения, при этом происходит синхронизация ранее добавленных товаров в cookie и базу данных trade, после чего очищая cookie данные. Данные функции требуется прописывать только используя yepnope. Данный код нужно разместить в header.html
файле, после подключения всех js файлов.
<script type="text/javascript">
function getCartData(){
return JSON.parse(localStorage.getItem('cart'));
}
function setCartData(o){
localStorage.setItem('cart', JSON.stringify(o));
return false;
}
</script>
Функция добавления товара в корзину. На странице описания товара (catalog_item.html
) нужно разместить следующий код (при этом должна быть доступна twig переменная offer, содержащая в себе информацию о просматриваемом товаре):
<script type="text/javascript">
{% set pageCatalogItemID = random(999999) %}
jsApplication.pageLoad(function(){
{% set variable = 'var_'~random(999999) %}
var {{variable}} = 0;
var param = '';
var load = [];
load = load.concat(ioGetModuleUrls({module: 'noty-packaged', push: 1}));
if(jsApplication.busy && load.length > 0) {jsApplication.busy(true); {{variable}} = 1;}
if(load.length > 0){
yepnope({
load: load,
complete: function(){
if(jsApplication.busy && {{variable}}) jsApplication.busy(false);
//onBootstrapEditable();
setTimeout('pageCatalogItem{{pageCatalogItemID}}()', 10);
},
});
} else {
if(jsApplication.busy && {{variable}}) jsApplication.busy(false);
setTimeout('pageCatalogItem{{pageCatalogItemID}}()', 10);
}
});
function pageCatalogItem{{pageCatalogItemID}}(){
var enum_si = {{ioEnum.SI|json_encode|raw}};
var offer_discount = parseFloat('{{offer.offer_discount}}')||0;
var offer_parameters = {{offer.offer_parameters|json_encode|raw}};
var sizes = {{categorySizetypes|json_encode|raw}};
var colors = {{colors|json_encode|raw}};
var selected_color = {{offer_category.isShowColors ? 'offer_parameters.length > 0 ? offer_parameters[0].color_pkid : 0' : '0'}};
var selected_size = {{offer_category.isShowSizetypes ? "''" : '0'}};
var selected_gender = {{offer_category.isShowGenders ? '1' : '0'}};
var selected_delivery_method = 0;
var selected_delivery_warehouse_pkid = '';
{% if not user.isGuest %}
// добавить товар в корзину
$(document).on('click', '.goodsitem-basket-add-btn', function(){
var $objb = $(this);
if(!$objb.hasClass('process')){
if(selected_color !== ''
&& selected_size !== ''
&& selected_gender !== ''
&& selected_delivery_method !== ''
&& selected_delivery_warehouse_pkid !== ''){
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>Добавление в корзину');
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersBasket.add',
resultType: 'json',
params: {
company_pkid: '{{offer.company_pkid}}',
goods_pkid: '{{offer.goods_pkid}}',
offer_number: '{{offer.offer_number}}',
offer_type: '{{offer.offer_type}}',
tid: '{{offer.tid}}',
count: 1,
color_pkid: selected_color,
size_pkid: selected_size,
gender_pkid: selected_gender,
delivery_method: selected_delivery_method,
delivery_warehouse_pkid: selected_delivery_warehouse_pkid,
},
success: function(data, tag){
//console.log(data);
var obj;try{obj = $.parseJSON(data);}catch(ex){obj = null;}
if(obj != null && typeof(obj.res) != 'undefined' && obj.res != null && obj.res.error_code == '1'){
$('.basket-offers-count').html(obj.res.count||0);
if(confirm(
'Товар добавлен в корзину.'+"\n"+
'Перейти в корзину?'
)){
document.location.href = urlGetAdd('/basket', 'account', '{{user.account}}');
}
} else {
if(obj.res.error_code == -14){
var n = noty({
text: 'Товар с такими характеристиками уже добавлен в корзину',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else {
var n = noty({
text: 'Не удалось добавить товар в корзину. Попробуйте еще раз.'+(obj != null && obj.res.error_str != '' ? ' Полный текст ошибки: '+obj.res.error_str : ''),
type: 'warning',
layout: 'bottomRight',
timeout: 4000,
});
}
}
$objb
.removeClass('process disabled')
.html('<i class="fa fa-shopping-cart"></i>Добавить в Корзину');
}
});
} else {
if(selected_color === ''){
var n = noty({
text: 'Выберите цвет',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_size === ''){
var n = noty({
text: 'Выберите размер',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_gender === ''){
var n = noty({
text: 'Выберите пол',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_delivery_method === ''){
var n = noty({
text: 'Выберите способ доставки',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_delivery_warehouse_pkid === ''){
var n = noty({
text: 'Выберите пункт самовывоза',
type: 'warning',
layout: 'center',
timeout: 2000,
});
}
}
}
});
{% else %}
// добавить товар в корзину
$(document).on('click', '.goodsitem-basket-add-btn', function(){
var $objb = $(this);
if(!$objb.hasClass('process')){
if(selected_color !== ''
&& selected_size !== ''
&& selected_gender !== ''
&& selected_delivery_method !== ''
&& selected_delivery_warehouse_pkid !== ''){
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i> Добавление в корзину');
var cartData = getCartData() || []; // вытаскиваем все данные корзины
var flag_exists = false;
$.each(cartData, function(i, el){
if(!flag_exists){
if(el.company_pkid == '{{offer.company_pkid}}'
&& el.goods_pkid == '{{offer.goods_pkid}}'
&& el.offer_number == '{{offer.offer_number}}'
&& el.offer_type == '{{offer.offer_type}}'
&& el.tid == '{{offer.tid}}'
&& el.color_pkid == selected_color
&& el.size_pkid == selected_size
&& el.gender_pkid == selected_gender){
flag_exists = true;
}
}
});
if(!flag_exists){
cartData.push({
tmp_pkid: ioGenPkid(),
company_pkid: '{{offer.company_pkid}}',
goods_pkid: '{{offer.goods_pkid}}',
offer_number: '{{offer.offer_number}}',
offer_type: '{{offer.offer_type}}',
tid: '{{offer.tid}}',
count: 1,
color_pkid: selected_color,
size_pkid: selected_size,
gender_pkid: selected_gender,
delivery_method: selected_delivery_method,
delivery_warehouse_pkid: selected_delivery_warehouse_pkid,
});
localStorage.removeItem('cart');
setCartData(cartData);
$('.basket-offers-count').html(cartData.length <= 99 ? cartData.length : '99+');
if(confirm(
'Товар добавлен в корзину.'+"\n"+
'Перейти в корзину?'
)){
document.location.href = urlGetAdd('/basket', 'account', '{{user.account}}');
}
} else {
var n = noty({
text: 'Товар с такими характеристиками уже добавлен в корзину',
type: 'warning',
layout: 'center',
timeout: 2000,
});
}
$objb
.removeClass('process disabled')
.html('<i class="fa fa-shopping-cart"></i>Добавить в Корзину');
} else {
if(selected_color === ''){
var n = noty({
text: 'Выберите цвет',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_size === ''){
var n = noty({
text: 'Выберите размер',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_gender === ''){
var n = noty({
text: 'Выберите пол',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_delivery_method === ''){
var n = noty({
text: 'Выберите способ доставки',
type: 'warning',
layout: 'center',
timeout: 2000,
});
} else if(selected_delivery_warehouse_pkid === ''){
var n = noty({
text: 'Выберите пункт самовывоза',
type: 'warning',
layout: 'center',
timeout: 2000,
});
}
}
}
});
{% endif %}
}
</script>
Функция подсчета количества товаров в корзине. Обычно прописывается в файле header.html
:
<script type="text/javascript">
{% set pageHeaderID = random(999999) %}
jsApplication.pageLoad(function(){
{% set variable = 'var_'~random(999999) %}
var {{variable}} = 0;
var param = '';
var load = [];
//load = load.concat(ioGetModuleUrls({module: 'noty-packaged', push: 1}));
if(jsApplication.busy && load.length > 0) {jsApplication.busy(true); {{variable}} = 1;}
if(load.length > 0){
yepnope({
load: load,
complete: function(){
if(jsApplication.busy && {{variable}}) jsApplication.busy(false);
//onBootstrapEditable();
setTimeout('pageHeader{{pageHeaderID}}()', 10);
},
});
} else {
if(jsApplication.busy && {{variable}}) jsApplication.busy(false);
setTimeout('pageHeader{{pageHeaderID}}()', 10);
}
});
function pageHeader{{pageHeaderID}}(){
{% if not user.isGuest %}
// подгрузка количества товаров в корзине
function getCountOffersBasket(){
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersBasket.getData',
resultType: 'json',
params: {
filter: {
offer_type: 2, // розничное
},
limit: 1,
},
success: function(data, tag){
//console.log(data);
var obj;try{obj = $.parseJSON(data);}catch(ex){obj = null;}
if(obj != null && typeof(obj.res) != 'undefined' && obj.res != null && obj.res.error_code == '1'){
$('.basket-offers-count').html(obj.res.count <= 99 ? obj.res.count : '99+');
} else {
// ...
}
}
});
}
{% else %}
var cartData = getCartData() || []; // вытаскиваем все данные корзины
$('.basket-offers-count').html(cartData.length <= 99 ? cartData.length : '99+');
{% endif %}
}
</script>
Функция переноса браузерной корзины избранных товаров в единую. Обычно прописывается в файле header.html
:
<script type="text/javascript">
{% set pageHeaderID = random(999999) %}
jsApplication.pageLoad(function(){
{% set variable = 'var_'~random(999999) %}
var {{variable}} = 0;
var param = '';
var load = [];
//load = load.concat(ioGetModuleUrls({module: 'noty-packaged', push: 1}));
if(jsApplication.busy && load.length > 0) {jsApplication.busy(true); {{variable}} = 1;}
if(load.length > 0){
yepnope({
load: load,
complete: function(){
if(jsApplication.busy && {{variable}}) jsApplication.busy(false);
//onBootstrapEditable();
setTimeout('pageHeader{{pageHeaderID}}()', 10);
},
});
} else {
if(jsApplication.busy && {{variable}}) jsApplication.busy(false);
setTimeout('pageHeader{{pageHeaderID}}()', 10);
}
});
function pageHeader{{pageHeaderID}}(){
{% if not user.isGuest %}
// перенос браузерной корзины в единую
function checkCookieOffersBasket(){
var cartData = getCartData() || []; // вытаскиваем все данные корзины
if(cartData.length > 0){
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersBasket.addGuestData',
resultType: 'json',
params: {
data: cartData,
},
success: function(data, tag){
//console.log(data);
var obj;try{obj = $.parseJSON(data);}catch(ex){obj = null;}
if(obj != null && typeof(obj.res) != 'undefined' && obj.res != null && obj.res.error_code == '1'){
localStorage.removeItem('cart');
setCartData([]);
} else {
// ...
}
getCountOffersBasket();
}
});
} else {
getCountOffersBasket();
}
}
checkCookieOffersBasket();
{% endif %}
}
</script>