Jump to content

[TUTORIAL] Block cart module in top horizontal menu


Recommended Posts

It's working now!

 

I'm going to look at it right away! Have been looking for such a solution for months :)

 

 

so here it is :D it's easy in implementation i think

feel free to write here if you will have some questions

Link to comment
Share on other sites

so here it is :D it's easy in implementation i think

feel free to write here if you will have some questions

Ok, it took a while because this morning I've managed to screw up half of my site :( My own stupid mistake so I'm working hard on getting it back to how it was before. 

 

The only problem I have with the cart in the top menu, is that it won't refresh after I've put an item into the cart or deleted it. I have to clear cache in the admin panel first.

 

Site is under construction mode atm because of my mistake this morning so providing the url is no use now :)

 

EDIT: Site is back up and running! url = tassenop8.nl

Edited by Silvia - Tassen op 8 (see edit history)
Link to comment
Share on other sites

Vekia, is it not due to the cart originally being in #header ?

 

in the js file it says

var cart_block = new HoverWatcher('#header .cart_block');
var shopping_cart = new HoverWatcher('#header .shopping_cart');

 

does this need to be changed to the new div names ?

 

ie

var cart_block = new HoverWatcher('.sf-menu .cart_block');

var shopping_cart = new HoverWatcher('.sf-menu .shopping_cart');

 

etc

Just a thought ?

Edited by MerseyRay (see edit history)
Link to comment
Share on other sites

I thought the .js file had to be in theme/modules/blockcart so I put it there. Now I understand that wasn't correct so I've removed it there. In the theme/js/modules/blockcart there is a ajax-cart.js file

/*
* 2007-2014 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2014 PrestaShop SA
*  @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function(){
	ajaxCart.overrideButtonsInThePage();

	$(document).on('click', '.block_cart_collapse', function(e){
		e.preventDefault();
		ajaxCart.collapse();
	});
	$(document).on('click', '.block_cart_expand', function(e){
		e.preventDefault();
		ajaxCart.expand();
	});

	var cart_qty = 0;
	var current_timestamp = parseInt(new Date().getTime() / 1000);

	if (typeof $('.ajax_cart_quantity').html() == 'undefined' || (typeof generated_date != 'undefined' && generated_date != null && (parseInt(generated_date) + 30) < current_timestamp))
		ajaxCart.refresh();
	else
		cart_qty = parseInt($('.ajax_cart_quantity').html());

	/* roll over cart */
	var cart_block = new HoverWatcher('#header .cart_block');
	var shopping_cart = new HoverWatcher('#header .shopping_cart');

	if ('ontouchstart' in document.documentElement)
	{
		$('.shopping_cart > a:first').on('click', function(e){
			e.preventDefault();
		});
	}

	$(document).on('touchstart', '#header .shopping_cart a:first', function(){
		if ($(this).next('.cart_block:visible').length)
			$("#header .cart_block").stop(true, true).slideUp(450);
		else
			$("#header .cart_block").stop(true, true).slideDown(450);
		e.preventDefault();
		e.stopPropagation();
	});

	$("#header .shopping_cart a:first").hover(
		function(){
			if (ajaxCart.nb_total_products > 0 || cart_qty > 0)
				$("#header .cart_block").stop(true, true).slideDown(450);
		},
		function(){
			setTimeout(function(){
				if (!shopping_cart.isHoveringOver() && !cart_block.isHoveringOver())
					$("#header .cart_block").stop(true, true).slideUp(450);				
			}, 200);
		}
	);

	$("#header .cart_block").hover(
		function(){
		},
		function(){
			setTimeout(function(){
				if (!shopping_cart.isHoveringOver())
					$("#header .cart_block").stop(true, true).slideUp(450);
			}, 200);
		}
	);

	$(document).on('click', '.delete_voucher', function(e){
		e.preventDefault();
		$.ajax({
			type: 'POST',
			headers: { "cache-control": "no-cache" },
			async: true,
			cache: false,
			url:$(this).attr('href') + '?rand=' + new Date().getTime()
		});
		$(this).parent().parent().remove();
		if ($('body').attr('id') == 'order' || $('body').attr('id') == 'order-opc')
		{
			if (typeof(updateAddressSelection) != 'undefined')
				updateAddressSelection();
			else
				location.reload();
		}
	});

	$(document).on('click', '#cart_navigation input', function(e){
		$(this).prop('disabled', 'disabled').addClass('disabled');
		$(this).closest("form").get(0).submit();
	});

	$(document).on('click', '#layer_cart .cross, #layer_cart .continue, .layer_cart_overlay', function(e){
		e.preventDefault();
		$('.layer_cart_overlay').hide();
		$('#layer_cart').fadeOut('fast');
	});
	
	$('#columns #layer_cart, #columns .layer_cart_overlay').detach().prependTo('#columns');
});

