Odkazy na presentery v komponentě Navigace (Component '' is not attached to…)
- flamengo
- Člen | 135
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
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
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)