Posloupnost připojování komponent v presenteru

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

Omlouvám se za případný hloupý dotaz, nepodařilo mi k tomu zjistit víc.

Existuje nějaká možnost, jak získat finální seznam připojených komponent, nebo určit pořadí jejich připojování k rodiči (presenteru)?

Pokud si zavolám v presenteru ve startup, beforeRender, render<name> metodě

	$components = $this->getComponents(true);

tak ještě žádná z komponent není připojena. Když si to samé provedu v metodě attached komponenty, tak sice získám všechny komponenty které jsou připojeny v okamžiku připojení aktuální komponenty k rodiči, ale poté následují další, které už nezískám.

Cílem je vytvářet seznam závislostí viz. komponent na assets které pak do templatu vkládají dvě instance komponenty co je registruje podle toho jaké komponenty jsou zrovna použity. Ale možná je to celé špatný nápad.

Oli
Člen | 1215
+
+2
-

Komponenta je připojena ve chvíli, kdy na ni poprvé šáhneš. Tzn. Že se připojí komponenta componentA v actionDefault pokud je v actionDefault například toto:

public function acitonDefault()
{
	$this['componentA'];
}

A komoponenta componentB v render (po renderDefault) pokud na ni nikdy v presenteru nešáhneš a zavoláš ji takhto:

{control componentB}

Pokud existuje komponenta, která je závislá na jiné komponentě, tak by se měla vyžádat v konstruktoru. Od toho dependency injection přece je ;-)

Snad jsem ti odpověděl :)

Editoval Oli (4. 7. 2017 13:39)

sidrach
Člen | 23
+
0
-

Oli napsal(a):

Komponenta je připojena ve chvíli, kdy na ni poprvé šáhneš. Tzn. Že se připojí komponenta componentA v actionDefault pokud je v actionDefault například toto:

public function acitonDefault()
{
	$this['componentA'];
}

A komoponenta componentB v render (po renderDefault) pokud na ni nikdy v presenteru nešáhneš a zavoláš ji takhto:

{control componentB}

Pokud existuje komponenta, která je závislá na jiné komponentě, tak by se měla vyžádat v konstruktoru. Od toho dependency injection přece je ;-)

Snad jsem ti odpověděl :)

Ok dík, prostuduju. Vtip je v tom, že dopředu nevím jaké komponenty budu v danou chvíli potřebovat, takže kdybych si předal všechny s daným rozhraním jako závislosti, získám seznam všech assets všech komponent a to mi nepomůže. Ale projedu znova dokumentaci k DI, třeba jsem něco minul.

Idea byla taková, že jedna komponenta čeká na připojení všech ostatních, ty v tu chvíli předají nějakou informaci a když už nezbydou žádné další, tak se teprve vyrenderuje. Každopádně díky.

CZechBoY
Člen | 3608
+
+3
-

@sidrach no jasně, klasickej AssetsManager.
Vytvoř si AssetsManager, registruj jako službu a vyžaduj ve všech komponentách, které připojují nějaké assety. Potom v @layout vyrenderuješ AssetsManager na konci.
Tohle řešení se hodí pro javascript, který se vypisuje na konci stránky.

Pro css v hlavičce to bude trošku složitější, ale asi i to by se dalo nějak vyřešit…