Eshop rozšíření Virtuemart zná asi většina z vás. Pro Virtuemart je k dispozici nespočet dalších rozšíření a šablon. Následující vychytávku si ale můžete vyzkoušet přidat sami, tedy pokud znáte alespoň minimální základy PHP a JS a umíte pracovat se soubory pomocí FTP.
Jistě znáte z různých eshopů, že se v modulu košíku zobrazuje informace, za kolik ještě musíte nakoupit, aby jste měli dopravu zdarma nebo dostali dárek atd. Virtuemart v košíku tuto funkci nemá a ani nevím, zda na to existuje nějaké rozšíření. Na následujícíh řádcích si popíšeme, jak košík ve Virtuemart o tuto funkci vylepšit.
1. Vytvořte si přepis modulu košíku v šabloně. Pokud nevíte jak, podívejte se na následující video. Tím se vám na webovém prostoru vytvoří soubor /templates/protostar/html/mod_virtuemart_cart/default.php. A nyní začneme s úpravou kódu. Kdo to umí udělá to jednoduše prostřednictvím FTP, kdo ne, může použít rozšíření pro Joomla Phoca Commander.
Doplňte si do kódu:
<?php
vmJsApi::removeJScript("/modules/mod_virtuemart_cart/assets/js/update_cart.js");
vmJsApi::addJScript("/modules/mod_virtuemart_cart/assets/js/update_cart_new.js",false,false);
JText::script('MYCART_PRIDEJ');
JText::script('MYCART_NAD_5000');
JText::script('MYCART_MENA');
JText::script('MYCART_ZDARMA');
$celkem = floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal));
if($data->totalProduct<=0) {$celkem=0;};?>
<span class="motivator">
<?php if ($celkem <= 0.0001) { ?>
<span class="zmenatextu" style="animation: blinker 2s linear infinite;"><?php echo JText::_( 'MYCART_NAD_5000'); ?></span>
<?php } elseif ($celkem < 5000) { ?>
<span class="zmenatextu" style="animation: blinker 2s linear infinite;"><?php echo JText::_( 'MYCART_PRIDEJ') .' '. (5000 - ($celkem)).' '.JText::_( 'MYCART_MENA') ?> </span>
<?php } else { ?>
<span class="zmenatextu" style="font-weight: 700; color: #109d16;"><?php echo JText::_( 'MYCART_ZDARMA'); ?></span>
<?php } ?>
</span>
do míst, kde to chcete zobrazit, většinou za tento řádek:
<a class="total" data-toggle="dropdown" href="#"><span class="hidden-xs totalcart"><?php if ($data->totalProduct and $show_price and $currencyDisplay->_priceConfig['salesPrice'][0]) { ?>
<?php echo $data->billTotal; ?>
<?php } ?></span></a>
ale těch prvních 6 řádek je lepší umístit hned na začátek souboru.
K vloženému kódu nekolik poznámek:
vmJsApi::removeJScript("/modules/mod_virtuemart_cart/assets/js/update_cart.js");
vmJsApi::addJScript("/modules/mod_virtuemart_cart/assets/js/update_cart_new.js",false,false);
zajistí, že se nepracuje s update_cart.js, ale s update_cart_new.js, který se nepřepíše. Za tento kód musím poděkovat Houbákovi. Navíc je můžete dát třeba do šablony /templates/protostar/html/mod_virtuemart_cart/ nebo někam do adresáře /media
Následující 4 řádky jsou tam kvůli použití těchto jazykových proměnných v JS. Dále už pokračuje jen výpočet a podmínky zobrazení. textu.
$data->billTotal totiž vrací řetězec "Celkem 516,00 Kč" a ten není samozřejmě možné porovnávat s číslem. Proto je převeden na číslo typu float - floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal)).
Ještě je vhodné se zmínit o podmínce if ($celkem <= 0.0001) . Protože $celkem je typu float nelze napsat if ($celkem = 0) To je totiž vyhodnoceno jako nepravda, pokud je košík prázdný
2. V adresáři /modules/mod_virtuemart_cart/assets/js/ si vytvořte kopii souboru update_cart.js a nazvěte ji update_cart_new.js.
Kopii pak upravte následovně:
$(module).find(".show_cart").html( datas.cart_show);
$(module).find(".total_products").html( datas.totalProductTxt);
$(module).find(".total").html( datas.billTotal);
var hodnota = datas.billTotal;
var celkem = hodnota.replace(/[^0-9,.]/g,"");
celkem = celkem.replace(/[,.]/g,".");
if (celkem.length=0) {celkem=0} else {parseFloat(celkem);}
if (datas.totalProduct<=0) {celkem=0};
if (celkem <= 0.0001) {
mujtext = Joomla.JText._( 'MYCART_NAD_5000');}
else
if (celkem < 5000) {
mujtext= (Joomla.JText._( 'MYCART_PRIDEJ') + ' ' + (5000 - celkem) + ' ' + Joomla.JText._( 'MYCART_MENA'));}
else {
mujtext= ( Joomla.JText._( 'MYCART_ZDARMA'));}
$(module).find(".zmenatextu").html(mujtext);
Je jasné že, podmínky musí být stejné jako v defailt.php, tedy pokud je chcete změnit, musíte na obou místech. Snad ještě k podmínce if (celkem.length=0) {celkem=0} else {parseFloat(celkem);}. Ta zde musí být, protože pokud je košík prázdný není v datas.billTotal prázdný řetězec, ale N/A.
3. Doplňte do /language/overrides/cs-CZ.override.ini a en-GB.override.ini. Opravdu musíte do obojícho, pokud si chcete být jisti, že v jiném jazyku se nezobrazí jen jazykové řetězce. V angličtině to samozřejmě můžete. Je to takto míněno pro vícejazyčný web ne pro multiměnový VM.
MYCART_ZDARMA="Vaše objednávka bude dopravena zdarma!"
MYCART_MENA="Kč"
MYCART_PRIDEJ="Chcete dopravu zdarma? Přidejte ještě zboží za:"
MYCART_NAD_5000="Při objednávce nad 5000,- je doprava zdarma!"
Texty si samozřejmě zadejte dle sebe a případně i v dalších jazykových mutacích. Tímto je řešení konečné a univerzální, odolné vůči upgradům.
Úprava je úspěšně otestována s rozšířením (One Page Checkout pro Virtuemart) OPC.
Funkčnost tohoto kódu si můžete vyzkoušet na testovacím webu. Je tam nainstalována joomla 3.9.0. virtuemart 3.4.2. a poslední verze OPC.
Závěrem:
Pokud vám všímavějším není jasné, proč tam jsou podmínky if($data->totalProduct<=0) {$celkem=0;}; (PHP) a if (datas.totalProduct<=0) {celkem=0}; (JS), tak je to proto, že tam má VM chybu.
Pokud se totiž vyprázdní košík, tak v $data->billTotal zustane řetězec "Celkem 80,00 Kč". Tedy tolik, kolik činí doprava a zobrazovalo by to nesmysly.
Pokud máte OPC, tak ten tu chybu opravuje, ale pokud ne, musíte tam ty podmínky mít.
Ahoj,
vložila jsem zboží do košíku na tom demu, ale neukazuje se mi nic o tom, za kolik mám ještě nakoupit, abych měla dopravu zdarma.
Jinak já na toto používám Plugin Pro Shipment od Valerie https://www.alatak.net/en/extensions/virtuemart/shipments/pro-shipment-plugin.html
V praxi to funguje tak, že to dopočítává, za kolik je třeba ještě nakoupit, v praxi k vidění třeba na eshopu https://www.zvykacky-shop.cz/
Dala bych do článku screenshot, aby si to lidi uměli lépe představit. Hodím pak na blog návod, jak to nastavit, má to víc možností, a umožňuje různě opodmínkovat dopravu nad rámec standardních možností Virtuemartu.
Ahoj, to o čem píšeš, je košík v komponentě, to tady neřešíme, přestože to je mnohem jednoduší to upravit, psal jsem to v diskuzi https://www.joomlaportal.cz/forum/71-joomla-3-0-x-3-1-x-3-2-x-a-jeji-rozsireni/122334-kosik-motivator-k-nakupu.
Takže to tvoje navrhovaní rozšíření to neumí zobrazit v modulu košíku. Na demo webu je to modul "nákupní košík" v pravém sloupci.
Když přidám zboží napíše to tam třeba:
Celkem 505,90 Kč Chcete dopravu zdarma? Přidejte ještě zboží za: 4494.1 Kč
Je to řešený jak ajaxem tak php.
Vidíš! A to je přesně ten důvod, proč by to chtělo do toho článku vložit screenshot. To info o tom, že je to v minicartu jsem úplně přehlédla.
Poslal jsem to Františkovi, aby to tam přidal.
Technická:
Z marketingového hlediska jedna malá věta v modulu košík, když si přidávám produkt na výpisu kategorie nebo detailu produktu a modul košík nevidím nemá žádný smysl a o tom že něco musím ještě koupit nebo mám něco zadarmo se dozvím náhodou po odrolování nahoru, kdy už úplně zapomenu co jsem koupil :)
Proto nejvhodnější vložení této informace je do popup okna - padded.php nebo umístit modul nad výpisem produktů nebo nad detail produktu nebo nad košík (když měním jen počty ks v one page košíku).
Tím nechci snižovat super odvedenou práci :)
Máš pravdu Rudo, ale je ještě jedna možnost, dát ten modul fixed.
Udělal jsem to teď tak na tom demowebu a vypadá to dobře.
Díky autorovi za velmi užtečný článek.
Všechno funguje i na aktuální verzi Joomla! 3.9.18 a VirtueMart 3.8.2 10325.
Rád bych k tomuto ještě doplnil, že by se nemělo pracovat při výpočtech slevy s hodnotou billtotal, páč do ní může být započítaná navíc doprava a platba. Výsledkem je, že se uživatel velmi snadno dostane do situace, kdy modul hlásá dosáhnutí dopravného zdarma, ale v košíku je dopravné stále započítané. V souboru /templates/protostar/html/mod_virtuemart_cart/default.php místo toho počítám s cenou po slevě (billTotal_discounted_net), ke které přičtu daň (billTotal_tax_amount).
8. řádek v kroku 1. tohoto návodu jsem nahradil tímto:
$celkem = floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal_discounted_net)) + floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal_tax_amount));
Akorát si zatím moc nevím rady s tím javascriptem ve 2. kroku. Nechce se na to prosím někdo mrknout?