mutiměnový web – přepínání měn
- tomfz6
- Člen | 32
Č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 …
- abc
- Člen | 92
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
- Pavel Kravčík
- Člen | 1196
@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
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
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%]
?>
- Pavel Macháň
- Člen | 282
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)