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

- 22
 - Člen | 1478
 
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

- norbe
 - Backer | 408
 
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));
}
				
- Tharos
 - Člen | 1030
 
_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)

- Tharos
 - Člen | 1030
 
@_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)