Košík - motivator k nákupu

marvays
13. lis 2018 12:28 #137639
Ahoj.
Loni jsem řešil kus kodu, díky kterému by se mi měl na stránce detailu produktu zobrazovat text, který se mění v závislosti na tom, jakou hodnotu má zboží vložené do košíku. Díky některým z vás jsem to dal do kupy:
<div class="motivator" style="padding: 10px;position: absolute;width: 350px;right: 150px;bottom: -3px;padding: 10px;color: #e8102c;text-align: right;text-transform: none;"> 
	<?php if ($data->billTotal == 0) { ?>
            <span style="animation: blinker 2s linear infinite;">Při objednávce nad 5000,- je doprava zdarma!</span>
	<?php } elseif ($data->billTotal < 5000) { ?>
            <span style="animation: blinker 2s linear infinite;">Chcete dopravu zdarma? Přidejte ještě zboží za: <?php echo (5000 - ($data->billTotal)) ?>,-</span>
	<?php } else { ?>
            <span style="font-weight: 700; color: #109d16;">Vaše objednávka bude dopravena zdarma!</span>
	<?php } ?>
	</div>

Tohle je kod pvo VM2 a umístěný je v modulu košíku.

Nyní řeším, že potřebuji tento kod zobrazovat v detailu produktu a ve VM3.
Kod jsem tedy vložil, ale nepřepočítává to . . . . jen zobrazí první volbu. Jelikož php je moje "jediná a nejslabší :)" stránka, tak nějak netuším, jestli je to tím, že je to umístěno mimo modul košíku, nebo tím, že je to v novější verzi VMka.

Mám takové tušení, že je to ta druhá možnost. A odhaduju že problém bude konkrétně v "$data->billTotal" . . . . poučíte mě prosím?

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od marvays
13. lis 2018 12:39 - 13. lis 2018 12:40 #137640
Tak potvrzeno, i Vmdebug si to myslí:
Notice: Undefined variable: data in /www/templates/astroid_template_zero/html/com_virtuemart/productdetails/default.php on line 257
<?php if ($data->billTotal == 0) { ?>

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
13. lis 2018 12:42 - 13. lis 2018 12:44 #137641
mrknu na to, ale v jakém php souboru jsi ten kód měl?

neviděl jsem druhou zprávu, už chápu

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
13. lis 2018 14:09 - 13. lis 2018 14:22 #137643
tak je to následně:

V novější verzi VM už není objekt $data, proto je třeba nahradit $data->billTotal proměnnou $this->cart->cartPrices[billTotal]

kód tedy bude:
<div class="motivator" style="padding: 10px;position: absolute;width: 350px;right: 150px;bottom: -3px;padding: 10px;color: #e8102c;text-align: right;text-transform: none;"> 
	<?php if ($this->cart->cartPrices[billTotal] = 0) { ?>
            <span style="animation: blinker 2s linear infinite;">Při objednávce nad 5000,- je doprava zdarma!</span>
	<?php } elseif ($this->cart->cartPrices[billTotal] < 5000) { ?>
            <span style="animation: blinker 2s linear infinite;">Chcete dopravu zdarma? Přidejte ještě zboží za: <?php echo (5000 - ($this->cart->cartPrices[billTotal])) ?>,-</span>
	<?php } else { ?>
            <span style="font-weight: 700; color: #109d16;">Vaše objednávka bude dopravena zdarma!</span>
	<?php } ?>
</div>

Tento kód je ale možné vložit to košíku, ne k detailu produktu.
Tuto možnost jsem nikde nenašel, opravdu jste tento kód měl v detailu produktu?

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Rudolf Baláš
13. lis 2018 14:22 #137644
Na detailu produktu si určitě nevoláte model order, který voláte v košíku :)))))
Takže bych tipnul, že se tam musí vložit něco trochu jiného.

Můžete tedy hackovat nebo použít modul Free Shipping Info, který tohle kompletně řeší.
Přílohy:

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
13. lis 2018 14:53 #137647
ještě jsem se na to díval a ten kód:
<div class="motivator" style="padding: 10px;position: absolute;width: 350px;right: 150px;bottom: -3px;padding: 10px;color: #e8102c;text-align: right;text-transform: none;"> 
	<?php if ($data->billTotal == 0) { ?>
            <span style="animation: blinker 2s linear infinite;">Při objednávce nad 5000,- je doprava zdarma!</span>
	<?php } elseif ($data->billTotal < 5000) { ?>
            <span style="animation: blinker 2s linear infinite;">Chcete dopravu zdarma? Přidejte ještě zboží za: <?php echo (5000 - ($data->billTotal)) ?>,-</span>
	<?php } else { ?>
            <span style="font-weight: 700; color: #109d16;">Vaše objednávka bude dopravena zdarma!</span>
	<?php } ?>
	</div>

můžete použít v modulu košíku (v přepsání modulu)

to o čem píšu já výše, je košík v komponentě

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
15. lis 2018 22:28 - 15. lis 2018 22:31 #137722
tak jsem se na vyžádání ještě podíval na ten kód do modulu košík:
<div class="motivator"> 
    <?php if ($data->billTotal == 0) { ?>
            <span style="animation: blinker 2s linear infinite;">Při objednávce nad 5000,- je doprava zdarma!</span>
    <?php } elseif ($data->billTotal < 5000) { ?>
            <span style="animation: blinker 2s linear infinite;">Chcete dopravu zdarma? Přidejte ještě zboží za: <?php echo (5000 - ($data->billTotal)) ?>,-</span>
    <?php } else { ?>
            <span style="font-weight: 700; color: #109d16;">Vaše objednávka bude dopravena zdarma!</span>
    <?php } ?>
    </div>

