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:

/*
* Suoritetaan lisääminen ostoslomakkeen lähetyspainikkeen
* klikkauksella.
*/
$(".BuyForm .AddToCart").on("click", function(event) {
	event.preventDefault();

	/*
	* Otetaan talteen ostolomake
	*/
	var $form = $(this).closest(".BuyForm");

	/*
	* Lähetetään POST-pyyntö
	*/
	$.ajax({
		type: "POST",
		url: "/cart",

		/*
		* Käytetään serializeObject()-funktiota muotoilemaan data
		* palvelimella luettavaan muotoon.
		*/
		data: $form.serializeObject(),
		success: function() {

			/*
			* Lopuksi päivitetään ostoskori tuotteen lisäämisen jälkeen
			*/
			$.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();

	/*
	Ensin otetaan talteen klikattu linkki ja sen ympärillä oleva tuote-elementti
	*/
	var $link = $(event.currentTarget);
	var $product = $link.closest('.Product');

	/*
	* Tuote-elementin luokkanimien perusteella nähdään, onko sillä variaatioita, räätälöintejä tai ladattavia tiedostoja.
	*
	* Jos niitä on, ohjataan kävijä tuotesivulle tekemään tarvittavat valinnat, jotta tuotteen voi lisätä ostoskoriin.
	*/
	if ($product.hasClass('ProductVariations') || $product.hasClass('ProductTailorings') || $product.hasClass('ProductDownloads')) {
		window.location.href = $link.attr('href');
	}

	/*
	* Muuten lisätään tuote suoraan listalta ostoskoriin.
	*/
	else {

		// Poimitaan tuotteen ID linkin osoitteesta
		productID = $link.attr('href').split('/')[2];

		// Lähetetään POST-pyyntö, jolla tuote lisätään ostoskoriin.
		$.ajax({
			type: "POST",
			url: "/cart",

			/*
			* Pyynnön sisältönä lähetetään JSON-objekti, jossa tarvitaan vain
			* tuotteen ID.
			*/
			data: { products: [{ product_id: productID }] },
			success: function() {

				/*
				* Onnistuneen pyynnön jälkeen päivitetään ostoskori.
				*/
				$(".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: