Převedení formuláře do nette podoby

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

Zdravím, už jsem bezradný a opravdu nevím jak to řešit. S Nette začínám a tak mám v tom stále trochu guláš. V @layoutu mám tento formulář:

<div id="loginContainer">
   <a href="#" id="loginButton">
     <span>Přihlášení
     </span>
     <em>
     </em></a>
   <div style="clear:both">
   </div>
   <div id="loginBox">
     <form id="loginForm" action="strankaKdeProbehneValidace" method="post">
       <fieldset id="body">
         <fieldset>
           <label for="email">Přihlašovací jméno
           </label>
           <input type="text" name="login" id="email" value="<?php echo @$_POST["login"]?>" />
         </fieldset>
         <fieldset>
           <label for="password">Heslo
           </label>
           <input type="password" name="heslo" id="password" value="<?php echo @$_POST["heslo"]?>"/>
         </fieldset>
         <input type="submit" id="login" value="Přihlásit" />
         <label for="checkbox">
           <input type="checkbox" id="checkbox" />Zapamatovat si mě
         </label>
       </fieldset>
       <span>
         <a href="#">Zapomněli jste heslo?</a>
       </span>
     </form>
   </div>
 </div>

A nevím jak to předělat do Nette formy, aby když kliknu na přihlásit, aby mi se mi provedla validace vložených dat. Trochu bych chápal, kdybych chtěl mít vlastní prezenter, který mi vykreslil celý formulář a tam proběhla i validace. Jenže mám přihlášení hned na úvodní stránce (rozklíkávací menu) a tak nevím jak dál. Budu opravdu vděčný za jakoukoliv výpomoc.

jtousek
Člen | 951
+
0
-

Nejdříve budeš potřebovat továrničku na ten formulář.

Tím vytvoříš komponentu, kterou pak můžeš v šabloně vykreslit makrem:

{control signInForm}

Anebo pokud chceš zachovat svoje HTML, můžeš použít makra pro manuální vykreslování.

EDIT: Mimochodem formuláře v Nette zpravidla fungují tak, že action neřešíš, necháš formulář zvalidovat na původním presenteru a navěsíš mu událost onSuccess kde teprve budeš mít redirect na stránku po přihlášení.

Editoval jtousek (1. 9. 2012 18:05)

Draffix
Člen | 146
+
0
-

Právě že tu továrnu i to základní vykreslení mám, ale nechápu to manuální vykreslení. Konkrétně nechápu ty příklady z dokumentace:

<?php $form->render('begin') ?>
<?php $form->render('errors') ?>

<table>
<tr class="required">
    <th><?php echo $form['name']->label ?></th>
    <td><?php echo $form['name']->control ?></td>
</tr>

<tr class="required">
    <th><?php echo $form['age']->label ?></th>
    <td><?php echo $form['age']->control ?></td>
</tr>

...

</table>

<?php $form->render('end') ?>

a následné:

{form signForm}

<!-- Jednoduché vykreslení chyb -->
<ul class="errors" n:if="$form->hasErrors()">
        <li n:foreach="$form->errors as $error">{$error}</li>
</ul>

<table>
<tr class="required">
    <th>{label name /}</th>
    <td>{input name}</td>
</tr>

...

</table>
{/form signForm}

Nevím jestli se tyto dva příklady mají používat oba, nebo jestli je ten druhý příklad rozšíření toho prvního. Mám to trochu pomotané. Pokud se mají použít oba, kam mají přijít? Který do továrny a který do šablony?

jtousek
Člen | 951
+
0
-

Prvního si nevšímej, druhý patří do šablony. Továrnu máš na tom prvním odkazu co jsem posílal.

Draffix
Člen | 146
+
0
-

Když do šablony vložím {control signForm} tak to jede bez problémů. Ale když tam dám např. tohle

{form signForm}
<table>
<tr class="required">
    <th>{label name /}</th>
    <td>{input name}</td>
</tr>
</table>
{/form signForm}

Tak mi to hlásí chybu Unknown macro {form contactForm}. Raději uvedu i továrnu a homepresenter:

class HomepagePresenter extends BasePresenter
{

    public function createComponentSignForm($name) {
        return new SignForm($this, $name);
    }
  }
class SignForm extends AppForm {

    public function __construct(Nette\IComponentContainer $parent = NULL, $name = NULL) {
        parent::__construct($parent, $name);

        $this->buildForm();
    }

    protected function buildForm() {
        $this->addText('name', 'Your name:')
                ->setRequired('Enter your name');

        $this->addText('email', 'Email:')
                ->setEmptyValue('@');

        $this->addSubmit('ok', 'Odeslat');
    }

}