Napojeni html form sablony na handler
- Dj_Oggy
- Člen | 67
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
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:
- grogy
- Člen | 147
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
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
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
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
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
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
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
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)
- Dj_Oggy
- Člen | 67
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
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
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)