pristup k UI\Presenter v UI\Control
- vosy
- Člen | 532
ahoj potreboval bych se vkomponente dostat k presenteru
v componente mam
$file = dirname(__FILE__).'/soutez/step2/default.latte';
$presenter = $this->getPresenter(TRUE);
$template = $presenter::createTemplate();
$template->setFile($file);
$template->render();
vysledek
Nette\InvalidStateException
Component '' is not attached to ‚Nette\Application\UI\Presenter‘.
$presenter = $this->getPresenter(TRUE);
- David Matějka
- Moderator | 6445
tak zprava je snad jasna, komponenta neni pripojena k presenteru.
kde se k nemu snazis pristoupit? (v jake metode) a proc vubec? komponenta
si template umi vytvorit sama. a $presenter::createTemplate() je kravina. snad
$presenter->createTemplate()
ne?
- David Matějka
- Moderator | 6445
no to se nediv, ze se to nepripoji k presenteru.
udelej si normalni tovarnicku v createComponent* metode
- MartyIX
- Člen | 217
@vosy:
zaregistruj si komponentu v presenteru standardni cestou:
protected function createComponentSoutez()
{
$component = new \MyComponent($this, 'soutez');
return $component;
}
a v komponente pak muzes pristupovat k presenteru pres
$this->getPresenter()
(popr.
$this->presenter
– coz lze diky vlastnostem
Nette\Object
)
- Majkl578
- Moderator | 1364
@MartyIX: Používat tvoji variantu, kdy se předává rodič a název konstruktorem, není doporučované.
Lepším řešením je následující.
V presenteru:
protected function createComponentSoutez()
{
return new \MyComponent(); // ideálně vytvořené z factory, odpadne nutnost předávat DI závislosti ručně zde
}
V komponentě:
// žádný konstruktor nebo pouze na předání DI závislostí
public function attached($parent)
{
parent::attached($parent);
if ($parent instanceof Presenter) {
return;
}
// tady vše co se má dít po připojení k presenteru
$this->getPresenter()->...;
}