Vytvoření přihlašovacího formuláře

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

Zdravíčko,
chtěl bych si vytvořit přihlašovací formulář, a mít ho v @layout.latte.
Vytvořil jsem si soubor LoginPresenter.php:

class LoginPresenter extends \Nette\Application\UI\Form {
    public function createComponentLoginForm()
    { ... }

a snažím se ho nějak vložit do layoutu takto:

{control loginForm}

jenže laděnka hází chybu:
Component with name 'loginForm' does not exist

Předpokládam, že je to tím, že se ten presenter LoginPresenter.php vůbec neincludoval do stránky.
Jdu na to správně? Pokud ne, kde dělám prosím chybu, a jak na to? :)

Děkuji..

Jan Endel
Člen | 1016
+
0
-

@layout.latte bývá společný pro celou jednu část webu, doporučuju továrničku createComponentLoginForm dát do nějakého z předků LoginPresenteru, typicky BasePresenteru a pak od něj vždy presentery dědit.

BuGeR
Člen | 45
+
0
-

Děkuji za odpověď :)
Napadlo mě to dát do BasePresenteru, ale chtěl bych mít právě ten LoginForm v samostatném souboru (pro přehlednost, apod. :).

Existuje způsob jak to mít v samostatném souboru?

enumag
Člen | 2118
+
0
-

Jasně. Samostatný soubor s formulářem:

class LoginForm extends Nette\Application\UI\Form
{ ... }

A v BasePresenteru stačí jen toto:

protected function createComponentLoginForm()
{
	return new LoginForm;
}

Editoval enumag (14. 1. 2013 18:57)

castamir
Člen | 629
+
0
-

Napadá mě jen, že si uděláš komponentu, ve které uděláš veškerou definici prvků a chování a do BasePresenteru dáš jen

protected function createComponentLoginForm()
    { return new TvaKomponenta }

čímž ten kód v BasePresenteru minimalizuješ a zároveň bys to mohl použít i jinde (např. v jiném modulu, ale tím, že to máš v BasePresenteru se to stejně dostane do všech tříd, které od něj dědí).

Safra. Pozdě :D

edit: public=>protected

Editoval castamir (14. 1. 2013 19:46)

BuGeR
Člen | 45
+
0
-

Super díky vám :)
Takže, jiné řešení, než strkat cokoliv do BasePresenteru, neexistuje?

enumag
Člen | 2118
+
0
-

LoginForm do BasePresenteru strkáš pouze proto, že jej potřebuješ použít ve všech presenterech (layout sdílejí všechny presentery). Většina komponent ale patří jen jednomu konkrétnímu presenteru a tedy v BasePresenteru nemají co dělat.

@castamir: Neměly by továrničky být protected? ;-)

Editoval enumag (14. 1. 2013 19:24)

BuGeR
Člen | 45
+
0
-

Dobře. Děkuji moc

castamir
Člen | 629
+
0
-

enumag: ano! Copy&paste error z prvního příspěvku. My bad.

Šaman
Člen | 2666
+
0
-

Existuje ještě jedno řešení mírně okořeněné magií:

V BasePresenteru (tomu se nevyhneš) se může přetížit metoda createComponent($name) (ta se zavolá pokud nebyla nalezena žádná konkrétní továrnička).
A v ní si vytvářím komponenty z továrniček definovaných v configu. Ono se to hodí na více formulářů, které chceme použít na různých stránkách (potažmo v různých presenterech), nechceme-li opakované psát továrničky. Pak stačí přidat nově vytvořenou komponentu/formulář do příslušné sekce v configu a je možné ji používat napříč projektem.

Trocha magie tam je, ale vzhledem k nutnosti zavést továrničku do configu (tedy mít někde seznam takto dostupných komponent) si myslím, že to ještě projde.

Editoval Šaman (14. 1. 2013 23:48)

BuGeR
Člen | 45
+
0
-

Ok, děkuji :)