//JS Object : update the cart by ajax actions
var ajaxCart = {
	nb_total_products: 0,
	//override every button in the page in relation to the cart
	overrideButtonsInThePage : function(){
		//for every 'add' buttons...
		$(document).on('click', '.ajax_add_to_cart_button', function(e){
			e.preventDefault();
			var idProduct =  $(this).data('id-product');
			if ($(this).prop('disabled') != 'disabled')
				ajaxCart.add(idProduct, null, false, this);
		});
		//for product page 'add' button...
		$(document).on('click', '#add_to_cart button', function(e){
			e.preventDefault();
			ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null);
		});

		//for 'delete' buttons in the cart block...
		$(document).on('click', '.cart_block_list .ajax_cart_block_remove_link', function(e){
			e.preventDefault();
			// Customized product management
			var customizationId = 0;
			var productId = 0;
			var productAttributeId = 0;
			var customizableProductDiv = $($(this).parent().parent()).find("div[data-id^=deleteCustomizableProduct_]");
			var idAddressDelivery = false;

			if (customizableProductDiv && $(customizableProductDiv).length)
			{
				var ids = customizableProductDiv.data('id').split('_');
				if (typeof(ids[1]) != 'undefined')
				{
					customizationId = parseInt(ids[1]);
					productId = parseInt(ids[2]);
					if (typeof(ids[3]) != 'undefined')
						productAttributeId = parseInt(ids[3]);
					if (typeof(ids[4]) != 'undefined')
						idAddressDelivery = parseInt(ids[4]);
				}
			}

			// Common product management
			if (!customizationId)
			{
				//retrieve idProduct and idCombination from the displayed product in the block cart
				var firstCut = $(this).parent().parent().data('id').replace('cart_block_product_', '');
				firstCut = firstCut.replace('deleteCustomizableProduct_', '');
				ids = firstCut.split('_');
				productId = parseInt(ids[0]);

				if (typeof(ids[1]) != 'undefined')
					productAttributeId = parseInt(ids[1]);
				if (typeof(ids[2]) != 'undefined')
					idAddressDelivery = parseInt(ids[2]);
			}

			// Removing product from the cart
			ajaxCart.remove(productId, productAttributeId, customizationId, idAddressDelivery);
		});
	},

	// try to expand the cart
	expand : function(){
		if ($('.cart_block_list').hasClass('collapsed'))
		{
			$('.cart_block_list.collapsed').slideDown({
				duration: 450,
				complete: function(){
					$(this).addClass('expanded').removeClass('collapsed');
				}
			});

			// save the expand statut in the user cookie
			$.ajax({
				type: 'POST',
				headers: { "cache-control": "no-cache" },
				url: baseDir + 'modules/blockcart/blockcart-set-collapse.php' + '?rand=' + new Date().getTime(),
				async: true,
				cache: false,
				data: 'ajax_blockcart_display=expand',
				complete: function(){
					$('.block_cart_expand').fadeOut('fast', function(){
						$('.block_cart_collapse').fadeIn('fast');
					});
				}			
			});
		}
	},

	// try to collapse the cart
	collapse : function(){
		if ($('.cart_block_list').hasClass('expanded'))
		{
			$('.cart_block_list.expanded').slideUp('slow', function(){
				$(this).addClass('collapsed').removeClass('expanded');
			});

			// save the expand statut in the user cookie
			$.ajax({
				type: 'POST',
				headers: { "cache-control": "no-cache" },
				url: baseDir + 'modules/blockcart/blockcart-set-collapse.php' + '?rand=' + new Date().getTime(),
				async: true,
				cache: false,
				data: 'ajax_blockcart_display=collapse' + '&rand=' + new Date().getTime(),
				complete: function(){
					$('.block_cart_collapse').fadeOut('fast', function(){
						$('.block_cart_expand').fadeIn('fast');
					});
				}
			});
		}
	},
	// Fix display when using back and previous browsers buttons
	refresh : function(){
		$.ajax({
			type: 'POST',
			headers: { "cache-control": "no-cache" },
			url: baseUri + '?rand=' + new Date().getTime(),
			async: true,
			cache: false,
			dataType : "json",
			data: 'controller=cart&ajax=true&token=' + static_token,
			success: function(jsonData)
			{
				ajaxCart.updateCart(jsonData);
			}
		});
	},

	// Update the cart information
	updateCartInformation : function (jsonData, addedFromProductPage){
		ajaxCart.updateCart(jsonData);
		//reactive the button when adding has finished
		if (addedFromProductPage) 
		{
			$('#add_to_cart button').removeProp('disabled').removeClass('disabled');
			if (!jsonData.hasError || jsonData.hasError == false)
				$('#add_to_cart button').addClass('added');
			else
				$('#add_to_cart button').removeClass('added');
		}
		else
			$('.ajax_add_to_cart_button').removeProp('disabled');
	},
	// close fancybox
	updateFancyBox : function (){},
	// add a product in the cart via ajax
	add : function(idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist){
		if (addedFromProductPage && !checkCustomizations())
		{
			if (contentOnly) 
			{
				var productUrl = window.document.location.href + '';
				var data = productUrl.replace('content_only=1', '');
				window.parent.document.location.href = data;
				return;
			}
			if (!!$.prototype.fancybox)
			    $.fancybox.open([
			        {
			            type: 'inline',
			            autoScale: true,
			            minHeight: 30,
			            content: '<p class="fancybox-error">' + fieldRequired + '</p>'
			        }
			    ], {
			        padding: 0
			    });
			else
			    alert(fieldRequired);
            return;
		}
		emptyCustomizations();
		//disabled the button when adding to not double add if user double click
		if (addedFromProductPage)
		{
			$('#add_to_cart button').prop('disabled', 'disabled').addClass('disabled');
			$('.filled').removeClass('filled');
		}
		else
			$(callerElement).prop('disabled', 'disabled');

		if ($('.cart_block_list').hasClass('collapsed'))
			this.expand();
		//send the ajax request to the server
		$.ajax({
			type: 'POST',
			headers: { "cache-control": "no-cache" },
			url: baseUri + '?rand=' + new Date().getTime(),
			async: true,
			cache: false,
			dataType : "json",
			data: 'controller=cart&add=1&ajax=true&qty=' + ((quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&token=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination): ''),
			success: function(jsonData,textStatus,jqXHR)
			{
				// add appliance to whishlist module
				if (whishlist && !jsonData.errors)
					WishlistAddProductCart(whishlist[0], idProduct, idCombination, whishlist[1]);
				
				if (!jsonData.hasError)
				{
					if (contentOnly)
						window.parent.ajaxCart.updateCartInformation(jsonData, addedFromProductPage);
					else
						ajaxCart.updateCartInformation(jsonData, addedFromProductPage);

					if (jsonData.crossSelling)
						$('.crossseling').html(jsonData.crossSelling);

					if (idCombination)
						$(jsonData.products).each(function(){
							if (this.id != undefined && this.id == parseInt(idProduct) && this.idCombination == parseInt(idCombination))
								if (contentOnly)
									window.parent.ajaxCart.updateLayer(this);	
								else
									ajaxCart.updateLayer(this);
						});
					else
						$(jsonData.products).each(function(){
							if (this.id != undefined && this.id == parseInt(idProduct))
								if (contentOnly)
									window.parent.ajaxCart.updateLayer(this);
								else
									ajaxCart.updateLayer(this);					
						});
					if (contentOnly)
						parent.$.fancybox.close();
				}
				else 
				{
					if (contentOnly)
						window.parent.ajaxCart.updateCart(jsonData);
					else
						ajaxCart.updateCart(jsonData);	
					if (addedFromProductPage)
						$('#add_to_cart button').removeProp('disabled').removeClass('disabled');
					else
						$(callerElement).removeProp('disabled');
				}

			},
			error: function(XMLHttpRequest, textStatus, errorThrown)
			{
				var error = "Impossible to add the product to the cart.<br/>textStatus: '" + textStatus + "'<br/>errorThrown: '" + errorThrown + "'<br/>responseText:<br/>" + XMLHttpRequest.responseText;
				if (!!$.prototype.fancybox)
				    $.fancybox.open([
				    {
				        type: 'inline',
				        autoScale: true,
				        minHeight: 30,
				        content: '<p class="fancybox-error">' + error + '</p>'
				    }],
					{
				        padding: 0
				    });
				else
				    alert(error);
				//reactive the button when adding has finished
				if (addedFromProductPage)
					$('#add_to_cart button').removeProp('disabled').removeClass('disabled');
				else
					$(callerElement).removeProp('disabled');
			}
		});
	},

	//remove a product from the cart via ajax
	remove : function(idProduct, idCombination, customizationId, idAddressDelivery){
		//send the ajax request to the server
		$.ajax({
			type: 'POST',
			headers: { "cache-control": "no-cache" },
			url: baseUri + '?rand=' + new Date().getTime(),
			async: true,
			cache: false,
			dataType : "json",
			data: 'controller=cart&delete=1&id_product=' + idProduct + '&ipa=' + ((idCombination != null && parseInt(idCombination)) ? idCombination : '') + ((customizationId && customizationId != null) ? '&id_customization=' + customizationId : '') + '&id_address_delivery=' + idAddressDelivery + '&token=' + static_token + '&ajax=true',
			success: function(jsonData)	{
				ajaxCart.updateCart(jsonData);
				if ($('body').attr('id') == 'order' || $('body').attr('id') == 'order-opc')
					deleteProductFromSummary(idProduct+'_'+idCombination+'_'+customizationId+'_'+idAddressDelivery);
			},
			error: function()
            {
				var error = 'ERROR: unable to delete the product';
				if (!!$.prototype.fancybox)
				{
				    $.fancybox.open([
				        {
				            type: 'inline',
				            autoScale: true,
				            minHeight: 30,
				            content: error
				        }
				    ], {
				        padding: 0
				    });
				}
				else
				    alert(error);
            }
		});
	},

	//hide the products displayed in the page but no more in the json data
	hideOldProducts : function(jsonData){
		//delete an eventually removed product of the displayed cart (only if cart is not empty!)
		if ($('.cart_block_list:first dl.products').length > 0)
		{
			var removedProductId = null;
			var removedProductData = null;
			var removedProductDomId = null;
			//look for a product to delete...
			$('.cart_block_list:first dl.products dt').each(function(){
				//retrieve idProduct and idCombination from the displayed product in the block cart
				var domIdProduct = $(this).data('id');
				var firstCut = domIdProduct.replace('cart_block_product_', '');
				var ids = firstCut.split('_');

				//try to know if the current product is still in the new list
				var stayInTheCart = false;
				for (aProduct in jsonData.products)
				{
					//we've called the variable aProduct because IE6 bug if this variable is called product
					//if product has attributes
					if (jsonData.products[aProduct]['id'] == ids[0] && (!ids[1] || jsonData.products[aProduct]['idCombination'] == ids[1]))
					{
						stayInTheCart = true;
						// update the product customization display (when the product is still in the cart)
						ajaxCart.hideOldProductCustomizations(jsonData.products[aProduct], domIdProduct);
					}
				}
				//remove product if it's no more in the cart
				if (!stayInTheCart)
				{
					removedProductId = $(this).data('id');
					if (removedProductId != null)
					{
						var firstCut =  removedProductId.replace('cart_block_product_', '');
						var ids = firstCut.split('_');

						$('dt[data-id="' + removedProductId + '"]').addClass('strike').fadeTo('slow', 0, function(){
							$(this).slideUp('slow', function(){
								$(this).remove();
								// If the cart is now empty, show the 'no product in the cart' message and close detail
								if($('.cart_block:first dl.products dt').length == 0)
								{
									$("#header .cart_block").stop(true, true).slideUp(200);
									$('.cart_block_no_products:hidden').slideDown(450);
									$('.cart_block dl.products').remove();
								}
							});
						});
						$('dd[data-id="cart_block_combination_of_' + ids[0] + (ids[1] ? '_'+ids[1] : '') + (ids[2] ? '_'+ids[2] : '') + '"]').fadeTo('fast', 0, function(){
							$(this).slideUp('fast', function(){
								$(this).remove();
							});
						});
					}
				}
			});
		}
	},

	hideOldProductCustomizations : function (product, domIdProduct){
		var customizationList = $('ul[data-id="customization_' + product['id'] + '_' + product['idCombination'] + '"]');
		if(customizationList.length > 0)
		{
			$(customizationList).find("li").each(function(){
				$(this).find("div").each(function(){
					var customizationDiv = $(this).data('id');
					var tmp = customizationDiv.replace('deleteCustomizableProduct_', '');
					var ids = tmp.split('_');
					if ((parseInt(product.idCombination) == parseInt(ids[2])) && !ajaxCart.doesCustomizationStillExist(product, ids[0]))
						$('div[data-id="' + customizationDiv + '"]').parent().addClass('strike').fadeTo('slow', 0, function(){
							$(this).slideUp('slow');
							$(this).remove();
						});
				});
			});
		}

		var removeLinks = $('.deleteCustomizableProduct[data-id="' + domIdProduct + '"]').find('.ajax_cart_block_remove_link');
		if (!product.hasCustomizedDatas && !removeLinks.length)
			$('div[data-id="' + domIdProduct + '"]' + ' span.remove_link').html('<a class="ajax_cart_block_remove_link" rel="nofollow" href="' + baseUri + '?controller=cart&delete=1&id_product=' + product['id'] + '&ipa=' + product['idCombination'] + '&token=' + static_token + '"> </a>');
		if (product.is_gift)
			$('div[data-id="' + domIdProduct + '"]' + ' span.remove_link').html('');
	},

	doesCustomizationStillExist : function (product, customizationId){
		var exists = false;

		$(product.customizedDatas).each(function(){
			if (this.customizationId == customizationId)
			{
				exists = true;
				// This return does not mean that we found nothing but simply break the loop
				return false;
			}
		});
		return (exists);
	},

	//refresh display of vouchers (needed for vouchers in % of the total)
	refreshVouchers : function (jsonData){
		if (typeof(jsonData.discounts) == 'undefined' || jsonData.discounts.length == 0)
			$('.vouchers').hide();
		else
		{
			$('.vouchers tbody').html('');

			for (i=0;i<jsonData.discounts.length;i++)
			{
				if (parseFloat(jsonData.discounts[i].price_float) > 0)
				{
					var delete_link = '';
					if (jsonData.discounts[i].code.length)
						delete_link = '<a class="delete_voucher" href="'+jsonData.discounts[i].link+'" title="'+delete_txt+'"><i class="icon-remove-sign"></i></a>';
					$('.vouchers tbody').append($(
						'<tr class="bloc_cart_voucher" data-id="bloc_cart_voucher_'+jsonData.discounts[i].id+'">'
						+'	<td class="quantity">1x</td>'
						+'	<td class="name" title="'+jsonData.discounts[i].description+'">'+jsonData.discounts[i].name+'</td>'
						+'	<td class="price">-'+jsonData.discounts[i].price+'</td>'
						+'	<td class="delete">' + delete_link + '</td>'
						+'</tr>'
					));
				}
			}
			$('.vouchers').show();
		}

	},

	// Update product quantity
	updateProductQuantity : function (product, quantity){
		$('dt[data-id=cart_block_product_' + product.id + '_' + (product.idCombination ? product.idCombination : '0')+ '_' + (product.idAddressDelivery ? product.idAddressDelivery : '0') + '] .quantity').fadeTo('fast', 0, function(){
			$(this).text(quantity);
			$(this).fadeTo('fast', 1, function(){
				$(this).fadeTo('fast', 0, function(){
					$(this).fadeTo('fast', 1, function(){
						$(this).fadeTo('fast', 0, function(){
							$(this).fadeTo('fast', 1);
						});
					});
				});
			});
		});
	},

	//display the products witch are in json data but not already displayed
	displayNewProducts : function(jsonData){
		//add every new products or update displaying of every updated products
		$(jsonData.products).each(function(){
			//fix ie6 bug (one more item 'undefined' in IE6)
			if (this.id != undefined)
			{
				//create a container for listing the products and hide the 'no product in the cart' message (only if the cart was empty)

				if ($('.cart_block:first dl.products').length == 0)
				{
					$('.cart_block_no_products').before('<dl class="products"></dl>');
					$('.cart_block_no_products').hide();
				}
				//if product is not in the displayed cart, add a new product's line
				var domIdProduct = this.id + '_' + (this.idCombination ? this.idCombination : '0') + '_' + (this.idAddressDelivery ? this.idAddressDelivery : '0');
				var domIdProductAttribute = this.id + '_' + (this.idCombination ? this.idCombination : '0');

				if ($('dt[data-id="cart_block_product_' + domIdProduct + '"]').length == 0)
				{
					var productId = parseInt(this.id);
					var productAttributeId = (this.hasAttributes ? parseInt(this.attributes) : 0);
					var content =  '<dt class="unvisible" data-id="cart_block_product_' + domIdProduct + '">';
					var name = $.trim($('<span />').html(this.name).text());
					name = (name.length > 12 ? name.substring(0, 10) + '...' : name);
					content += '<a class="cart-images" href="' + this.link + '" title="' + name + '"><img  src="' + this.image_cart + '" alt="' + this.name +'"></a>';
					content += '<div class="cart-info"><div class="product-name">' + '<span class="quantity-formated"><span class="quantity">' + this.quantity + '</span> x </span><a href="' + this.link + '" title="' + this.name + '" class="cart_block_product_name">' + name + '</a></div>';
					if (this.hasAttributes)
						  content += '<div class="product-atributes"><a href="' + this.link + '" title="' + this.name + '">' + this.attributes + '</a></div>';
					if (typeof(freeProductTranslation) != 'undefined')
						content += '<span class="price">' + (parseFloat(this.price_float) > 0 ? this.priceByLine : freeProductTranslation) + '</span></div>';

					if (typeof(this.is_gift) == 'undefined' || this.is_gift == 0)
						content += '<span class="remove_link"><a rel="nofollow" class="ajax_cart_block_remove_link" href="' + baseUri + '?controller=cart&delete=1&id_product=' + productId + '&token=' + static_token + (this.hasAttributes ? '&ipa=' + parseInt(this.idCombination) : '') + '"> </a></span>';
					else
						content += '<span class="remove_link"></span>';
					content += '</dt>';
					if (this.hasAttributes)
						content += '<dd data-id="cart_block_combination_of_' + domIdProduct + '" class="unvisible">';
					if (this.hasCustomizedDatas)
						content += ajaxCart.displayNewCustomizedDatas(this);
					if (this.hasAttributes) content += '</dd>';

					$('.cart_block dl.products').append(content);
				}
				//else update the product's line
				else
				{
					var jsonProduct = this;
					if($.trim($('dt[data-id="cart_block_product_' + domIdProduct + '"] .quantity').html()) != jsonProduct.quantity || $.trim($('dt[data-id="cart_block_product_' + domIdProduct + '"] .price').html()) != jsonProduct.priceByLine)
					{
						// Usual product
						if (!this.is_gift)
							$('dt[data-id="cart_block_product_' + domIdProduct + '"] .price').text(jsonProduct.priceByLine);
						else
							$('dt[data-id="cart_block_product_' + domIdProduct + '"] .price').html(freeProductTranslation);
						ajaxCart.updateProductQuantity(jsonProduct, jsonProduct.quantity);

						// Customized product
						if (jsonProduct.hasCustomizedDatas)
						{
							customizationFormatedDatas = ajaxCart.displayNewCustomizedDatas(jsonProduct);
							if (!$('ul[data-id="customization_' + domIdProductAttribute + '"]').length)
							{
								if (jsonProduct.hasAttributes)
									$('dd[data-id="cart_block_combination_of_' + domIdProduct + '"]').append(customizationFormatedDatas);
								else
									$('.cart_block dl.products').append(customizationFormatedDatas);
							}
							else
							{
								$('ul[data-id="customization_' + domIdProductAttribute + '"]').html('');
								$('ul[data-id="customization_' + domIdProductAttribute + '"]').append(customizationFormatedDatas);
							}
						}
					}
				}
				$('.cart_block dl.products .unvisible').slideDown(450).removeClass('unvisible');

			var removeLinks = $('dt[data-id="cart_block_product_' + domIdProduct + '"]').find('a.ajax_cart_block_remove_link');
			if (this.hasCustomizedDatas && removeLinks.length)
				$(removeLinks).each(function(){
					$(this).remove();
				});
			}
		});
	},

	displayNewCustomizedDatas : function(product){
		var content = '';
		var productId = parseInt(product.id);
		var productAttributeId = typeof(product.idCombination) == 'undefined' ? 0 : parseInt(product.idCombination);
		var hasAlreadyCustomizations = $('ul[data-id="customization_' + productId + '_' + productAttributeId + '"]').length;

		if (!hasAlreadyCustomizations)
		{
			if (!product.hasAttributes)
				content += '<dd data-id="cart_block_combination_of_' + productId + '" class="unvisible">';
			if ($('ul[data-id="customization_' + productId + '_' + productAttributeId + '"]').val() == undefined)
				content += '<ul class="cart_block_customizations" data-id="customization_' + productId + '_' + productAttributeId + '">';
		}

		$(product.customizedDatas).each(function(){
			var done = 0;
			customizationId = parseInt(this.customizationId);
			productAttributeId = typeof(product.idCombination) == 'undefined' ? 0 : parseInt(product.idCombination);
			content += '<li name="customization"><div class="deleteCustomizableProduct" data-id="deleteCustomizableProduct_' + customizationId + '_' + productId + '_' + (productAttributeId ?  productAttributeId : '0') + '"><a rel="nofollow" class="ajax_cart_block_remove_link" href="' + baseUri + '?controller=cart&delete=1&id_product=' + productId + '&ipa=' + productAttributeId + '&id_customization=' + customizationId + '&token=' + static_token + '"></a></div>';

			// Give to the customized product the first textfield value as name
			$(this.datas).each(function(){
				if (this['type'] == CUSTOMIZE_TEXTFIELD)
				{
					$(this.datas).each(function(){
						if (this['index'] == 0)
						{
							content += ' ' + this.truncatedValue.replace(/<br \/>/g, ' ');
							done = 1;
							return false;
						}
					})
				}
			});

			// If the customized product did not have any textfield, it will have the customizationId as name
			if (!done)
				content += customizationIdMessage + customizationId;
			if (!hasAlreadyCustomizations) content += '</li>';
			// Field cleaning
			if (customizationId)
			{
				$('#uploadable_files li div.customizationUploadBrowse img').remove();
				$('#text_fields input').attr('value', '');
			}
		});

		if (!hasAlreadyCustomizations)
		{
			content += '</ul>';
			if (!product.hasAttributes) content += '</dd>';
		}
		return (content);
	},

	updateLayer : function(product){
		$('#layer_cart_product_title').text(product.name);
		$('#layer_cart_product_attributes').text('');
		if (product.hasAttributes && product.hasAttributes == true)
			$('#layer_cart_product_attributes').html(product.attributes);
		$('#layer_cart_product_price').text(product.price);
		$('#layer_cart_product_quantity').text(product.quantity);
		$('.layer_cart_img').html('<img class="layer_cart_img img-responsive" src="' + product.image + '" alt="' + product.name + '" title="' + product.name + '" />');

		var n = parseInt($(window).scrollTop()) + 'px';

		$('.layer_cart_overlay').css('width','100%');
		$('.layer_cart_overlay').css('height','100%');
		$('.layer_cart_overlay').show();
		$('#layer_cart').css({'top': n}).fadeIn('fast');
		crossselling_serialScroll();
	},

	//genarally update the display of the cart
	updateCart : function(jsonData){
		//user errors display
		if (jsonData.hasError)
		{
			var errors = '';
			for (error in jsonData.errors)
				//IE6 bug fix
				if (error != 'indexOf')
					errors += $('<div />').html(jsonData.errors[error]).text() + "\n";
			if (!!$.prototype.fancybox)
			    $.fancybox.open([
			        {
			            type: 'inline',
			            autoScale: true,
			            minHeight: 30,
			            content: '<p class="fancybox-error">' + errors + '</p>'
			        }
			    ], {
			        padding: 0
			    });
			else
			    alert(errors);
		}
		else
		{
			ajaxCart.updateCartEverywhere(jsonData);
			ajaxCart.hideOldProducts(jsonData);
			ajaxCart.displayNewProducts(jsonData);
			ajaxCart.refreshVouchers(jsonData);

			//update 'first' and 'last' item classes
			$('.cart_block .products dt').removeClass('first_item').removeClass('last_item').removeClass('item');
			$('.cart_block .products dt:first').addClass('first_item');
			$('.cart_block .products dt:not(:first,:last)').addClass('item');
			$('.cart_block .products dt:last').addClass('last_item');
		}
	},

	//update general cart informations everywhere in the page
	updateCartEverywhere : function(jsonData){
		$('.ajax_cart_total').text($.trim(jsonData.productTotal));

		if (parseFloat(jsonData.shippingCostFloat) > 0)
			$('.ajax_cart_shipping_cost').text(jsonData.shippingCost);
		else if (typeof(freeShippingTranslation) != 'undefined')
				$('.ajax_cart_shipping_cost').html(freeShippingTranslation);

		$('.ajax_cart_tax_cost').text(jsonData.taxCost);
		$('.cart_block_wrapping_cost').text(jsonData.wrappingCost);
		$('.ajax_block_cart_total').text(jsonData.total);
		$('.ajax_block_products_total').text(jsonData.productTotal);
        $('.ajax_total_price_wt').text(jsonData.total_price_wt);

		if (parseFloat(jsonData.freeShippingFloat) > 0)
		{
			$('.ajax_cart_free_shipping').html(jsonData.freeShipping);
			$('.freeshipping').fadeIn(0);
		}
		else if (parseFloat(jsonData.freeShippingFloat) == 0)
			$('.freeshipping').fadeOut(0);

		this.nb_total_products = jsonData.nbTotalProducts;

		if (parseInt(jsonData.nbTotalProducts) > 0)
		{
			$('.ajax_cart_no_product').hide();
			$('.ajax_cart_quantity').text(jsonData.nbTotalProducts);
			$('.ajax_cart_quantity').fadeIn('slow');
			$('.ajax_cart_total').fadeIn('slow');

			if (parseInt(jsonData.nbTotalProducts) > 1)
			{
				$('.ajax_cart_product_txt').each( function (){
					$(this).hide();
				});

				$('.ajax_cart_product_txt_s').each( function (){
					$(this).show();
				});
			}
			else
			{
				$('.ajax_cart_product_txt').each( function (){
					$(this).show();
				});

				$('.ajax_cart_product_txt_s').each( function (){
					$(this).hide();
				});
			}
		}
		else
		{
			$('.ajax_cart_quantity, .ajax_cart_product_txt_s, .ajax_cart_product_txt, .ajax_cart_total').each(function(){
				$(this).hide();
			});
			$('.ajax_cart_no_product').show('slow');
		}
	}
};

