Ostatnio zostałem zainspirowany problemem dotyczącym rabatów w sklepach opartych o komponent VirtuMart + Joomla!. Problem dotyczył rabatów na całość zamówienia. Otóż VirtueMart oferuje różnego rodzaju rabaty, np. w zależności od wybranej formy płatności czy też kupony dla klientów. Niestety nie mamy możliwości skonfigurować rabatów w zależności od wartości zamówienia, tak żeby pojawiał się on od razu w koszyku, po przekroczeniu pewnej kwoty.

Postanowiłem poszukać szybkiego rozwiązania. Od razu przyszła mi na myśl to modyfikacja kodu źródłowego prezentującego koszyk oraz podgląd zamówienia. Niestety rozwiązanie nie jest aż tak proste jakby się wydawało i potrzeba trochę czasu aby dokonać modyfikacji. Niniejszy artykuł zostanie podzielany na dwie części. W pierwszej z nich dowiesz się jak zmodyfikować kod, aby rabat był widoczny w koszyku. W drugiej, opowiem w jaki sposób przenieść go do podglądu zamówienia.

Na wstępie przedstawię sam mechanizm działania skryptu. W pierwszej kolejności będziemy musieli ustalić rabaty w zależności od kwoty zamówienia. Rabaty będą zamieszczone w tablicy asocjacyjnej:

$rabaty = new array("cena_start-cena_koniec"=>"rabat_w_procentach”");

Przykładową tablicą rabatów może być:

$rabaty = new array("300-799" =>5, "800-100000000"=>10);

Powyższa tablica mówi, że klient przy zamówieniu powyżej 300zł otrzyma rabat 5% na całą wartość zamówienia. Natomiast po przekroczeniu 800zł, rabat ten będzie wynosił 10%.

W pierwszym etapie będziemy modyfikować 2 pliki po stronie back end:

/administrator/components/com_virtuemart/html/basket.php
/administrator/components/com_virtuemart/html/ro_basekt.php

Oraz wszystkie pliki templatki koszyka (te, z których korzystamy), które znajdują się w katalogu:

/components/com_virtuemart/themes/TWOJ_SZABLON/templates/basekt/

Gdzie TWOJ SZABLON to nazwa szablonu VirtueMart.

Otwórzmy zatem pierwszy plik i przejdźmy od razu do linijki ok. 265, w której obliczana jest końcowa kwota koszyka $order_total:

$order_total += $shipping_total + $total;
$total_undiscounted += $shipping_total;

Tuż za powyższym kodem możemy dodać omawianą modyfikację. Poniżej przedstawiam jej kod:

// * Rabat
$rabat = array('100-200'=>'5','201-400'=>'10','401-10000000000'=>'15');
$do_rabat = 0;
foreach ($rabat as $pr=>$rr){
    $pr = explode("-",$pr);
    // sprawdź czy mieści się w przedziale
    if(($order_total)>=intval($pr[0]) && ($order_total)<=intval($pr[1])){
    // jeśli tak to przypisz rabat
        $do_rabat = intval($rr);
    }
}
// jeśli jest rabat to zmień cenę końcową
if ($do_rabat>0){
    $rabat_order_total = $order_total - ($order_total*($do_rabat/100));
    $rabat_total_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($rabat_order_total);
}

// * End Rabat

Jak widać w pierwszej linijce została zadeklarowana tablica $rabat, która przechowuje widełki kwot objętych rabatem. Następnie, każdy element tablicy rozbijany jest na nazwę komórki oraz jej wartość ($pr=>$rr). Nazwa komórki ($pr) jest rozdzielana na dwie wartości funkcją explode. W ten sposób otrzymujemy dwie wartości –górną oraz dolną, w obrębie których będzie aktywny rabat $rr. W pętli foreach, dla każdej wartości tablicy zostaje postawiony warunek, czy obecna kwota koszyka mieści się pomiędzy widełkami rabatów. Jeśli tak, rabat jest zapisywany do zmiennej.

if(($order_total)>=intval($pr[0]) && ($order_total)<=intval($pr[1])){
    // jeśli tak to przypisz rabat
    $do_rabat = intval($rr);
}

W kolejnych linijkach uwzględniamy rabat w cenie końcowej koszyka. Podsumowując, uzyskaliśmy następujące dane:

$do_rabat – przechowuje wartość rabatu
$rabat_order_total – przechowuje kwotę koszyka po uwzględnieniu rabat
$rabat_total_display – jest to wartość $rabat_order_total przekonwertowana na walutę używaną w sklepie.

Teraz należy powyższe dane przenieść do templatki koszyka. W tym celu udajemy się do dalszych linijek kodu, gdzie znajdziemy poniższą metodę:

$tpl->set_vars( Array(
'product_rows' => $product_rows,
'subtotal_display' => $subtotal_display,
'discount_word' => $discount_word,
'payment_discount_before' => $payment_discount_before,
'payment_discount_after' => $payment_discount_after,
'payment_discount_display' => $payment_discount_display,
'coupon_discount_before' => $coupon_discount_before,
'coupon_discount_after' => $coupon_discount_after,
'coupon_display' => $coupon_display,
'shipping' => $shipping,
'shipping_display' => $shipping_display,
'tax' => $tax,
'tax_display' => $tax_display,
'order_total_display' => $order_total_display,
));

Na samym końcu kodu, dodajemy nowe zmienneKońcówka tabeli po modyfikacji powinna wyglądać następująco:

'tax_display' => $tax_display,
'order_total_display' => $order_total_display,
'do_rabat' => $do_rabat,
'rabat_total_display' => $rabat_total_display
));

Te same czynności musimy zastosować do pliku ro_basket.php. Tutaj kod, od którego zaczynamy znajduje się w linijce ok. 250.

Skoro zmienne zostały już przekazane do szablonu, nie pozostaje nam nic innego, jak wyświetlić rabat w koszyku, jeśli jest dostępny. Otwieramy zatem pliki szablonowe koszyka i wciskamy kod, gdzie jest nam najwygodniej. Ja dodałem go praktycznie na samym końcu, po podsumowaniu koszyka. Wg mnie w tym miejscu najlepiej widać ile wynosi rabat oraz ile trzeba zapłacić po jego uwzględnieniu.
Przykładowy kod może wyglądać następująco:

<?php
// Rabat start
if( $do_rabat>0 ) { ?>
<tr>
    <td colspan="4" align="right">
        Rabat:
    </td>
    <td colspan="3" align="right"><?php echo $do_rabat?>%</td>
</tr>
<tr>
    <td colspan="4" align="right">
        Cena po rabacie:
    </td>
    <td colspan="3" align="right"><?php echo $rabat_total_display; ?></td>
</tr>
<?php }
// Rabat end
?>

W pierwszych linijkach sprawdzany jest warunek, czy został przypisany jakiś rabat. Jeśli tak, pojawia się informacja ile procent on wynosi oraz jaka jest ostateczna kwota do zapłaty po jego uwzględnieniu.
Na przykładowej stronie wygląda to następująco:

W kolejnej części opowiem w jaki sposób zapisać rabat do zamówienia oraz jak przedstawić go na podglądzie zamówienia.

Poniżej załączam paczkę zmodyfikowanych plików, by można było porównać je ze swoją pracą.
Pobierz plik