Данная функция вызывается только javascript'ом, и использует для хранения cookie и базу данных trade. На странице происходит определение: если пользователь не авторизован, использовать cookie для хранения; если пользователь авторизован, использовать базу данных trade для хранения, при этом происходит синхронизация ранее добавленных товаров в cookie и базу данных trade, после чего очищая cookie данные. Данные функции требуется прописывать только используя yepnope. Данный код нужно разместить в header.html
файле, после подключения всех js файлов.
<script type="text/javascript">
function getFavoriteData(){
return JSON.parse(localStorage.getItem('favorite'));
}
function setFavoriteData(o){
localStorage.setItem('favorite', 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}}(){
{% if not user.isGuest %}
// добавить товар в избранное
$(document).on('click', '.goodsitem-favorite-add-btn', function(){
var $objb = $(this);
if(!$objb.hasClass('process')){
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>Добавление');
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersFavorite.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}}',
},
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'){
$('.favorite-offers-count').html(obj.res.count||0);
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-del-btn')
.removeClass('goodsitem-favorite-add-btn')
.attr('data-pkid', obj.res.pkid)
.attr('title', 'Удалить из избранного')
.html('<i class="fa fa-heart"></i>В избранном');
} else {
if(obj.res.error_code == -14){
// товар с такими характеристиками уже добавлен в избранное
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-del-btn')
.removeClass('goodsitem-favorite-add-btn')
.attr('data-pkid', obj.res.pkid)
.attr('title', 'Удалить из избранного')
.html('<i class="fa fa-heart"></i>В избранном');
} 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')
.attr('title', 'Добавить в избранное')
.html('<i class="fa fa-heart-o"></i>В избранное');
}
}
}
});
}
});
{% else %}
// добавить товар в избранное
$(document).on('click', '.goodsitem-favorite-add-btn', function(){
var $objb = $(this);
if(!$objb.hasClass('process')){
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>Добавление');
var favoriteData = getFavoriteData() || []; // вытаскиваем все данные корзины избранных товаров
var flag_exists = false;
var elem = {};
$.each(favoriteData, 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}}'){
flag_exists = true;
elem = el;
}
}
});
if(!flag_exists){
favoriteData.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}}',
});
localStorage.removeItem('favorite');
setFavoriteData(favoriteData);
$('.favorite-offers-count').html(favoriteData.length <= 99 ? favoriteData.length : '99+');
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-del-btn')
.removeClass('goodsitem-favorite-add-btn')
.attr('data-pkid', elem.tmp_pkid)
.attr('title', 'Удалить из избранного')
.html('<i class="fa fa-heart"></i>В избранном');
}
}
});
{% endif %}
}
</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}}(){
{% if not user.isGuest %}
// удалить товар из избранного
$(document).on('click', '.goodsitem-favorite-del-btn', function(){
var $objb = $(this);
if(!$objb.hasClass('process')){
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>Удаление');
var offerFavorite_pkid = $objb.attr('data-pkid');
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersFavorite.delete',
resultType: 'json',
params: {
pkid: offerFavorite_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'){
$('.favorite-offers-count').html(obj.res.count||0);
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-add-btn')
.removeClass('goodsitem-favorite-del-btn')
.removeAttr('data-pkid')
.attr('title', 'Добавить в избранное')
.html('<i class="fa fa-heart-o"></i>В избранное');
} 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')
.attr('title', 'Удалить из избранного')
.html('<i class="fa fa-heart"></i>В избранном');
}
}
});
}
});
{% else %}
// удалить товар из избранного
$(document).on('click', '.goodsitem-favorite-del-btn', function(){
var $objb = $(this);
if(!$objb.hasClass('process')){
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>Удаление');
var offerFavorite_pkid = $objb.attr('data-pkid');
var favoriteData = getFavoriteData() || []; // вытаскиваем все данные корзины избранных товаров
var favoriteData2 = [];
$.each(favoriteData, function(i, el){
if(el.tmp_pkid != offerFavorite_pkid){
favoriteData2.push(el);
}
});
localStorage.removeItem('favorite');
setFavoriteData(favoriteData2);
$('.favorite-offers-count').html(favoriteData2.length <= 99 ? favoriteData2.length : '99+');
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-add-btn')
.removeClass('goodsitem-favorite-del-btn')
.removeAttr('data-pkid')
.attr('title', 'Добавить в избранное')
.html('<i class="fa fa-heart-o"></i>В избранное');
}
});
{% endif %}
}
</script>
Функция проверки нахождения товара в избранном. Обычно прописывается в файле catalog_item.html
:
<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}}(){
{% if not user.isGuest %}
// проверка наличия товара в избранном
function checkOfferFavorite(){
$objb = $('.goodsitem-favorite-add-btn');
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>');
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersFavorite.getData',
resultType: 'json',
params: {
filter: {
company_pkid: '{{offer.company_pkid}}',
goods_pkid: '{{offer.goods_pkid}}',
offer_number: '{{offer.offer_number}}',
offer_type: '{{offer.offer_type}}',
tid: '{{offer.tid}}',
},
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'){
if((obj.res.count||0) > 0){
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-del-btn')
.removeClass('goodsitem-favorite-add-btn')
.attr('data-pkid', obj.res.data[0].pkid)
.attr('title', 'Удалить из избранного')
.html('<i class="fa fa-heart"></i>В избранном');
} else {
$objb
.removeClass('process disabled')
.attr('title', 'Добавить в избранное')
.html('<i class="fa fa-heart-o"></i>В избранное');
}
} else {
$objb
.removeClass('process disabled')
.attr('title', 'Добавить в избранное')
.html('<i class="fa fa-heart-o"></i>В избранное');
}
}
});
}
checkOfferFavorite();
{% else %}
// проверка наличия товара в избранном
function checkOfferFavorite(){
$objb = $('.goodsitem-favorite-add-btn');
$objb
.addClass('process disabled')
.html('<i class="fa fa-spinner fa-spin"></i>');
var favoriteData = getFavoriteData() || []; // вытаскиваем все данные корзины избранных товаров
var flag_exists = false;
var elem = {};
$.each(favoriteData, 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}}'){
flag_exists = true;
elem = el;
}
}
});
if(flag_exists){
$objb
.removeClass('process disabled')
.addClass('goodsitem-favorite-del-btn')
.removeClass('goodsitem-favorite-add-btn')
.attr('data-pkid', elem.tmp_pkid)
.attr('title', 'Удалить из избранного')
.html('<i class="fa fa-heart"></i>В избранном');
} else {
$objb
.removeClass('process disabled')
.attr('title', 'Добавить в избранное')
.html('<i class="fa fa-heart-o"></i>В избранное');
}
}
checkOfferFavorite();
{% 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 getCountOffersFavorite(){
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersFavorite.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'){
$('.favorite-offers-count').html(obj.res.count <= 99 ? obj.res.count : '99+');
} else {
// ...
}
}
});
}
{% else %}
var favoriteData = getFavoriteData() || []; // вытаскиваем все данные корзины избранных товаров
$('.favorite-offers-count').html(favoriteData.length <= 99 ? favoriteData.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 checkCookieOffersFavorite(){
var favoriteData = getFavoriteData() || []; // вытаскиваем все данные корзины
if(favoriteData.length > 0){
// обработка запроса
ioCallEntity({
entity: 'bmc.trade2.model.offersFavorite.addGuestData',
resultType: 'json',
params: {
data: favoriteData,
},
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('favorite');
setFavoriteData([]);
} else {
// ...
}
getCountOffersFavorite();
}
});
} else {
getCountOffersFavorite();
}
}
checkCookieOffersFavorite();
{% endif %}
}
</script>