Komponenta – nutnost vytvářet novou třídu nebo manuálně renderovat formulář?

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

Na všech stranách webu chci mít jeden blok kódu (login form a v případě přihlášení info o přihlášeném uživateli) a přemýšlím o tom, jak to správně „Nette-like“ vyřešit…
Zdá se mi, že kvůli takové „prkotině“ vytvářet novou komponentu – novou třídu a tu zase muset implementovat v BasePresenteru je jako škrabat se levou rukou za pravým uchem…
Vytvořil jsem si proto obecnou komponentu:

class Component extends NControl
{
	private $content;

	public function setContent($content)
	{
		$this->content = $content;
	}

	public function render()
	{
		echo $this->content;
	}

}

Jejíž obsah plním dle potřeby, ale přesto musím pokaždé vytvořit instanci té třídy (Component) znova.
Proč by to prostě nemohlo fungovat tak, že bych v BasePresenteru měl jednu metodu – např. createWidgetXYZ (pokud by ten widget se měl zobrazovat ve více presenterech) a ta metoda by zkrátka vracela nějaký string, který by se vykreslil na místě v @layout.phtml místo {control XYZ}
Vždycky u tohohle řešení narazím na to, že widget(komponenta) musí být jaksi instancí Forms (AppForm), nebo NControl… Je k tomu nějaký důvod?

V tom login formuláři navíc chci mít i nějaký HTML obsah uvnitř formuláře (před </fieldset>) – musím nutně ten formulář vykreslit manuálně – tzn. vytvořit PHTML šablonu, celou jí napsat, někam jí uložit a nasměrovat na ní tu vykreslovací metodu… Upřímně řečeno, docela vopruz…

Ondřej Mirtes
Člen | 1536
+
0
-

Škrábeš se pravou rukou za levým uchem :)

Pokud chceš mít v @layout.phtml nějaký text, prostě ho tam napiš :) Pokud ten text má být dynamický, naplň si v BasePresenteru v beforeRender proměnnou šablony, kterou pak v tom layoutu vypiš.

Manuální vykreslení formuláře nemusíš dělat přes komponentu, stačí, aby ti ho vracela továrnička Presenteru a pak v šabloně můžeš psát vykreslení tímto stylem:

{control myForm begin}
	{control myForm errors}
	{$control['myForm']['myTextInput']->label} {$control['myForm']['myTextInput']->control}
{control myForm end}

Případně si můžeš formulář také dát do proměnné ($this->template->myForm = $this['myForm'];) a pak ty jeho jednotlivé prvky vypisovat takto:

{$myForm['myTextInput']->label}
{$myForm['myTextInput']->control}

Což je o něco kratší a pohodlnější varianta než s $control :)

maarlin
Člen | 207
+
0
-

Ondro, díky, moc jsem se do toho zabral… :)