Odkazy na presentery v komponentě Navigace (Component '' is not attached to…)

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

Nevím, zda mám správně pojmenovaný název diskuse, ale pojdme na to.
Vytvořil jsem si komponentu Navigation, do které z databáze tahám sekce backendu.
Takto to celkem funguje.

public function __construct($locale, Context $database, User $user){
	parent::__construct();
	$this->locale = $locale;
	$this->database = $database;
	$this->user = $user;
}

public function render(){
	$this->loadSections();
	$this->template->items = $this->items;
	$this->template->setFile(__DIR__ . '/'.$this->templateName);
	$this->template->render();
}

private function loadSections()	{
	$sections = new Sections($this->database);
	$rows = $sections->getSectionsToNav($this->locale);
	if($rows){
		foreach($rows as $row){
			$this->addItem($row['id'], $row['id_parent'], $row);
		}
	}
}

public function addItem($key, $id_parent, $item)	{
	$link = $this->getPresenter()->link($item['presenter']);
	$current = $this->getPresenter()->linkCurrent;
	...
	... // uložím do pole $this->items
}

Potřeboval bych ale metodu loadSections() dát spíše do konstruktoru, v metodě render() je už pozdě.
A proč bych to potřeboval? Potřeboval bych komponentu Navigation vytvořit v BasePresenteru ve startup() a poté z Navigation získávat data (pro drobečkovou navigaci, titulek, nadpis stránky).
A to mi hodí chybu.

public function __construct($locale, Context $database, User $user)	{
	parent::__construct();
	$this->locale = $locale;
	$this->database = $database;
	$this->user = $user;
	$this->loadSections();  // zde mi to nejde, v metodě render() funguje
}
Nette\InvalidStateException
Component '' is not attached to 'Nette\Application\UI\Presenter'

Za jakékoliv nasměrování budu velice rád.

Editoval flamengo (18. 6. 2016 18:19)

CZechBoY
Člen | 3608
+
0
-

Použij metodu attached($presenter) (zavolej samozřejmě předka, ať se napojí do stromu komponent).
Já si v BaseControl udělal událost onAttached ať v každý komponentě tuhle metodu zbytečně nepřepisuju.

class AbcControl extends Control
{
	protected function attached($presenter)
	{
		parent::attached($presenter);

		$this->loadSections();
	}
}
flamengo
Člen | 135
+
0
-

Díky, pomohlo to tak, že zmizela chybová hláška. Bohužel pořád to není to, co potřebuji.
Potřebuji v zásadě toto (opravdu hodně zjednodušené):

BasePresenter.php

protected function startup()
	parent::startup();
	$this->navigation = $this->navigationFactory->create($this->locale);  // továrnička na vytvoření navigace
	dump($this->navigation->items);
}

Mělo by se zobrazit plné pole, ale zobrazí se pouze toto: array ().
Prostě bych potřeboval to, že při vytvoření komponenty se natáhnou všechna její data, nastaví se uvnitř komponenty vše potřebné a potom ve startupu nebo jinde v presenteru můžu do komponnety šáhnout a něco si z ní vytáhnout.
Nebo na to mám jít úplně jinak?

Editoval flamengo (18. 6. 2016 18:51)

CZechBoY
Člen | 3608
+
0
-

No komponenta by měla bejt vykreslitelná tzn. ji vykreslíš někde v šabloně.
To co chceš by šlo buď komponentou navigace, která se sama vykreslí nebo nějaký jednoduchou třídou, která jen vrátí data (repozitář/třída modelové vrstvy).

flamengo
Člen | 135
+
0
-

Ok a díky. Zkusím přesunout veškerou logiku do modelu a komponentou budu už jen vykreslovat hotová data.