Link v komponente – Component is not attached to presenter

Phalanx
Člen | 310
+
0
-

Chci Vás poprosit o pomoc. Mám komponentu, ve které volám link, ale hází mi chybu Component '' is not attached to 'Nette\Application\UI\Presenter'.

<?php

interface ISimpleControlFactory
{
	/** @return Simple */
	function create();
}


class Simple extends Control
{
	public function setVariable($type)
    {
        $link = $this->link('click!'); // tento řádek vyhazuje chybu
		// ...
    }
}
?>

Našel jsem více materiálů k této chybě, ale za boha se nemůžu dopracovat ke správnému řešení.

zkoušel jsem attached
https://forum.nette.org/…-attached-to

četl si v dokumentaci
https://pla.nette.org/…nty-k-rodici

Ondřej Kubíček
Člen | 494
+
0
-

a čeho chceš vlastně dosáhnout, proč potřebuješ získat link v komponentě?

přes to attached by to jít mělo, musíš tu tvoji metodu zavolat až v té metodě

protected function attached($presenter)
{
	parent::attached($presenter);

	$this->setVariable($type);
}
duke
Člen | 650
+
+1
-

Problém je v tom, kdy metodu Simple::link, (potažmo Simple::setVariable) voláš. Metodu link lze volat až poté, co je komponenta připojena k presenteru. Ty ji evidentně voláš ještě před tím.

Phalanx
Člen | 310
+
0
-

@OndřejKubíček Díky moc. Zjistil jsem, že to tak dělat nemůžu. Vytvořil jsem formulář v presenteru a snažil se mu akci nastavovat až v komponentě (+ pak ho v té komponentě vykreslit). Dělám to tak z důvodu, že komponenta bude univerzální, aby se dala propojit s mnoha formuláři.

Vyřešil jsem to tak, že vytvořím jen obálku formuláře v presenteru, kde si vytvořím inputy (addText, addSelect) a celý formulář si už přímo vytvořím v komponentě – standartně createComponentForm() a pak do něj jen nasázím prvky kopírováním.

<?php
		$formTmp = $this->getFilterFormOptions();
		foreach($formTmp->getComponents() as $option) {
			$option->setParent(null);
			$form->addComponent($option, $option->name);
		}
?>

Pokud by někdo znal lepší řešení, budu rád.