pristup k UI\Presenter v UI\Control

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

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
+
0
-

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?

vosy
Člen | 532
+
0
-

v presenteru

function renderDefault()
    {
        if ($this->isAjax())
        {
            $formSoutezStep2 = new SoutezComponent();
            $formSoutezStep2->step2($this);

            exit;
        }
David Matějka
Moderator | 6445
+
0
-

no to se nediv, ze se to nepripoji k presenteru.

udelej si normalni tovarnicku v createComponent* metode

MartyIX
Člen | 217
+
0
-

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

David Matějka
Moderator | 6445
+
0
-

@MartyIX: predavani $this a nazvu komponenty neni nutne

vosy
Člen | 532
+
0
-

stim predavanim pre $this uz jsem to zkousel a delallo to furt chybu, a ted jsem to zkusil poranu a uz to frci:), bud jsem byl prepracovany ja a nebo NETTE :)

dix

Majkl578
Moderator | 1364
+
0
-

@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()->...;
}
MartyIX
Člen | 217
+
0
-

Majkl578: Mohl bys trosku rozepsat, proc to neni doporucovane? (Krome toho duvodu, ze zmena nazvu komponenty se pak musi prepisovat na vice mistech.) Ze to jde napsat i tak, jak jsi psal ty, to vim.