redirect z komponenty ven
- Filip111
- Člen | 244
Snažil jsem se zavolat v komponentě redirect, který směřoval ven
z ní, ale vždy to skončilo chybou, že komponenta se jménem xxx
neexistuje.
Konkrétně mám control Poll, po hlasování se volalo
$this->redirect('this');
Takže se načte zase původní stránka odkud se hlasovalo.
Já bych ale chtěl po hlasování přejít na presenter Poll a vypsat všechny ankety. Tedy něco jako
$this->redirect('Poll:showAll');
V tomhle okamžiku mi laděnka zahlásí, že komponenta Poll neexistuje. Zkoušel jsem i další varianty jako
:Poll:showAll
:Front:Poll:showAll
Poll:showAll
Front:Poll:showAll
ale všecho končilo podobnou chybou, že komponenta xxx neexistuje.
Pak jsem si ale uvědomil, že komponenta o nějakém presenteru Poll vůbec
nemá vědět, takže jak z toho ven?
Napadlo mě předávat si do komponenty callback do presenteru kde je
továrnička a tam provést klasický redirect na jiný presenter.
Mám dvě otázky:
- lze z komponenty volat redirect na nějaký presenter?
- jak by se to dalo řešit správně, tedy když vezmu v úvahu, že komponenta neví o okolním světě
- Filip111
- Člen | 244
všem díky, takovéhle volání funguje
Teď by mě ale ještě zajímala odpověď na tu druhou otázku – komponenta přece neví že existuje nějaký presenter Poll, resp. si myslím, že komponenta by měla být vždy univerzální a neměl by se v ní volat jiný presenter.
Jak vyřešit redirect teď?
- Jan Suchánek
- Člen | 404
Do komponenty tedy předáváte presenter?
protected function createComponentExample($name){
return new ExampleControl($this, $name);
}
nebo jak kdy?
- smasty
- Člen | 90
@jenicek: Komponenta je vždy k presenteru pripojená, inak by sa ani nedala použiť. Pripojenie je možné dvomi (tromi) spôsobmi:
- V konštruktore:
new MyControl($this, $name)
- Pomocou
addComponent()
:$presenter->addComponent(new MyControl, 'myControl')
– toto spraví predchádzajúca možnosť automaticky - Magicky pomocou továrničky – stačí aby továrnička vracala
(
return
) danú komponentu a tá sa automaticky pripojí.
K presenteru sa potom z každej pripojenej komponenty dostaneš
pomocou $component->getPresenter();
Takže odpoveď na tvoju otázku: Nie vždy ho treba predávať
v konštruktore, väčšinou stačí aj v továrničke pomocou
return
.
- Jan Suchánek
- Člen | 404
smasty: Super, tak trošku mi to je jasný.
Magicky, jak to přesně myslíš? něco jako?
// To je asi pěkná békovina :)
protected function createComponentExample($name){
return $this->myControl;
}
public function getMyControl($name){
return new MyControl($this, $name);
}
Jak řešíte cashování? jen v šabloně, v presenteru i v komponentě? Díky
Editoval jenicek (7. 10. 2011 11:46)
- Filip Procházka
- Moderator | 4668
22 napsal(a):
2. Tohle by se nemělo používat
Proč ne?
jenicek napsal(a):
Magicky, jak to přesně myslíš? něco jako?
Co to je za splácaninu ? :P
Připojovat komponenty můžeš takto
$this['jmeno'] = new MyControl();
Zcela ekvivalentně takto
$this->addComponent(new MyControl(), 'jmeno');
Pomocí továrničky konstruktorem
protected function createComponentJmeno($name)
{
new MyControl($this, $name);
}
Pomocí továrničky return
em
protected function createComponentJmeno()
{
return new MyControl;
}
Všechny jsou úplně v pořádku. Osobně preferuji poslední zápis.
Rozdíl je mezi nimi podle toho kdy máš $this->presenter
přístupný. Pokud předáváš presenter do konstruktoru, je přístupný už
v konstruktoru. Jinak až po připojení do presenteru.
O cachování si přečti zde.
Editoval HosipLan (6. 10. 2011 17:55)
- 22
- Člen | 1478
HosipLan: měl jsem to nějak zafixované z dokumentace (konec odstavce)
..
ale důvod už neznám. Nicméně v nové dokumentaci nic
takového není…
- Filip Procházka
- Moderator | 4668
To napsal Patrik a pravděpodobně proto, že je jednodušší si pamatovat
přidávání přes ArrayAccess
. Tenhle způsob je naprosto
v pořádku.