MyCashflow'ssa voit lisätä tuotteita ostoskoriin AJAX-kutsujen avulla. Tässä artikkelissa käydään läpi tuotteiden lisääminen ostoskoriin tuotesivulta ja suoraan tuotelistoilta.

Johdanto

Tuotteen ostotyökalut tulostetaan tuotelistoilla {ProductAddToCart}-tagilla ja tuotesivulla {ProductBuy}-tagilla. Nämä tagit tuottavat erilaisen HTML-merkkauksen, joten lisääminen ostoskoriin JavaScriptin avulla tapahtuu molemmilla eri tavalla.

Tässä artikkelissa käydään läpi tuotteiden lisääminen ostoskoriin sekä tuotelistoilta että tuotesivulta. Mukana on JavaScript-esimerkki molemmista tapauksista, jonka voit halutessasi kopioida omaan teemaasi ja muokata sitä tarpeeseen sopivaksi.

Molemmissa tämän artikkelin esimerkeissä sivulla on myös ostoskorin esikatselu, jossa käytetään {MiniCart}-tagia:

<div class="MiniCartContainer">
    {MiniCart}
</div>

Tämä on sisällytetty esimerkkeihin, koska ostoskorin esikatselu on hyvä päivittää ilman erillistä sivunlatausta aina, kun tuotteita lisätään ostoskoriin AJAX-pyynnöillä.

Tuotteiden lisääminen oletusteemassa

MyCashflow'n oletusteemassa tuotteiden lisääminen ostoskoriin on valmiiksi toteutettu AJAX-toiminnolla.

Lisääminen tuotesivulta

Ohessa näet malliksi {ProductBuy}-ostolomakkeen HTML-koodin:

<form action="/cart/" enctype="multipart/form-data" method="post" class="BuyForm">
    <fieldset>
        <input type="hidden" name="products[0395][product_id]" value="29" class="HiddenInput">
        <div class="FormItem BuyFormQuantity">
            <label for="BuyFormQuantity-0395">Quantity:</label>
            <input type="number" id="BuyFormQuantity-0395" name="products[0395][quantity]" size="3" min="0" value="1">
        </div>
        <div class="FormItem FormSubmit">
            <button type="submit" class="SubmitButton AddToCart"><span>Add to cart</span></button>
        </div>
    </fieldset>
</form>

Esimerkissä käytetään serializeObject()-funktiota muuntamaan lomake muotoon, joka voidaan käsitellä palvelimella. Voit kopioida funktion omiin skripteihisi alta:

$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
    	if (o[this.name]) {
    		if (!o[this.name].push) {
    			o[this.name] = [o[this.name]];
    		}
    		o[this.name].push(this.value || '');
    	} else {
    		o[this.name] = this.value || '';
    	}
    });
    return o;
};

Lähetä tuotteeen ostolomake POST-pyynnöllä palvelimelle. Voit käyttää tähän esim. jQueryn ajax()-funktiota:

/*
* Adding is performed by clicking
* the submit button on the purchase form.
*/
$(".BuyForm .AddToCart").on("click", function(event) {
	event.preventDefault();

	/*
	* The purchase form is saved
	*/
	var $form = $(this).closest(".BuyForm");

	/*
	* A POST request is sent
	*/
	$.ajax({
		type: "POST",
		url: "/cart",

		/*
		* The serializeObject function is used to format the data on the server
		* into processable form.
		*/
		data: $form.serializeObject(),
		success: function() {

			/*
			* Finally, the shopping cart is updated after the product has been added.
			*/
			$.ajax({
				type: "GET",
				url: "/interface/MiniCart",
				success: function(data) {
					$(".MiniCartContainer").html(data);
				}
			});
		}
	});
});

ajax()-funktion settings-parametrissä voitaisiin määrittää callback-funktio myös epäonnistuneen pyynnön varalle. beforeSend-attribuutissa taas voitaisiin tarvittaessa validoida lomakkeen arvoja.

Lisääminen tuotelistoilta

Tuotteiden lisääminen ostoskoriin JavaScriptillä suoraan tuotelistoilta toimii eri logiikan mukaan, koska listoilla käytettävä {ProductAddToCart} ei tulosta lomaketta, vaan pelkän linkin, joka ohjaa tuotesivulle:

<a href="/product/29/pants" title="Add to cart" class="Button AddToCart">
    <span>Add to cart</span>
</a>

Jotta tuote voidaan lisätä ostoskoriin suoraan tuotelistalta, tuotteen ID-numero on poimittava linkin kohdeosoitteesta. Tämän jälkeen tuote voidaan lisätä sen ID:n perusteella ostoskoriin:

/*
* Adding products from lists
*/
$(".Product .AddToCart").on("click", function(event) {
	event.preventDefault();

	/*
	* First, the clicked link and the product element around it are saved
	*/
	var $link = $(event.currentTarget);
	var $product = $link.closest('.Product');

	/*
	* Based on the class name of the product element, you can see whether it has variations, customizations, or downloadable files.
	*
	* If so, the visitor is directed to the product page to make the necessary choices to add the product to the shopping cart.
	*/
	if ($product.hasClass('ProductVariations') || $product.hasClass('ProductTailorings') || $product.hasClass('ProductDownloads')) {
		window.location.href = $link.attr('href');
	}

	/*
	* Otherwise, the product is added directly from the list to the shopping cart.
	*/
	else {

		// The productID is extracted from the link
		productID = $link.attr('href').split('/')[2];

		// A POST request to add the product to the shopping cart is sent.
		$.ajax({
			type: "POST",
			url: "/cart",

			/*
			* A JSON object is sent as the request's content, where only the
			* product ID is needed.
			*/
			data: { products: [{ product_id: productID }] },
			success: function() {

				/*
				* After a successful request, the shopping cart is updated.
				*/
				$(".MiniCartContainer").empty();
				$.ajax({
					type: "GET",
					url: "/interface/MiniCart",
					success: function(data) {

						$(".MiniCartContainer").html(data);
					}
				});
			}
		});
	}
});

Voit tehdä useimmat ostamiseen liittyvät toiminnot asynkronisilla JavaScript-kutsuilla. Lue myös seuraavat asynkronisia toimintoja käsittelevät artikkelit: