Component is not attached – Nette 2.2.1

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

Ahoj,
Zkusil jsem v projektu udělat update z Nette 2.1.x na Nette 2.2.1 ale narazil jsem na problem s připojovnaim komponenty k presenteru. Pokud komponentě explicitně zadám $parent a $name, tak se zdá být všechno v pořádku ale jinak končím s chybou Component ‚xy‘ is not attached to Nette\Application\Presenter. Co se zmenilo v Nette 2.2, aby to zpusobilo tenhle problem?

besanek
Člen | 128
+
0
-

Co a kde přesně vyhazuje chybu? Jak vytváříš komponentu? Přetěžuješ konstruktor. popř jak?

blur
Člen | 15
+
0
-

Chybu to vyhazuje tady:
http://prntscr.com/3olo8p

Registruje se to takhle:

<?php
	public function createComponentElFinder()
	{
		$dialog = new ElFinderDialog();
		$dialog->setHeader('Správa souborů');
		$dialog->setParams("multiple");

		return $dialog;
	}
?>

Konstruktor pretizene je:

<?php
class ElFinderDialog extends BaseDialog
{

	public function __construct(IContainer $parent = NULL, $name = NULL)
	{
		parent::__construct($parent, $name);
		$this->template->attrs = [];
	}
	// tohle je v rodici
protected function attached($presenter)
	{
		parent::attached($presenter);
		$this->template->setTranslator($this->translator);
		if (method_exists($this, 'startup')) {
			$this->startup();
		}
	}
?>

Nicmene mi to hlasi stejnou chybu na komponentach resenych i trosku jinak.

EDIT:
No uz mi doslo, kde je problem ale ted co s nim? V konstruktoru v nette 2.2 jeste neni template. Protoze to pouziva predpokladam neco jako createTemplate z presenteru.

Editoval blur (1. 6. 2014 13:03)

besanek
Člen | 128
+
0
-

Dělá to tento řádek,

$this->template->attrs = [];

protože tady vytváříš šablonu. Ovšem nově komponenta si šablonu nevytváří sama, ale získá factory od presenteru, který v tomto případě není ještě v konstruktoru nastaven.

Řešení: přesunout tento řádek do attached() a konstruktor můžeš s gentlemanským klidem smazat.

blur
Člen | 15
+
0
-

Blah. to bude spousta uprav v ruznych komponentach ale diky.
Edit.
Tak jednoduche to mit nebudu. k template jeste pristupuje velke mnozstvi setteru ruzne po komponentach.

Editoval blur (1. 6. 2014 13:21)

blur
Člen | 15
+
0
-

Je spatne reseni nastavit si vlastni templateFactory? viz. https://api.nette.org/…rol.php.html#…
99% komponent vytvarim tovarnou, ktera dedi od BaseControl. Kdyzbych ji predal sluzbu TemplateFactory rocne z configu tak by to melo problem vyresit. Nebo se pletu? Zkusim.