mutiměnový web – přepínání měn

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tomfz6
Člen | 32
+
0
-

Čau všem,

mám aplikaci, která musí umět přepínat měny, mám několik modelů a komponent kde budeu potřebovat vědět jaká je aktuální měna. Ok říkal jsem si přidám si měnu jako parametr do configu a předám si ji kam potřebuju. Takto to funguje. Ale jak mám řešit přepínání měn? dá se nějak „přepsat/nastavit“ proměnná v configu třeba z nějakého presenteru…
Myslíte si, že tato cesta je správná nebo by to bylo lepší to řešit jinak?

Dík moc za odpovědi …

David Matějka
Moderator | 6445
+
0
-

Tu menu si bude moci vybrat uzivatel, jo?

err
Člen | 77
+
0
-

Uloz si to do SESSION a pracuj s tim.

tomfz6
Člen | 32
+
0
-

ano měnu si vybere uživatel…

Editoval tomfz6 (13. 3. 2016 15:20)

abc
Člen | 92
+
0
-

Defaultní měnu nech v configu, předej si ji do BasePresenteru, tam ji ve startupu nastav, pokud neni nastavená do persistentního parametru:
https://doc.nette.org/…n/presenters#…

Uživatel tak bude moci někomu poslat odkaz s měnou

tomfz6
Člen | 32
+
0
-

Já ti rozumím, tak nějak to mám nachystané.Ale jak ve startupu nastavím/přepíšu tu hodnotu v configu. Něco ve stylu $this->context->.....?

CZechBoY
Člen | 3608
+
0
-

edit: no dobře tak ne :D

Editoval CZechBoY (14. 3. 2016 10:23)

Pavel Kravčík
Člen | 1196
+
+1
-

@CZechBoY: Já měl za to, že tohle je nehezké a je lepší si registrovat presenter jako službu a předat si do ní parametr. Nebo si udělat službu na parametry a tu si injectnout.

Pavel Macháň
Člen | 282
+
+2
-

CZechBoY napsal(a):

$this->currency = $this->currency ?: $this->context['parameters']['defaultCurrency'];

Mno fujky

tomfz6 napsal(a):

Já ti rozumím, tak nějak to mám nachystané.Ale jak ve startupu nastavím/přepíšu tu hodnotu v configu. Něco ve stylu $this->context->.....?

Do konfigu nic za běhu zapisovat nebudeš a na $this->context zapoměň, že vůbec existuje.

V konfigu si nastav třeba:

parameters:
	currency: CZK

services:
	- MyCurrencyService(%currency%)

Kde MyCurrencyService bude ukládat nastavenou měnu do session, pokud nebude v session použije se default měna, kterou si zasíláš z configu.

class MyPresenter extends BasePresenter {

	private $currencyService;

	public function __construct(\MyCurrencyService $currencyService){
		$this->currencyService = $currencyService;
	}

	public function handleSwitchCurrency($currency) {
		$this->currencyService->setCurrency($currency);
	}
}

Editoval Pavel Macháň (14. 3. 2016 10:06)

tomfz6
Člen | 32
+
0
-

ok toto by šlo, ale když tu měnu používám třeba v 10 services tak ten konstruktor bude prásácky ne? a ještě jsem narazil na problém že nevím jak ten setter napsat tam kde se používá interface.

čast toho configu kde se používa ta měna vypadá asi takto

<?php
parameters:
	currency: 1


services
	- App\Model\BasketModel(%currency%)

	- implement: App\Components\IProductBox
	  arguments: [%currency%]

	- implement: App\Components\ICartControl
	  arguments: [%currency%]

?>
CZechBoY
Člen | 3608
+
0
-

Nemůžeš si v konstruktoru prostě vyžádat nějakej CurrencyProvider, kterej by byl služba a věděl jen tu aktuálně nastavenou měnu? Pak by si tu měnu nastavil jen tomu provideru na jednom místě.

Pavel Macháň
Člen | 282
+
+1
-

tomfz6 napsal(a):

ok toto by šlo, ale když tu měnu používám třeba v 10 services tak ten konstruktor bude prásácky ne? a ještě jsem narazil na problém že nevím jak ten setter napsat tam kde se používá interface.

čast toho configu kde se používa ta měna vypadá asi takto

<?php
parameters:
	currency: 1


services
	- App\Model\BasketModel(%currency%)

	- implement: App\Components\IProductBox
	  arguments: [%currency%]

	- implement: App\Components\ICartControl
	  arguments: [%currency%]

?>

Budeš si do služeb, presenterů, modelů atd posílat nějakou service (viz můj příkad s MyCurrencyService), která se o to currency stará. Tzv currency z configu pošleš pouze do té služby a už nikam jinam.

Takže v configu budeš mít pak už jen

parameters:
	currency: CZK

services:
	- MyCurrencyService(%currency%)
	- App\Components\IProductBox
	- App\Components\ICartControl
class MyControl implements \App\Components\ICartControl {

	private $currencyService;

	public function __construct(\MyCurrencyService $currencyService) {
		$this->currencyService = $currencyService;
	}

	public function render(){
		$this->template->currency = $this->currencyService->getCurrency();
	}

}

Editoval Pavel Macháň (14. 3. 2016 13:16)

tomfz6
Člen | 32
+
0
-

@Pavel Macháň
hele až se někde potkáme tak máš u mě velkýýýýý pívo. Dík moc frčí přesně jak jsem si představoval