Napojeni html form sablony na handler

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

Zdravim, zacinam s nette a narazil jsem na jednu „neprijemnost“. Pri tvorbe formularu je vsude pouzit php kod pro jejich generovani, ovsem pro generovani slozitejsich formularu a hlavne jejich stylovani mi to prijde znacne neprehledne a neprijemne. Je mozne mit treba nejaky html nastylovany form a jeho submit napojit na nejaky handler, aby fungoval stejne, jako bych ho tvoril pres $form->addSubmit(..., ...)->onClick[] = ButtonClick";

Diky za info

kravčo
Člen | 721
+
0
-

Vykresľovanie formulárov v Nette zabezpečuje objekt implementujúci rozhranie IFormRenderer. Štandardne je to ConventionalRenderer. Vytváranie formulárov teda (takmer) nijako nesúvisí s ich vykresľovaním, obe činnosti sú (takmer) nezávislé. Ak teda potrebuješ špeciálne vykresľovanie, potrebuješ vlastný renderer, alebo formulár vykresľovať „ručne“ v šablóne.

ConventionalRenderer je vcelku dobre nastaviteľný, ale na zložitejšie formulárové layouty je krátky. No zdá sa, že svitá na lepšie časy:

ConventionalRenderer → 20 řádků kódu

grogy
Člen | 147
+
0
-

Formulář si můžeš nechat vygenerovat pomocí Nette, a pak si jej ručně vykreslit ($form[‚element‘]->label a $form[‚element‘]->control) To ti nabídne slušné možnosti vlastních úprav zobrazení a budeš to mít včetně všech vychytávek co NForm nabízí (JS validace, ořezávání bílých znaků, …)

Dj_Oggy
Člen | 67
+
0
-

2 kravčo: To sice vypada zajimave, ale nevim proc, ale prijde mi to mozna az moc neprehledne a slozite :/ Muze to byt tim, ze teprve s timhle stylem sablonovani zacinam a nemam to zabehle v krvi.

2 grogy: Tohodle stylu zapisu jsem si uz vsiml a zkusim se na nej podivat blize, jestli mi nabidne to, co bych potreboval.

Ono mi jde treba o to, ze kdyz jsem zkousel priradit Submitu css class pomoci ->getControlPrototype()->class('tlacitko');, tak ve vysledne vygenerovane strance sem mel u toho tlacitka class="tlacitko button". Nevim jestli to je vlastnosti Nette nebo nejaka chybka.

Momentalne jsem to zkusil udelat tak, ze si v tovarnicce vygeneruju ten form, ale pouze se submit tlacitkem, ktery ma prirazeny handler onClick. Pak mam v sablone normalne html kod formulare, kde ten submit ma stejny nazev jako v te tovarnicce. Dokonce po stisknuti to funguje a zavola se spravny handler, ale jeste sem nezkousel ziskavat hodnoty z formulare.

redhead
Člen | 1313
+
0
-

myslím, že těžko dostaneš ty hodnoty z (programově) nevytvořeného formuláře.

Osobně si myslím, že formuláře v Nette jsou v tomhle ohledu dosti nedotažené.

Chtěl jsem s tím něco udělat, ale neměl jsem moc čas:
https://forum.nette.org/…rovani-formu

Dj_Oggy
Člen | 67
+
0
-

No podle me je budu muset asi klasickou post cestou, ale kdo vi, zkoumat to budu az zitra.

Editoval Dj_Oggy (20. 8. 2009 21:33)

Dj_Oggy
Člen | 67
+
0
-

Dneska jsem to zkoumal, a moje momentalni reseni, i kdyz ne uplne asi nejlepsi je toto:

@layout.phmtl

<div class="boxObsah">
    <form action="/Test/?do=login-submit" method="post" >
        <div class="prihlaseni">
            <label for="inputLogin">Login:</label><br />
            <input type="text" name="inputLogin" id="frmlogin-inputLogin" value="" /><br />

            <label for="inputPass">Heslo:</label><br />
            <input type="password" name="inputPass" id="frmlogin-inputPass" value="" />

            <input type="submit" name="ok" class="tlacitko" value=" Přihlásit" />
         </div>
    </form>
</div>

BasePresenter.php

