Меню KDT

Виджет "Избранные товары"

Данная функция вызывается только 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>
Код обязательно должен обладать отступом (tabs).