function HoverWatcher(selector)
{
	this.hovering = false;
	var self = this;

	this.isHoveringOver = function(){
		return self.hovering;
	}

	$(selector).hover(function(){
		self.hovering = true;
	}, function(){
		self.hovering = false;
	})
}

function crossselling_serialScroll()
{
	if (!!$.prototype.bxSlider)
		$('#blockcart_caroucel').bxSlider({
			minSlides: 2,
			maxSlides: 4,
			slideWidth: 178,
			slideMargin: 20,
			moveSlides: 1,
			infiniteLoop: false,
	  		hideControlOnEnd: true,
			pager: false
		});
}
Link to comment
Share on other sites

that isnt the latest ajax-cart.js file? its a 2014 one.. Mine is 2015

maybe try copying the file from /modules/block-cart/ajax-cart.js and overwrite the one in your "default-bootstrap/js/modules/blockcart"folder.

 

Plus, it still isnt loading.

If you go to menu modules/positions and show just "cart block" is it hooked into both displayHeader and displayTop ?

Edited by MerseyRay (see edit history)
Link to comment
Share on other sites

If you go to menu modules/positions and show just "cart block" is it hooked into both displayHeader and displayTop ?

If it is hooked in both those locations already, I would then do the following.

 

Try resetting the block cart module. Then reposition it in the new hook again.

