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 | 405
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)