kód je správně až na jedno ale:
$data->billTotal vrátí řetězec “Celkem 373,00 Kč”
To jistě chápeš, že nemůžeš porovnávat s numerickou hodnotou.
Takže pravdivě ti to vyhodnotí jen první podmínku, pokud je košík prázdný a řetězec je tudíž "" (prázdný)
Je tedy nutné ten řetězec převést na číslo, aby se to dalo porovnat. Je více možností jak to převést na číslo, ale problém by byl, pokud by tam byly oddělovače tisíců, to by se to dle formátu muselo ještě upravit. Jestli je oddělovač desetinných míst tečka nebo čárka je jedno.
Vidím dvě možnosti. Pokud chci opravdu vycházet z proměnné $data->billTotal:
$celkem=floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal))
nebo mohu použít proměnnou $data->billTotal_net. Tady ale neznám VM tak důkladně, abych mohl říct, že ty dvě proměnný vyjadřují vždy stejnou cenu.:
$celkem=floatval(str_replace(",",".",$data->billTotal_net))

takže celý kód bude vypadat například:
<div class="motivator"> 
    <?php $celkem = floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal)) ?>
    <?php if ($celkem = 0) { ?>
            <span style="animation: blinker 2s linear infinite;">Při objednávce nad 5000,- je doprava zdarma!</span>
    <?php } elseif ($celkem < 5000) { ?>
            <span style="animation: blinker 2s linear infinite;">Chcete dopravu zdarma? Přidejte ještě zboží za: <?php echo (5000 - ($celkem)) ?>,-</span>
    <?php } else { ?>
            <span style="font-weight: 700; color: #109d16;">Vaše objednávka bude dopravena zdarma!</span>
    <?php } ?>
</div>

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Rudolf Baláš
16. lis 2018 00:16 #137726
Tož chlapi, celé to tak krásně píšete až je radost pohledět :)

ale zapomněli jste na to že změna ceny musí běžet ajaxem, jinak si to programujete jen pro programování a je to v reálném eshopu nepoužitelné.

Jak jsem psal, podíval bych se po modulu a komponentě Free Shipping info, která to má již vyřešené.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
16. lis 2018 00:29 #137727
a proč by to mělo běžet ajaxem, když zobrazení ceny v modulu košíku ajaxem neběží a stránka se po přidání zboží do košíku vždy znova načte?
My přeci cenu neměníme, jen k ní zobrazujeme info :ohmy:

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Rudolf Baláš
16. lis 2018 00:35 #137728
Eshop s reload stránky po přidání produktu do košíku?

Aha, tak pokud máte tuto verzi chování eshopu.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
16. lis 2018 00:40 #137729
Ano, je to pro VM

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Rudolf Baláš
16. lis 2018 01:16 #137730
Rozumím, tak to bude asi nějaká starší verze, já už 3 roky používám tyto věci ajaxové

- od té doby co je pro VM k dispozici ajaxový košík a ajaxová komponenta Free shipping info
- od té doby co to má alza a zákazníci to chtějí taky

Jinak mi vyhrožují jinými systémy :D

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
16. lis 2018 02:37 #137731

Rudolf Baláš napsal: - od té doby co to má alza a zákazníci to chtějí taky

Jinak mi vyhrožují jinými systémy :D


:cheer: Jéjej to znám - "Dyť to má alza (mall, facebook, google, amazon), to jen okopírujete" :P

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Rudolf Baláš
16. lis 2018 04:27 - 16. lis 2018 04:29 #137732
Kdyby byl Max co k čemu a nevymýšlel již 3 roky přechod virtuemartu na wordpress, kde mu pšenka stejně nepokvete, tak to má v základu.

Ale nebuďte smutný, až rozjedeme portal minijoomla.org tak tam najdete všechny doplňky z portalu EasyJoomla.org v nové verzi a plus nové verze od nás včetně toho Free Shipping info.

Pak si to můžete koupit za mrzký peníz pokud to budete chtít :)

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od marvays
16. lis 2018 09:37 #137734

Ernst napsal: tak jsem se na vyžádání ještě podíval na ten kód do modulu košík:

takže celý kód bude vypadat například:

<div class="motivator"> 
    <?php $celkem = floatval(preg_replace(array("/[^0-9,.]/","/[.,]/"), array("","."), $data->billTotal)) ?>
    <?php if ($celkem = 0) { ?>
            <span style="animation: blinker 2s linear infinite;">Při objednávce nad 5000,- je doprava zdarma!</span>
    <?php } elseif ($celkem < 5000) { ?>
            <span style="animation: blinker 2s linear infinite;">Chcete dopravu zdarma? Přidejte ještě zboží za: <?php echo (5000 - ($celkem)) ?>,-</span>
    <?php } else { ?>
            <span style="font-weight: 700; color: #109d16;">Vaše objednávka bude dopravena zdarma!</span>
    <?php } ?>
</div>


Vyzkoušeno. posunuli jsme se hodně dopředu. Ale . . .

hned na startu to přeskočí první podmínku. i když jsem změnil podmínku na ==0 tak ji přeskočí a zobrazí podmínku druhou. Tuhle dopdmínku to ale počítá zvláštně. Pokud mám prázdný košík, tak bych měl mít výzvu na přidání do košíku za 5000,-. Místo toho mi to počítá na 4905 a někde se nám zatoulalo 95 kaček. Možná by pomohlo změnit druhou podmínku na větší než 0 a menší než 5000,-

třetí podmínka vypadá dobře.

ajax by byl luxus, takhle musím pořešit, aby se mi nenačítal košík do cache.

Třetí podmínka funguje správně.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.