Меню KDT

Виджет "Корзина товаров"

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