Failing that, try this:

 

Copy the whole contents of ajax-cart.js ( the one from the root js folder, and paste it into the end of the blocktopmenu.js file.

(Or any other js file that is loaded on every page)

Edited by MerseyRay (see edit history)
Link to comment
Share on other sites

 

that isnt the latest ajax-cart.js file? its a 2014 one.. Mine is 2015

maybe try copying the file from /modules/block-cart/ajax-cart.js and overwrite the one in your "default-bootstrap/js/modules/blockcart"folder.

 

Plus, it still isnt loading.

If you go to menu modules/positions and show just "cart block" is it hooked into both displayHeader and displayTop ?

 

I've copied the new version into the file but still not the result we want.

 

If I put a few items into the cart and refresh the page while viewing the cart, the number is correct.

When I delete items from the cart while viewing it, the number changes and is correct.

When I leave the cart to go to the shopping part of the site, it's not correct anymore.

 

If you go to menu modules/positions and show just "cart block" is it hooked into both displayHeader and displayTop ?

If it is hooked in both those locations already, I would then do the following.

 

Try resetting the block cart module. Then reposition it in the new hook again.

Failing that, try this:

 

Copy the whole contents of ajax-cart.js ( the one from the root js folder, and paste it into the end of the blocktopmenu.js file.

(Or any other js file that is loaded on every page)

The cart is hooked to displayHeader and displayMenubalk (the new hook).

 

I've resetted the cart module. After that, prestashop hooked it to displayTop. On my site this resulted in seeing 2 shopping carts, one in the top menu and one below it. The one below it (I guess that's the one hooked to displayTop) gave the correct numbers. The one in the menu still doesn't.

 

After that I've copied the ajax-cart.js into the blocktopmenu but that made my shopping cart in the top menu disappear...

 

So we can conclude that the cart hooked to displayTop has correct code and is working. The question is how to get that into my top menu...

Link to comment
Share on other sites

  • 6 months later...

hey, im also trying to move the cart block into the horizontal nav menu (the superfish menu). Iv followed this tutorial 6 times now, making sure i had each step correct, the right files etc the last 2 times i deleted my whole prestashop and database, and did a complete new install with a brand new database and fresh install, followed the tutorial checking each stage twice, and when following the tutorial, it will leave me with a completely blank page (after editing blockcart.php). The block cart transplants into the new hook created, but no cart will show up. The only reason i can figure it isnt working for me is due to using prestashaop 1.6.1.4 ?

After the tutorial i got fed up of re-installing, tried moving modules in hooks, and managed to get a cart above the menu, a cart in the very top menu, and a cart below the menu but nothing inside the menu

 

So then like you i started looking into the .js files for answers (as thats where my "inspect tool" leads me... and no luck. Did you have success?

Link to comment
Share on other sites

  • 4 weeks later...

Hey 

 

my wersion presta is 1.5.1.6

I have a problem with adding it to the menu.
Step by step I made that:
 
Add a hooh by hook menager
 
add hook in /themes/your-theme/modules/blocktopmenu/blocktopmenu.tpl
{if $MENU != ''}
	<!-- Menu -->
	<div id="block_top_menu" class="sf-contener clearfix col-lg-12">
		<div class="cat-title">{l s="Menu" mod="blocktopmenu"}</div>
		<ul class="sf-menu clearfix menu-content">
			{$MENU}
			{if $MENU_SEARCH}
				<li class="sf-search noBack" style="float:right">
					<form id="searchbox" action="{$link->getPageLink('search')|escape:'html':'UTF-8'}" method="get">
						<p>
							<input type="hidden" name="controller" value="search" />
							<input type="hidden" value="position" name="orderby"/>
							<input type="hidden" value="desc" name="orderway"/>
							<input type="text" name="search_query" value="{if isset($smarty.get.search_query)}{$smarty.get.search_query|escape:'html':'UTF-8'}{/if}" />
						</p>
					</form>
				</li>
			{/if}
			{Hook :: exec ( 'displayInsideMenu' )}
		</ul>
	</div>
	<!--/ Menu -->
{/if}

naxt add function to /modules/blockcart/blockcart.php

<?php
/*
* 2007-2015 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2015 PrestaShop SA
*  @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

if (!defined('_PS_VERSION_'))
	exit;

class BlockCart extends Module
{
	public function __construct()
	{
		$this->name = 'blockcart';
		$this->tab = 'front_office_features';
		$this->version = '1.6.0';
		$this->author = 'PrestaShop';
		$this->need_instance = 0;

		$this->bootstrap = true;
		parent::__construct();

		$this->displayName = $this->l('Cart block');
		$this->description = $this->l('Adds a block containing the customer\'s shopping cart.');
		$this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
	}

	public function assignContentVars($params)
	{
		global $errors;

		// Set currency
		if ((int)$params['cart']->id_currency && (int)$params['cart']->id_currency != $this->context->currency->id)
			$currency = new Currency((int)$params['cart']->id_currency);
		else
			$currency = $this->context->currency;

		$taxCalculationMethod = Group::getPriceDisplayMethod((int)Group::getCurrent()->id);

		$useTax = !($taxCalculationMethod == PS_TAX_EXC);

		$products = $params['cart']->getProducts(true);
		$nbTotalProducts = 0;
		foreach ($products as $product)
			$nbTotalProducts += (int)$product['cart_quantity'];
		$cart_rules = $params['cart']->getCartRules();

		if (empty($cart_rules))
			$base_shipping = $params['cart']->getOrderTotal($useTax, Cart::ONLY_SHIPPING);
		else
		{
			$base_shipping_with_tax    = $params['cart']->getOrderTotal(true, Cart::ONLY_SHIPPING);
			$base_shipping_without_tax = $params['cart']->getOrderTotal(false, Cart::ONLY_SHIPPING);
			if ($useTax)
				$base_shipping = $base_shipping_with_tax;
			else
				$base_shipping = $base_shipping_without_tax;
		}
		$shipping_cost = Tools::displayPrice($base_shipping, $currency);
		$shipping_cost_float = Tools::convertPrice($base_shipping, $currency);
		$wrappingCost = (float)($params['cart']->getOrderTotal($useTax, Cart::ONLY_WRAPPING));
		$totalToPay = $params['cart']->getOrderTotal($useTax);

		if ($useTax && Configuration::get('PS_TAX_DISPLAY') == 1)
		{
			$totalToPayWithoutTaxes = $params['cart']->getOrderTotal(false);
			$this->smarty->assign('tax_cost', Tools::displayPrice($totalToPay - $totalToPayWithoutTaxes, $currency));
		}

		// The cart content is altered for display
		foreach ($cart_rules as &$cart_rule)
		{
			if ($cart_rule['free_shipping'])
			{
				$shipping_cost = Tools::displayPrice(0, $currency);
				$shipping_cost_float = 0;
				$cart_rule['value_real'] -= Tools::convertPrice($base_shipping_with_tax, $currency);
				$cart_rule['value_tax_exc'] = Tools::convertPrice($base_shipping_without_tax, $currency);
			}
			if ($cart_rule['gift_product'])
			{
				foreach ($products as $key => &$product)
				{
					if ($product['id_product'] == $cart_rule['gift_product']
						&& $product['id_product_attribute'] == $cart_rule['gift_product_attribute'])
					{
						$product['total_wt'] = Tools::ps_round($product['total_wt'] - $product['price_wt'],
							(int)$currency->decimals * _PS_PRICE_DISPLAY_PRECISION_);
						$product['total'] = Tools::ps_round($product['total'] - $product['price'],
							(int)$currency->decimals * _PS_PRICE_DISPLAY_PRECISION_);
						if ($product['cart_quantity'] > 1)
						{
							array_splice($products, $key, 0, array($product));
							$products[$key]['cart_quantity'] = $product['cart_quantity'] - 1;
							$product['cart_quantity'] = 1;
						}
						$product['is_gift'] = 1;
						$cart_rule['value_real'] = Tools::ps_round($cart_rule['value_real'] - $product['price_wt'],
							(int)$currency->decimals * _PS_PRICE_DISPLAY_PRECISION_);
						$cart_rule['value_tax_exc'] = Tools::ps_round($cart_rule['value_tax_exc'] - $product['price'],
							(int)$currency->decimals * _PS_PRICE_DISPLAY_PRECISION_);
					}
				}
			}
		}

		$total_free_shipping = 0;
		if ($free_shipping = Tools::convertPrice(floatval(Configuration::get('PS_SHIPPING_FREE_PRICE')), $currency))
		{
			$total_free_shipping =  floatval($free_shipping - ($params['cart']->getOrderTotal(true, Cart::ONLY_PRODUCTS) +
				$params['cart']->getOrderTotal(true, Cart::ONLY_DISCOUNTS)));
			$discounts = $params['cart']->getCartRules(CartRule::FILTER_ACTION_SHIPPING);
			if ($total_free_shipping < 0)
				$total_free_shipping = 0;
			if (is_array($discounts) && count($discounts))
				$total_free_shipping = 0;
		}

		$this->smarty->assign(array(
			'products' => $products,
			'customizedDatas' => Product::getAllCustomizedDatas((int)($params['cart']->id)),
			'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE,
			'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD,
			'discounts' => $cart_rules,
			'nb_total_products' => (int)($nbTotalProducts),
			'shipping_cost' => $shipping_cost,
			'shipping_cost_float' => $shipping_cost_float,
			'show_wrapping' => $wrappingCost > 0 ? true : false,
			'show_tax' => (int)(Configuration::get('PS_TAX_DISPLAY') == 1 && (int)Configuration::get('PS_TAX')),
			'wrapping_cost' => Tools::displayPrice($wrappingCost, $currency),
			'product_total' => Tools::displayPrice($params['cart']->getOrderTotal($useTax, Cart::BOTH_WITHOUT_SHIPPING), $currency),
			'total' => Tools::displayPrice($totalToPay, $currency),
			'order_process' => Configuration::get('PS_ORDER_PROCESS_TYPE') ? 'order-opc' : 'order',
			'ajax_allowed' => (int)(Configuration::get('PS_BLOCK_CART_AJAX')) == 1 ? true : false,
			'static_token' => Tools::getToken(false),
			'free_shipping' => $total_free_shipping
		));
		if (count($errors))
			$this->smarty->assign('errors', $errors);
		if (isset($this->context->cookie->ajax_blockcart_display))
			$this->smarty->assign('colapseExpandStatus', $this->context->cookie->ajax_blockcart_display);
	}

	public function getContent()
	{
		$output = '';
		if (Tools::isSubmit('submitBlockCart'))
		{
			$ajax = Tools::getValue('PS_BLOCK_CART_AJAX');
			if ($ajax != 0 && $ajax != 1)
				$output .= $this->displayError($this->l('Ajax: Invalid choice.'));
			else
				Configuration::updateValue('PS_BLOCK_CART_AJAX', (int)($ajax));

			if (($productNbr = (int)Tools::getValue('PS_BLOCK_CART_XSELL_LIMIT') < 0))
				$output .= $this->displayError($this->l('Please complete the "Products to display" field.'));
			else
			{
				Configuration::updateValue('PS_BLOCK_CART_XSELL_LIMIT', (int)(Tools::getValue('PS_BLOCK_CART_XSELL_LIMIT')));
				$output .= $this->displayConfirmation($this->l('Settings updated'));
			}

			Configuration::updateValue('PS_BLOCK_CART_SHOW_CROSSSELLING', (int)(Tools::getValue('PS_BLOCK_CART_SHOW_CROSSSELLING')));
		}
		return $output.$this->renderForm();
	}

	public function install()
	{
		if (
			parent::install() == false
			|| $this->registerHook('top') == false
			|| $this->registerHook('header') == false
			|| $this->registerHook('actionCartListOverride') == false
			|| Configuration::updateValue('PS_BLOCK_CART_AJAX', 1) == false
			|| Configuration::updateValue('PS_BLOCK_CART_XSELL_LIMIT', 12) == false
			|| Configuration::updateValue('PS_BLOCK_CART_SHOW_CROSSSELLING', 1) == false)
			return false;
		return true;
	}

	public function hookdisplayInsideMenu($params)
	{
    		if (Configuration::get('PS_CATALOG_MODE'))
       			 return;
 
   		 $this->smarty->assign(array(
        		'order_page' => (strpos($_SERVER['PHP_SELF'], 'order') !== false),
        		'blockcart_top' => (isset($params['blockcart_top']) && $params['blockcart_top']) ? true : false,
    		));
    		$this->assignContentVars($params);
    		return $this->display(__FILE__, 'blockcart-menu.tpl');
	}

	public function hookRightColumn($params)
	{
		if (Configuration::get('PS_CATALOG_MODE'))
			return;

		// @todo this variable seems not used
		$this->smarty->assign(array(
			'order_page' => (strpos($_SERVER['PHP_SELF'], 'order') !== false),
			'blockcart_top' => (isset($params['blockcart_top']) && $params['blockcart_top']) ? true : false,
		));
		$this->assignContentVars($params);
		return $this->display(__FILE__, 'blockcart.tpl');
	}

	public function hookLeftColumn($params)
	{
		return $this->hookRightColumn($params);
	}

	public function hookAjaxCall($params)
	{
		if (Configuration::get('PS_CATALOG_MODE'))
			return;

		$this->assignContentVars($params);
		$res = Tools::jsonDecode($this->display(__FILE__, 'blockcart-json.tpl'), true);

		if (is_array($res) && ($id_product = Tools::getValue('id_product')) && Configuration::get('PS_BLOCK_CART_SHOW_CROSSSELLING'))
		{
			$this->smarty->assign('orderProducts', OrderDetail::getCrossSells($id_product, $this->context->language->id,
				Configuration::get('PS_BLOCK_CART_XSELL_LIMIT')));
			$res['crossSelling'] = $this->display(__FILE__, 'crossselling.tpl');
		}

		$res = Tools::jsonEncode($res);
		return $res;
	}

	public function hookActionCartListOverride($params)
	{
		if (!Configuration::get('PS_BLOCK_CART_AJAX'))
			return;

		$this->assignContentVars(array('cookie' => $this->context->cookie, 'cart' => $this->context->cart));
		$params['json'] = $this->display(__FILE__, 'blockcart-json.tpl');
	}

	public function hookHeader()
	{
		if (Configuration::get('PS_CATALOG_MODE'))
			return;

		$this->context->controller->addCSS(($this->_path).'blockcart.css', 'all');
		if ((int)(Configuration::get('PS_BLOCK_CART_AJAX')))
		{
			$this->context->controller->addJS(($this->_path).'ajax-cart.js');
			$this->context->controller->addJqueryPlugin(array('scrollTo', 'serialScroll', 'bxslider'));
		}
	}

	public function hookTop($params)
	{
		$params['blockcart_top'] = true;
		return $this->hookRightColumn($params);
	}

	public function hookDisplayNav($params)
	{
		$params['blockcart_top'] = true;
		return $this->hookTop($params);
	}

	public function renderForm()
	{
		$fields_form = array(
			'form' => array(
				'legend' => array(
					'title' => $this->l('Settings'),
					'icon' => 'icon-cogs'
				),
				'input' => array(
					array(
						'type' => 'switch',
						'label' => $this->l('Ajax cart'),
						'name' => 'PS_BLOCK_CART_AJAX',
						'is_bool' => true,
						'desc' => $this->l('Activate Ajax mode for the cart (compatible with the default theme).'),
						'values' => array(
								array(
									'id' => 'active_on',
									'value' => 1,
									'label' => $this->l('Enabled')
								),
								array(
									'id' => 'active_off',
									'value' => 0,
									'label' => $this->l('Disabled')
								)
							),
						),
					array(
						'type' => 'switch',
						'label' => $this->l('Show cross-selling'),
						'name' => 'PS_BLOCK_CART_SHOW_CROSSSELLING',
						'is_bool' => true,
						'desc' => $this->l('Activate cross-selling display for the cart.'),
						'values' => array(
								array(
									'id' => 'active_on',
									'value' => 1,
									'label' => $this->l('Enabled')
								),
								array(
									'id' => 'active_off',
									'value' => 0,
									'label' => $this->l('Disabled')
								)
							),
						),
					array(
						'type' => 'text',
						'label' => $this->l('Products to display in cross-selling'),
						'name' => 'PS_BLOCK_CART_XSELL_LIMIT',
						'class' => 'fixed-width-xs',
						'desc' => $this->l('Define the number of products to be displayed in the cross-selling block.')
					),
				),
				'submit' => array(
					'title' => $this->l('Save')
				)
			),
		);

		$helper = new HelperForm();
		$helper->show_toolbar = false;
		$helper->table =  $this->table;
		$lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
		$helper->default_form_language = $lang->id;
		$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
		$this->fields_form = array();

		$helper->identifier = $this->identifier;
		$helper->submit_action = 'submitBlockCart';
		$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab
		.'&module_name='.$this->name;
		$helper->token = Tools::getAdminTokenLite('AdminModules');
		$helper->tpl_vars = array(
			'fields_value' => $this->getConfigFieldsValues(),
			'languages' => $this->context->controller->getLanguages(),
			'id_language' => $this->context->language->id
		);

		return $helper->generateForm(array($fields_form));
	}

	public function getConfigFieldsValues()
	{
		return array(
			'PS_BLOCK_CART_AJAX' => (bool)Tools::getValue('PS_BLOCK_CART_AJAX', Configuration::get('PS_BLOCK_CART_AJAX')),
			'PS_BLOCK_CART_SHOW_CROSSSELLING' => (bool)Tools::getValue('PS_BLOCK_CART_SHOW_CROSSSELLING', Configuration::get('PS_BLOCK_CART_SHOW_CROSSSELLING')),
			'PS_BLOCK_CART_XSELL_LIMIT' => (int)Tools::getValue('PS_BLOCK_CART_XSELL_LIMIT', Configuration::get('PS_BLOCK_CART_XSELL_LIMIT'))
		);
	}
}

next create new file blockcart-menu.tpl in themes/your-theme/modules/blockcart like that:

<li class="pull-right">
<!-- MODULE Block cart -->
{if isset($blockcart_top) && $blockcart_top}
<div class="clearfix{if $PS_CATALOG_MODE} header_user_catalog{/if}">
{/if}
    <div class="shopping_cart" style="padding-top:0px; ">
        <a href="{$link->getPageLink($order_process, true)|escape:'html':'UTF-8'}" title="{l s='View my shopping cart' mod='blockcart'}" rel="nofollow" style="padding-top:14px; padding-bottom:20px;">
            <b>{l s='Cart' mod='blockcart'}</b>
            <span class="ajax_cart_quantity{if $cart_qties == 0} unvisible{/if}">{$cart_qties}</span>
            <span class="ajax_cart_product_txt{if $cart_qties != 1} unvisible{/if}">{l s='Product' mod='blockcart'}</span>
            <span class="ajax_cart_product_txt_s{if $cart_qties < 2} unvisible{/if}">{l s='Products' mod='blockcart'}</span>
            <span class="ajax_cart_total{if $cart_qties == 0} unvisible{/if}">
                {if $cart_qties > 0}
                    {if $priceDisplay == 1}
                        {assign var='blockcart_cart_flag' value='Cart::BOTH_WITHOUT_SHIPPING'|constant}
                        {convertPrice price=$cart->getOrderTotal(false, $blockcart_cart_flag)}
                    {else}
                        {assign var='blockcart_cart_flag' value='Cart::BOTH_WITHOUT_SHIPPING'|constant}
                        {convertPrice price=$cart->getOrderTotal(true, $blockcart_cart_flag)}
                    {/if}
                {/if}
            </span>
            <span class="ajax_cart_no_product{if $cart_qties > 0} unvisible{/if}">{l s='(empty)' mod='blockcart'}</span>
        </a>
        {if !$PS_CATALOG_MODE}
            <div class="cart_block block exclusive" style="margin-top:0px; top:0px;">
                <div class="block_content">
                    <!-- block list of products -->
                    <div class="cart_block_list{if isset($blockcart_top) && !$blockcart_top}{if isset($colapseExpandStatus) && $colapseExpandStatus eq 'expanded' || !$ajax_allowed || !isset($colapseExpandStatus)} expanded{else} collapsed unvisible{/if}{/if}">
                        {if $products}
                            <dl class="products">
                                {foreach from=$products item='product' name='myLoop'}
                                    {assign var='productId' value=$product.id_product}
                                    {assign var='productAttributeId' value=$product.id_product_attribute}
                                    <dt data-id="cart_block_product_{$product.id_product|intval}_{if $product.id_product_attribute}{$product.id_product_attribute|intval}{else}0{/if}_{if $product.id_address_delivery}{$product.id_address_delivery|intval}{else}0{/if}" class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}">
                                        <a class="cart-images" href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category)|escape:'html':'UTF-8'}" title="{$product.name|escape:'html':'UTF-8'}"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'cart_default')}" alt="{$product.name|escape:'html':'UTF-8'}" /></a>
                                        <div class="cart-info">
                                            <div class="product-name">
                                                <span class="quantity-formated"><span class="quantity">{$product.cart_quantity}</span> x </span><a class="cart_block_product_name" href="{$link->getProductLink($product, $product.link_rewrite, $product.category, null, null, $product.id_shop, $product.id_product_attribute)|escape:'html':'UTF-8'}" title="{$product.name|escape:'html':'UTF-8'}">{$product.name|truncate:13:'...'|escape:'html':'UTF-8'}</a>
                                            </div>
                                            {if isset($product.attributes_small)}
                                                <div class="product-atributes">
                                                    <a href="{$link->getProductLink($product, $product.link_rewrite, $product.category, null, null, $product.id_shop, $product.id_product_attribute)|escape:'html':'UTF-8'}" title="{l s='Product detail' mod='blockcart'}">{$product.attributes_small}</a>
                                                </div>
                                            {/if}
                                            <span class="price">
                                                {if !isset($product.is_gift) || !$product.is_gift}
                                                    {if $priceDisplay == $smarty.const.PS_TAX_EXC}{displayWtPrice p="`$product.total`"}{else}{displayWtPrice p="`$product.total_wt`"}{/if}
                                                    <div class="hookDisplayProductPriceBlock-price">
                                                        {hook h="displayProductPriceBlock" product=$product type="price" from="blockcart"}
                                                    </div>
                                                {else}
                                                    {l s='Free!' mod='blockcart'}
                                                {/if}
                                            </span>
                                        </div>
                                        <span class="remove_link">
                                            {if !isset($customizedDatas.$productId.$productAttributeId) && (!isset($product.is_gift) || !$product.is_gift)}
                                                <a class="ajax_cart_block_remove_link" href="{$link->getPageLink('cart', true, NULL, "delete=1&id_product={$product.id_product|intval}&ipa={$product.id_product_attribute|intval}&id_address_delivery={$product.id_address_delivery|intval}&token={$static_token}")|escape:'html':'UTF-8'}" rel="nofollow" title="{l s='remove this product from my cart' mod='blockcart'}"> </a>
                                            {/if}
                                        </span>
                                    </dt>
                                    {if isset($product.attributes_small)}
                                        <dd data-id="cart_block_combination_of_{$product.id_product|intval}{if $product.id_product_attribute}_{$product.id_product_attribute|intval}{/if}_{$product.id_address_delivery|intval}" class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}">
                                    {/if}
                                    <!-- Customizable datas -->
                                    {if isset($customizedDatas.$productId.$productAttributeId[$product.id_address_delivery])}
                                        {if !isset($product.attributes_small)}
                                            <dd data-id="cart_block_combination_of_{$product.id_product|intval}_{if $product.id_product_attribute}{$product.id_product_attribute|intval}{else}0{/if}_{if $product.id_address_delivery}{$product.id_address_delivery|intval}{else}0{/if}" class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}">
                                        {/if}
                                        <ul class="cart_block_customizations" data-id="customization_{$productId}_{$productAttributeId}">
                                            {foreach from=$customizedDatas.$productId.$productAttributeId[$product.id_address_delivery] key='id_customization' item='customization' name='customizations'}
                                                <li name="customization">
                                                    <div data-id="deleteCustomizableProduct_{$id_customization|intval}_{$product.id_product|intval}_{$product.id_product_attribute|intval}_{$product.id_address_delivery|intval}" class="deleteCustomizableProduct">
                                                        <a class="ajax_cart_block_remove_link" href="{$link->getPageLink('cart', true, NULL, "delete=1&id_product={$product.id_product|intval}&ipa={$product.id_product_attribute|intval}&id_customization={$id_customization|intval}&token={$static_token}")|escape:'html':'UTF-8'}" rel="nofollow"> </a>
                                                    </div>
                                                    {if isset($customization.datas.$CUSTOMIZE_TEXTFIELD.0)}
                                                        {$customization.datas.$CUSTOMIZE_TEXTFIELD.0.value|replace:"<br />":" "|truncate:28:'...'|escape:'html':'UTF-8'}
                                                    {else}
                                                        {l s='Customization #%d:' sprintf=$id_customization|intval mod='blockcart'}
                                                    {/if}
                                                </li>
                                            {/foreach}
                                        </ul>
                                        {if !isset($product.attributes_small)}</dd>{/if}
                                    {/if}
                                    {if isset($product.attributes_small)}</dd>{/if}
                                {/foreach}
                            </dl>
                        {/if}
                        <p class="cart_block_no_products{if $products} unvisible{/if}">
                            {l s='No products' mod='blockcart'}
                        </p>
                        {if $discounts|@count > 0}
                            <table class="vouchers{if $discounts|@count == 0} unvisible{/if}">
                                {foreach from=$discounts item=discount}
                                    {if $discount.value_real > 0}
                                        <tr class="bloc_cart_voucher" data-id="bloc_cart_voucher_{$discount.id_discount|intval}">
                                            <td class="quantity">1x</td>
                                            <td class="name" title="{$discount.description}">
                                                {$discount.name|truncate:18:'...'|escape:'html':'UTF-8'}
                                            </td>
                                            <td class="price">
                                                -{if $priceDisplay == 1}{convertPrice price=$discount.value_tax_exc}{else}{convertPrice price=$discount.value_real}{/if}
                                            </td>
                                            <td class="delete">
                                                {if strlen($discount.code)}
                                                    <a class="delete_voucher" href="{$link->getPageLink("$order_process", true)}?deleteDiscount={$discount.id_discount|intval}" title="{l s='Delete' mod='blockcart'}" rel="nofollow">
                                                        <i class="icon-remove-sign"></i>
                                                    </a>
                                                {/if}
                                            </td>
                                        </tr>
                                    {/if}
                                {/foreach}
                            </table>
                        {/if}
                        {assign var='free_ship' value=count($cart->getDeliveryAddressesWithoutCarriers(true, $errors))}
                        <div class="cart-prices">
                            <div class="cart-prices-line first-line">
                                <span class="price cart_block_shipping_cost ajax_cart_shipping_cost{if !($page_name == 'order-opc') && $shipping_cost_float == 0 && (!$cart_qties || $cart->isVirtualCart() || !isset($cart->id_address_delivery) || !$cart->id_address_delivery || $free_ship)} unvisible{/if}">
                                    {if $shipping_cost_float == 0}
                                         {if !($page_name == 'order-opc') && (!isset($cart->id_address_delivery) || !$cart->id_address_delivery)}{l s='To be determined' mod='blockcart'}{else}{l s='Free shipping!' mod='blockcart'}{/if}
                                    {else}
                                        {$shipping_cost}
                                    {/if}
                                </span>
                                <span{if !($page_name == 'order-opc') && $shipping_cost_float == 0 && (!$cart_qties || $cart->isVirtualCart() || !isset($cart->id_address_delivery) || !$cart->id_address_delivery || $free_ship)} class="unvisible"{/if}>
                                    {l s='Shipping' mod='blockcart'}
                                </span>
                            </div>
                            {if $show_wrapping}
                                <div class="cart-prices-line">
                                    {assign var='cart_flag' value='Cart::ONLY_WRAPPING'|constant}
                                    <span class="price cart_block_wrapping_cost">
                                        {if $priceDisplay == 1}
                                            {convertPrice price=$cart->getOrderTotal(false, $cart_flag)}{else}{convertPrice price=$cart->getOrderTotal(true, $cart_flag)}
                                        {/if}
                                    </span>
                                    <span>
                                        {l s='Wrapping' mod='blockcart'}
                                    </span>
                               </div>
                            {/if}
                            {if $show_tax && isset($tax_cost)}
                                <div class="cart-prices-line">
                                    <span class="price cart_block_tax_cost ajax_cart_tax_cost">{$tax_cost}</span>
                                    <span>{l s='Tax' mod='blockcart'}</span>
                                </div>
                            {/if}
                            <div class="cart-prices-line last-line">
                                <span class="price cart_block_total ajax_block_cart_total">{$total}</span>
                                <span>{l s='Total' mod='blockcart'}</span>
                            </div>
                            {if $use_taxes && $display_tax_label && $show_tax}
                                <p>
                                {if $priceDisplay == 0}
                                    {l s='Prices are tax included' mod='blockcart'}
                                {elseif $priceDisplay == 1}
                                    {l s='Prices are tax excluded' mod='blockcart'}
                                {/if}
                                </p>
                            {/if}
                        </div>
                        <p class="cart-buttons">
                            <a id="button_order_cart" class="btn btn-default button button-small" href="{$link->getPageLink("$order_process", true)|escape:"html":"UTF-8"}" title="{l s='Check out' mod='blockcart'}" rel="nofollow">
                                <span>
                                    {l s='Check out' mod='blockcart'}<i class="icon-chevron-right right"></i>
                                </span>
                            </a>
                        </p>
                    </div>
                </div>
            </div><!-- .cart_block -->
        {/if}
    </div>
{if isset($blockcart_top) && $blockcart_top}
</div>
{/if}
{counter name=active_overlay assign=active_overlay}
{if !$PS_CATALOG_MODE && $active_overlay == 1}
    <div id="layer_cart">
        <div class="clearfix">
            <div class="layer_cart_product col-xs-12 col-md-6">
                <span class="cross" title="{l s='Close window' mod='blockcart'}"></span>
                <h2>
                    <i class="icon-check"></i>{l s='Product successfully added to your shopping cart' mod='blockcart'}
                </h2>
                <div class="product-image-container layer_cart_img">
                </div>
                <div class="layer_cart_product_info">
                    <span id="layer_cart_product_title" class="product-name"></span>
                    <span id="layer_cart_product_attributes"></span>
                    <div>
                        <strong class="dark">{l s='Quantity' mod='blockcart'}</strong>
                        <span id="layer_cart_product_quantity"></span>
                    </div>
                    <div>
                        <strong class="dark">{l s='Total' mod='blockcart'}</strong>
                        <span id="layer_cart_product_price"></span>
                    </div>
                </div>
            </div>
            <div class="layer_cart_cart col-xs-12 col-md-6">
                <h2>
                    <!-- Plural Case [both cases are needed because page may be updated in Javascript] -->
                    <span class="ajax_cart_product_txt_s {if $cart_qties < 2} unvisible{/if}">
                        {l s='There are [1]%d[/1] items in your cart.' mod='blockcart' sprintf=[$cart_qties] tags=['<span class="ajax_cart_quantity">']}
                    </span>
                    <!-- Singular Case [both cases are needed because page may be updated in Javascript] -->
                    <span class="ajax_cart_product_txt {if $cart_qties > 1} unvisible{/if}">
                        {l s='There is 1 item in your cart.' mod='blockcart'}
                    </span>
                </h2>
 
                <div class="layer_cart_row">
                    <strong class="dark">
                        {l s='Total products' mod='blockcart'}
                        {if $use_taxes && $display_tax_label && $show_tax}
                            {if $priceDisplay == 1}
                                {l s='(tax excl.)' mod='blockcart'}
                            {else}
                                {l s='(tax incl.)' mod='blockcart'}
                            {/if}
                        {/if}
                    </strong>
                    <span class="ajax_block_products_total">
                        {if $cart_qties > 0}
                            {convertPrice price=$cart->getOrderTotal(false, Cart::ONLY_PRODUCTS)}
                        {/if}
                    </span>
                </div>
 
                {if $show_wrapping}
                    <div class="layer_cart_row">
                        <strong class="dark">
                            {l s='Wrapping' mod='blockcart'}
                            {if $use_taxes && $display_tax_label && $show_tax}
                                {if $priceDisplay == 1}
                                    {l s='(tax excl.)' mod='blockcart'}
                                {else}
                                    {l s='(tax incl.)' mod='blockcart'}
                                {/if}
                            {/if}
                        </strong>
                        <span class="price cart_block_wrapping_cost">
                            {if $priceDisplay == 1}
                                {convertPrice price=$cart->getOrderTotal(false, Cart::ONLY_WRAPPING)}
                            {else}
                                {convertPrice price=$cart->getOrderTotal(true, Cart::ONLY_WRAPPING)}
                            {/if}
                        </span>
                    </div>
                {/if}
                <div class="layer_cart_row">
                    <strong class="dark{if $shipping_cost_float == 0 && (!$cart_qties || $cart->isVirtualCart() || !isset($cart->id_address_delivery) || !$cart->id_address_delivery)} unvisible{/if}">
                        {l s='Total shipping' mod='blockcart'} {if $use_taxes && $display_tax_label && $show_tax}{if $priceDisplay == 1}{l s='(tax excl.)' mod='blockcart'}{else}{l s='(tax incl.)' mod='blockcart'}{/if}{/if}
                    </strong>
                    <span class="ajax_cart_shipping_cost{if $shipping_cost_float == 0 && (!$cart_qties || $cart->isVirtualCart() || !isset($cart->id_address_delivery) || !$cart->id_address_delivery)} unvisible{/if}">
                        {if $shipping_cost_float == 0}
                             {if (!isset($cart->id_address_delivery) || !$cart->id_address_delivery)}{l s='To be determined' mod='blockcart'}{else}{l s='Free shipping!' mod='blockcart'}{/if}
                        {else}
                            {$shipping_cost}
                        {/if}
                    </span>
                </div>
                {if $show_tax && isset($tax_cost)}
                    <div class="layer_cart_row">
                        <strong class="dark">{l s='Tax' mod='blockcart'}</strong>
                        <span class="price cart_block_tax_cost ajax_cart_tax_cost">{$tax_cost}</span>
                    </div>
                {/if}
                <div class="layer_cart_row">
                    <strong class="dark">
                        {l s='Total' mod='blockcart'}
                        {if $use_taxes && $display_tax_label && $show_tax}
                            {if $priceDisplay == 1}
                                {l s='(tax excl.)' mod='blockcart'}
                            {else}
                                {l s='(tax incl.)' mod='blockcart'}
                            {/if}
                        {/if}
                    </strong>
                    <span class="ajax_block_cart_total">
                        {if $cart_qties > 0}
                            {if $priceDisplay == 1}
                                {convertPrice price=$cart->getOrderTotal(false)}
                            {else}
                                {convertPrice price=$cart->getOrderTotal(true)}
                            {/if}
                        {/if}
                    </span>
                </div>
                <div class="button-container">
                    <span class="continue btn btn-default button exclusive-medium" title="{l s='Continue shopping' mod='blockcart'}">
                        <span>
                            <i class="icon-chevron-left left"></i>{l s='Continue shopping' mod='blockcart'}
                        </span>
                    </span>
                    <a class="btn btn-default button button-medium"  href="{$link->getPageLink("$order_process", true)|escape:"html":"UTF-8"}" title="{l s='Proceed to checkout' mod='blockcart'}" rel="nofollow">
                        <span>
                            {l s='Proceed to checkout' mod='blockcart'}<i class="icon-chevron-right right"></i>
                        </span>
                    </a>
                </div>
            </div>
        </div>
        <div class="crossseling"></div>
    </div> <!-- #layer_cart -->
    <div class="layer_cart_overlay"></div>
{/if}
{strip}
{addJsDef CUSTOMIZE_TEXTFIELD=$CUSTOMIZE_TEXTFIELD}
{addJsDef img_dir=$img_dir|escape:'quotes':'UTF-8'}
{addJsDef generated_date=$smarty.now|intval}
{addJsDef ajax_allowed=$ajax_allowed|boolval}
{addJsDef hasDeliveryAddress=(isset($cart->id_address_delivery) && $cart->id_address_delivery)}
 
{addJsDefL name=customizationIdMessage}{l s='Customization #' mod='blockcart' js=1}{/addJsDefL}
{addJsDefL name=removingLinkText}{l s='remove this product from my cart' mod='blockcart' js=1}{/addJsDefL}
{addJsDefL name=freeShippingTranslation}{l s='Free shipping!' mod='blockcart' js=1}{/addJsDefL}
{addJsDefL name=freeProductTranslation}{l s='Free!' mod='blockcart' js=1}{/addJsDefL}
{addJsDefL name=delete_txt}{l s='Delete' mod='blockcart' js=1}{/addJsDefL}
{addJsDefL name=toBeDetermined}{l s='To be determined' mod='blockcart' js=1}{/addJsDefL}
{/strip}
<!-- /MODULE Block cart -->
</li>

Next I added cart to new hook in my admin site.  (cart have only 2 hooks-header and this new)

 

What can I do to make it works? 

 

Please help me. Thanks

Link to comment
Share on other sites

Is the problem that people are facing nothing to do with the fact the ajax-cart.js contains references to #header #cart_block ?

If the #cart_block has been moved inside a different div then will all references to #header need to be changed ?

Link to comment
Share on other sites

  • 5 months later...
  • 4 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...