Otázky začátečníka

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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):

  1. Tvorba formulářů v render{View}() je příliš pozdě, viz. životní cyklus presenteru. Pro vytváření komponent používej továrničky (createComponent{name} nebo createComponent())
  2. V Nette applikaci nepoužívej Form, ale AppForm
  3. 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
+
0
-

jasir napsal(a):

  1. Tvorba formulářů v action{view}() je příliš pozdě, viz. životní cyklus presenteru. Pro vytváření komponent používej továrničky (createComponent{name} nebo createComponent())

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}.

Honza Marek
Člen | 1664
+
0
-

Prepare je deprecated, čili nepoužívat…

jasir
Člen | 746
+
0
-

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}.

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)

pekinen
Člen | 29
+
0
-

Honza M. napsal(a):

Prepare je deprecated, čili nepoužívat…

Tim si myslel jako vubec nikde a nikdy nepouzivat metody prepare{View/Action}?

jasir
Člen | 746
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

weckho
Člen | 94
+
0
-

Poslední dotaz beru zpět, moje chyba. Vše funguje jak má.