Jak připojit presenter do componenty
- joseff
- Člen | 233
Zdravím, zajímalo by mě jak mohu připojit presenter do komponenty (\Nette\Application\UI\Control) po jejím vytvoření, komponentu mi vytváří SystémContainer a já bych pak potřeboval do ní připojit presenter, ale žádnou metodu $component->setPresenter() jsem nenšel, poradí někdo jak na to? Díky
- joseff
- Člen | 233
Ale mě ta komponenta funguje uplně normálně samozstatně, jediné co mi tam nefunguje je $this->link(); ale jinak vše funguje ok. A jak je to tedy správně? Továrnička v presenteru? To jako máte na mysli toto:
function createComponentTest(){
return new TestComponent();
}
Tak to právě nechci, strkám do konstruktoru té komponenty spoustu parametrů z konfigu, takže jsem si na to normálně udělal továrničku v configu, takže ji vytvářím takto:
$this->context->createTestComponent();
}
Jenže pak nevím jak připojit presenter? Prosím o podrobnější vysvětlení, stále tomu nerozumím, díky.
- joseff
- Člen | 233
Tedy možná je problém že tu komponentu v presenteru nevolám přes továrnu, ale přímo se ptám contextu, ale to jsem nevěděl jak jinak vyřešit protože dopředu nevím kolik jich bude, takže v presenteru mám toto:
v action
foreach(galleries as gallery)
{
$this->template->galleries[] = $this->context->createGallery();
}
pak je v sablone vykresuluju:
{foreach $gallery as $g}
{$g->link(....)}// toto vyhodi tu chybu...
{/foreach}
- Jan Endel
- Člen | 1016
aha, tady je problém není tam unique name, kterou Nette komponenty vyžadují. A taky komponenta skutečně není připojena k presenteru.
řešil bych to asi nějak takto:
protected function createComponentGalleries()
{
$context = $this->context;
$container = new \Nette\Application\UI\Multiplier(function ($name) use($context) {
return $context->createGallery();
}
}
a pak se dá volat třeba toto:
{foreach $galleries as $galery}
{control galleries-$galery->id}
{/foreach}
//edit: přepsáno pomocí Multiplieru
Editoval pilec (7. 2. 2012 22:19)
- uestla
- Backer | 799
Řešit to můžeš na komponentové úrovni, čili ne
setPresenter()
, nýbrž setParent()
.
A co se pilecovi rady na přepsání metody
createComponent($name)
týče, je to fujkity fuj – to prosím
nepoužívej. Na to tu máme Multiplier
(podívej na super
přednášku).
- Vojtěch Dobeš
- Gold Partner | 1316
Btw stačí {widget galleries-$gallery->id}
, tedy funguje to
i bez uvozovek :)
A úplně nejlépe {control galleries-$gallery->id}
,
protože {widget}
je deprecated
.