<?php
	protected function createComponentLogin($name)
	{
		$form = new AppForm ( $this, $name );

		$form->addText ( 'inputLogin', "Login:");
		$form->addPassword ( 'inputPass', "Heslo:" );

		$form->addSubmit ( 'prihlasit', "Prihlasit" )
        		->onClick[] = array($this, 'LogInClicked');

        return $form;
	}

	public function LogInClicked()
	{
		$form = $this->getComponent('login');

		//$this->redirect("...");
	}
?>

Vlastne si virtualne vytvorim login komponentu a v sablone mam svuj nastylovany formular, kteremu jsem nastavil presne ty same jmena a parametry, jake by vygenerovala komponenta. V handleru lze pak docela snadno dostat udaje, ktere chceme.

Je to sice takove skarede reseni (i kdyz asi jedine problizne mozne, protoze ty handlery se musi nekde zaregistrovat vzdycky), ale funguje zatim tak, jak ma.

David Grudl
Nette Core | 8227
+
0
-

To je špatné řešení. Pokud odešleš špatně vyplněný formulář, data se ztratí a nezobrazí uživateli znovu. Proč nepoužiješ $form[‚element‘]->label a $form[‚element‘]->control?

Dj_Oggy
Člen | 67
+
0
-

Rikam, ze to neni asi nejlepsi reseni a ze ho jeste nemam otestovane zcela.

Ja bych to mozna i pouzil, ale nejak spatne to prirazuje class. Nevim, jestli to je vlastnosti nebo chyba nette, ale kdyz dam priradit controle class (jak jsem psal vyse, treba „tlacitko“), tak ve vyrenderovanem kodu mam napr. u prvku Submit class="tlacitko button".

David Grudl
Nette Core | 8227
+
0
-

To je vlastnost, pozůstatek z minulosti. Lze to změnit nastavením $form->renderer->wrappers['control']['.button'] = 'tlacitko'; Viz další volby.

Dj_Oggy
Člen | 67
+
0
-

Dik, zkusim to predelat.

Jeste jeden dotaz. Momentalne mam v BasePresenteru tvorbu te komponenty v tovarnicce a pomoci widget ji nahravam do @layout.phtml sablony. Ovsem pokud to tedka mam delat rucne pomoci prirazovani label a control, kde mam ten form priradit pro @layout.phtml sablonu tak, abych ji nemusel renderovat v kazdem presenteru? Ve zkratce "Jak udelat presenter pro @layout.phtml"

Edit: Tak jsem nasel beforeRender pro BasePresenter

Editoval Dj_Oggy (21. 8. 2009 14:54)

Etch
Člen | 403
+
0
-

Nebo by snad šlo použít :

$presenter['form']['element']->label
$presenter['form']['element']->control

atd.

Dj_Oggy
Člen | 67
+
0
-

Mozna ano, ale nejdriv se ta komponenta musi vytvorit a ta se tvori, az kdyz je potreba (zavola se widget, aspon tak jsem to pochopil). Nyni to mam udelane tak, ze v constructoru BasePresenteru mam volani na createComponentLogin a vraceny form vlozim do promenne templatu.

Nebo lze nejak nette prinutit k automaticke tvorbe komponenty bez pouziti widget?

kravčo
Člen | 721
+
0
-

Dj_Oggy napsal(a):

Mozna ano, ale nejdriv se ta komponenta musi vytvorit a ta se tvori, az kdyz je potreba (zavola se widget, aspon tak jsem to pochopil). Nyni to mam udelane tak, ze v constructoru BasePresenteru mam volani na createComponentLogin a vraceny form vlozim do promenne templatu.

Nebo lze nejak nette prinutit k automaticke tvorbe komponenty bez pouziti widget?

Komponent sa vytvorí vtedy, keď je potrebný, pri volaniach

$presenter['form']['name']->label
$presenter['form']['name']->control

potrebný je. Okolo továrničky nie je žiadna mágia, kedy sa vytvorí a kedy nie. Pri prvom prístupe ku komponentu zbehne továrnička a ďalšie ho už len ťahajú vytvorený.

Dj_Oggy
Člen | 67
+
0
-

Aha takhle, ja myslel, ze to reaguje jen na widget. Takze kdyz budu mit metodu createComponentFormular a v sablone:

$presenter['formular']['name']->label
$presenter['formular']['name']->control

Tak se mi zavola ta tovarnicka createComponentFormular?

Editoval Dj_Oggy (21. 8. 2009 19:26)

Honza Kuchař
Člen | 1662
+
0
-

jo