Komponenta – nutnost vytvářet novou třídu nebo manuálně renderovat formulář?
- maarlin
- Člen | 207
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
Š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 :)