Jak připojit presenter do componenty

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

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

Aurielle
Člen | 1281
+
0
-

Je to přesně naopak. Presenter si připojuje komponenty, a komponenta v současné době nemůže bez presenteru fungovat samostatně. Komponentu v presenteru připojíš klasicky použitím továrničky.

joseff
Člen | 233
+
0
-

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.

Jan Endel
Člen | 1016
+
0
-

A kde je problém?

function createComponentTest(){
        return $this->context->createTestComponent();
}

Editoval pilec (7. 2. 2012 20:05)

joseff
Člen | 233
+
0
-

Problém je že když zavolám na controlu this->link tak mi to vyhodí vyjimku:
Component '' is not attached to Nette\Application\UI\Presenter

Jan Endel
Člen | 1016
+
0
-

A jak komponentu vykresluješ? Ukaž šablonu. A hlavně kde, poněvadž se komponenty připojují do presenteru lazy.

joseff
Člen | 233
+
0
-

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
+
0
-

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)

joseff
Člen | 233
+
0
-

Aha to jsem nevěděl, vypadá to dobře. Díky moc! Ale ještě dotaz ze zvědavosti, proč neexistuje metoda setPresenter na controlu, tím bych to vyřešil už dávno a nemusel bych otravovat ve foru :-) má to nějaký stěžejní význám? Každopádně ještě jednou díky!

uestla
Backer | 796
+
0
-

Ř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).

Jan Endel
Člen | 1016
+
0
-

A jooo Multiplier, na něj jsem zapomněl. Já věděl, že se to tam řešilo … dík.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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.

Jan Endel
Člen | 1016
+
0
-

Za domácí úkol jsem své řešení přepsal pomocí Multiplieru. Ať ve fóru nestraší ošklivé řešení.

Jan Endel
Člen | 1016
+
0
-

Hmm, vážně je deprecated, co se člověk na fóru nedoví.