Otázky začátečníka
- weckho
- Člen | 94
Ahoj,
pokouším se o první krůčky s Nette a mám několik otázek, nesmějte se mi :) Doteď jsem programoval tak, že jsem měl v jedné složce několik objektů a všechno ostatní v rootu :)
První otázka: V seriálu na Rootu je uveden kód pro vykreslení formuláře:
<table><tr class="required">
<th>{!$form['name']->label}</th>
<td>{!$form['name']->control}</td></tr>
....
Je v pořádku, pokud mám nad tím:
<?php $form = new Form; ?>
Nebo to do šablony nepatří? Popřípadě kam?
Děkuji.
- Jod
- Člen | 701
Takýto kód ti fungovať nebude, kedže tam nemáš vytvorené FormControly,
ktoré chceš vykresliť.
Neviem, či využívaš len časť Nette, alebo celé, lebo vytváranie
formulára patrí najelpšie do továrničky v Presenteru. Miesto vypytovania
by som mrkol do dokumentácie, kde otom kopa informácii, plus tu na fóre
ďalšia tona.
- weckho
- Člen | 94
Sorry, moje chyba, psal jsem to večer, už mi to moc nemyslelo a udělal jsem v tom chybu.. Presenter s FormControly k formuláři samozřejmě mám. Metoda, ve které je formulář definován, se jmenuje renderLogin(); a dotaz měl teda být: Je to tak správně, pokud mám v šabloně nad kódem (viz. výše) řádek:
<?php $form = new loginRender(); ?>
Díky.
- Petr Stribny
- Člen | 16
Tak já bych to hodil spíše do presentru, páč ti to umožní s tím formulářem manipulovat, což je skoro vždy potřeba. Btw nepleteš si trochu metody a třídy?
$form = new MujForm;
$this->template->form = $form;
- weckho
- Člen | 94
Tak teď už jsem zmatenej úplně :)
Mám v presentru (je to DefaultPresenter.php):
protected function renderLogin()
{
$form = new Form;
$form->addText('email', 'E-mail:')
->setEmptyValue('@')
->addCondition(Form::FILLED) // podmínka: pokud je e-mail vyplněn
->addRule(Form::EMAIL, 'E-mailová adresa není platná'); // pak musí být platný
$form->addPassword('password', 'Heslo:')
->addRule(Form::FILLED, 'Zvolte si heslo');
}
Jak to teď vypíšu do šablony? Chtěl bych použít CurlyBrackets.. Díky za každou radu.
- jasir
- Člen | 746
Přečti si dokumentaci a podívej se do examples na CDCollection jak se to dělá. Tohle je prostě všechno příliš špatně. Doporučuji používat nejnovější revizi Nette.
Pár poznámek (bez vysvětlování, vše je v manuálu):
- Tvorba formulářů v render{View}() je příliš pozdě, viz. životní
cyklus presenteru. Pro vytváření komponent používej továrničky
(
createComponent{name}
nebocreateComponent()
) - V Nette applikaci nepoužívej
Form
, aleAppForm
- Základem k pochopení Nette Frameworku je pochopení životního cyklu presenteru a stromu komponent.
Editoval jasir (16. 7. 2009 8:49)
- Patrik Votoček
- Člen | 2221
jasir napsal(a):
- Tvorba formulářů v action{view}() je příliš pozdě, viz. životní cyklus presenteru. Pro vytváření komponent používej továrničky (
createComponent{name}
nebocreateComponent()
)
Dlouho jsem sem nic nepsal (mám teď trochu jiné starosti než
programování) ale už to že píšeš action{view}
místo
action{Action}
mě trochu zarazilo… A tvrdit že ve fázi
action{Action}
je na formulře pozdě je divné mám tak postavenou
celou aplikaci a funguje. Asi jsi chtěl napsat
prepare{View/Action}
.
- jasir
- Člen | 746
Dlouho jsem sem nic nepsal (mám teď trochu jiné starosti než programování) ale už to že píšeš
action{view}
místoaction{Action}
mě trochu zarazilo… A tvrdit že ve fáziaction{Action}
je na formulře pozdě je divné mám tak postavenou celou aplikaci a funguje. Asi jsi chtěl napsatprepare{View/Action}
.
Omlouvám se za překlep, bylo pozdě v noci. Chtěl jsem říct, že pozdě
je na vytváření component v metodách render{View}
(tak, jak je
kolega používal výše). V odpovědi jsem to upravil.
Editoval jasir (16. 7. 2009 8:49)
- jasir
- Člen | 746
pekinen napsal(a):
Honza M. napsal(a):
Prepare je deprecated, čili nepoužívat…
Tim si myslel jako vubec nikde a nikdy nepouzivat metody prepare{View/Action}?
Ano, přesně to Honza myslel. Tady. I když ještě ta změna nebyla provedena, můžeš lobovat proti :-)
Editoval jasir (16. 7. 2009 9:11)
- pekinen
- Člen | 29
jasir napsal(a):
pekinen napsal(a):
Honza M. napsal(a):
Prepare je deprecated, čili nepoužívat…
Tim si myslel jako vubec nikde a nikdy nepouzivat metody prepare{View/Action}?
Ano, přesně to Honza myslel. Tady. I když ještě ta změna nebyla provedena, můžeš lobovat proti :-)
Nene ja nejsem proti. Taky si myslim, ze ten cyklus byl moc slozitej.
Obzvlast pro nas zacatecniky ;)
Jen bych pak poprosil zanest zmeny (nejen tuto) do dokumentace. Prave jsem
cyklus peclive z ni studoval ;) a teto planovane zmene jsem nevedel, tak jsem
byl ted trosku prekvapenej!
- weckho
- Člen | 94
Díky všem za rady, koukal jsem v examples na CD collection, ale je to tam přesně tak, jak to nechci. Chci v té šabloně vidět ty HTML značky tabulky, ve které login form mám, pracuje se mi tak s tím lépe. V uvedeném příkladu je na místě, kde má být login form, pouze:
{control loginForm}
Jak tedy dosáhnout toho, abych tam měl něco jako (jak je uvedeno mezi příklady na root.cz):
<table><tr class="required">
<th>{!$form['name']->label}</th>
<td>{!$form['name']->control}</td></tr>
....
Díky moc.
- jasir
- Člen | 746
weckho napsal(a):
Jak tedy dosáhnout toho, abych tam měl něco jako (jak je uvedeno mezi příklady na root.cz):
<table><tr class="required"> <th>{!$form['name']->label}</th> <td>{!$form['name']->control}</td></tr> ....
Pokud nechceš používat form jako celek, ale vypisovat jeho jednotlivé
části,
v metodě render<view>()
si do šablony přidej
proměnnou form:
<?php
public function renderLogin() {
$this->template->form = $this->getComponent('jmenoformu'); //v nejnovější revizi by mělo fungovat i $this['jmenoformu']
}
?>
V šabloně pak:
<?php
{$form->render('begin')}
<table>
<tr class="required">
<th>{!$form['name']->label}</th>
<td>{!$form['name']->control}</td>
</tr>
</table>
{$form->render('end')}
?>
Editoval jasir (16. 7. 2009 10:27)
- weckho
- Člen | 94
Díky moc, už jsem to zprovoznil a vše funguje až na jednu věc. U inputů textového typu (ani password a další) nemám ve vygenerovaném HTML kódu CSS class nastavenou na text, vlastně úplně chybí.. Nefunguje ani když do createComponent(); přidám:
$renderer = $form->getRenderer();
$renderer->wrappers['control']['.text'] = "text";
Formulář vykresluji do šablony metodou popsanou o příspěvek výše.
Děkuji moc.