Získání $this->presenter v Controlu

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

Je možné nějak získat $this->presenter v controlu nějak dřív, než v render() nebo handle() metodě controlu?

Aurielle
Člen | 1281
+
0
-

$this->getPresenter(TRUE) nefunguje? Pokud je komponenta připojena měla by svůj presenter tímto najít.

Tharos
Člen | 1030
+
0
-

Nejdříve to lze asi v metodě attached. Je ale nutné dohledat se ve stromu až k presenteru.

22
Člen | 1478
+
0
-

gmvasek napsal(a):

$this->getPresenter(TRUE) nefunguje? Pokud je komponenta připojena měla by svůj presenter tímto najít.

v kontrolu:

public function __construct()
{
	parent::__construct();
	Debugger::fireLog($this->getPresenter(TRUE));
}

= Component '' is not attached to 'Nette\Application\UI\Presenter

22
Člen | 1478
+
0
-

Jde mi o to, že potřebuju v komponentě automaticky vyhodnotit, jestli je aplikace v production modu, což jde teď jen přes context a nenapadá mě ani jedno jednoduché řešení :-)

22
Člen | 1478
+
0
-

Tharos napsal(a):

Nejdříve to lze asi v metodě attached. Je ale nutné dohledat se ve stromu až k presenteru.

ukážeš? :-)

norbe
Backer | 405
+
+1
-

Kdyby jsi komponentu připojoval k presenteru ihned při vytváření, tak Ti bude fungovat i ten tvůj postup (alespoň myslím, nezkoušel jsem)…

Presenter

protected function crateComponentTest($name) {
   $komponenta = new Komponenta($this, $name);
   ...
}

Komponenta

public function __construct(Nette\ComponentModel\IContainer $parent, $name)
{
   parent::__construct($parent, $name);
   // teď už je komponenta připojená, takže by to mělo fungovat
   Debugger::fireLog($this->getPresenter(TRUE));
}
22
Člen | 1478
+
0
-

máš pravdu, pokud do konstruktoru controlu předám parametry, ja ukazuješ, tak to funguje! Myslel jsem, že parametry se předávají automaticky. Továrničku jsem měl, jak uvádíš. Díky pane.

Editoval 22 (8. 6. 2011 19:41)

Ani
Člen | 226
+
0
-

Předávají se automaticky, ale až když ji vrátíš z továrny. Zatímco ten construct se zpracuje ještě v továrně.

_Martin_
Generous Backer | 679
+
0
-

Nebylo by přeci jen čistější řešit toto v attached metodě? Viz. Nette\Application\UI\Form, ten také řeší některé věci až v okamžiku připojení k presenteru (kdy má jistotu, že presenter existuje).

Tharos
Člen | 1030
+
0
-

_Martin_: No já osobně bych to tak řešil. :)

class MyControl extends Nette\Application\UI\Control
{
	public function __construct(Nette\ComponentModel\IContainer $parent = NULL, $name = NULL)
	{
		parent::__construct($parent, $name);
		$this->monitor('Nette\Application\UI\Presenter');
	}

	protected function attached($presenter)
	{
		if ($presenter instanceof Nette\Application\UI\Presenter) {
			// zde byla komponenta právě připojena k presenteru
		}
		parent::attached($presenter);
	}
}

Editoval Tharos (8. 6. 2011 22:05)

_Martin_
Generous Backer | 679
+
0
-

@Tharos: Jj, tak jsem to myslel. Jen bych podotkl, že Control je v Nette\Application\UI a u konstruktorů bych předával parametry, neboť je to tak trochu očekávané chování.

Editoval _Martin_ (8. 6. 2011 22:03)

Tharos
Člen | 1030
+
0
-

@_Martin_: Díky vřele za upozornění, překlepy jsem opravil. :)

Jinak obecně pozor na to, že komponenta může být připojována i do stromu, který ještě nemusí být „zakotven“ k presenteru. Továrničky nejsou doménou pouze presenteru, a tak i při použití new MyControl($this, $name) v nich nemusí platit $this instanceof Presenter. A proto je nejrobustnějším řešením asi opravdu použití metody attached.

Editoval Tharos (8. 6. 2011 22:09)

_Martin_
Generous Backer | 679
+
0
-

@Tharos: Jo, to je dobrá poznámka=)

22
Člen | 1478
+
0
-

díkec za vyčerpávající studii .-)