Více formulářů na jedné stránce – s třídou Form

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

Dobrý den,
jsem v NETTE úplný začátečník, používám NETTE/Form samostatně. (tzn. ne AppForm)
Když odešlu formulář s neplatnými údaji a je povolen JS, tak vyskočí hláška a vše je ok. Pokud ovšem vypnu JS, formulář vypisuje stále pouze chyby, které nastaly v 1. formuláři, i když jsem odeslal, ten druhý. Tzn. 1. funguje bez nejmenších problémů, každý další má problém. :( (Jestli funguje $f->isSubmitted() jsem nezkoušel)

Používám následující kód:

<?php
      $fPrihlasit = new Form("fPrihlasit");
      $fPrihlasit->getElementPrototype()->name="loginForm";
      $fPrihlasit->addText('uzivatel', 'Uživatelské jméno')
      	->addRule(Form::FILLED, 'Zadej uživatelské jméno!');
      $fPrihlasit->addPassword('heslo', 'Heslo')
      	->addRule(Form::FILLED, 'Zadej heslo!');
      $fPrihlasit->addSubmit('odeslat', 'PŘIHLÁSIT');

      if ($fPrihlasit->isSubmitted() AND $fPrihlasit->isValid()) {
      	$values = $fPrihlasit->getValues();
      	//Debug::dump($values);
      	login($values["uzivatel"],$values["heslo"]);
      }
      echo $fPrihlasit;

/* /////////////////////////////////////////////////////////////////////////////////////// */

      $fRegistrace = new Form("fRegistrace");
        $msg = " je poviný údaj!";
      $fRegistrace->addText('jmeno'   ,'Jméno')
        ->addRule(Form::FILLED, 'Jméno '.$msg);

      $fRegistrace->addText('prijmeni','Příjmení')
      	->addRule(Form::FILLED, 'Příjmení '.$msg);

      $fRegistrace->addText('mesto'   ,'Město')
      	->addRule(Form::FILLED, 'Město '.$msg);

      $fRegistrace->addText('user'    ,'Uživatelské jméno')
      	->addRule(Form::FILLED, 'Uživatelské jméno '.$msg);

      $fRegistrace->addPassword('pass'    ,'Heslo')
      	->addRule(Form::FILLED, 'Heslo '.$msg);

      $fRegistrace->addPassword('pass2'    ,'Heslo znovu')
      	->addRule(Form::FILLED, 'Prosím zadejte heslo i podruhé.');

      $fRegistrace->addText('email'   ,'E-mail')
      	->addRule(Form::FILLED, 'E-mail '.$msg)
      	 ->addRule(Form::EMAIL, 'E-mail není platný!')
      	  ->emptyValue = "@";

      $fRegistrace->addSubmit('odeslat', 'REGISTROVAT');
      echo $fRegistrace;
?>

Editoval honzakuchar (15. 3. 2009 0:43)

vlki
Člen | 218
+
0
-

Tady je problém s tím, že třída Form neřeší, odkud ten post přišel. Viz api https://api.nette.org/…orm.php.html#359

Řešením by tedy bylo nastavit jim do action nějaké různé adresy (např. jen v query řetězci) nebo nějaké skryté pole a formulář identifikovat podle tohoto. Asi není počítano s tím, aby dva diametrálně různé formuláře zpracovával stejný skript.

Honza Kuchař
Člen | 1662
+
0
-

Díky moc. Myslel jsem si, že to tak dopadne. :) Takže už jsem web přepsal tak, aby používal MVC → používám teď AppFrom. Jestli to funguje nevím, zatím jsem to nezkoušel.

vlki
Člen | 218
+
0
-

Nemáš zač. U AppForm s tím problém není, teda pokud využíváš událostí:)

Honza Kuchař
Člen | 1662
+
0
-

Jasný :) Ještě k tomu new Form() → pokoušel jsem se to ještě udělat přes ruční přidání proměné „do“ do URL, ale to taky nefungovalo. :( Ale to je jedno, to už je pryč, už je tady MVC a vše je ok :)

Mimo chodem – poznatek z krátké praxe s Nette frameworkem: „Nette je opravdu perfektní framework. Když ho na nějaké části aplikace prostě používat nechci, nemusím. :) Opravdu super. :) Díky za něho. ;) Ještě akorát doufám, že nenarazím na něco, když už bude aplikace z 99% hotová, co framework neumí. Ale myslím si, že je to hodně nepravděpodobné vzhledem k rozšířitelnosti Nette. Takže když něco neumí, většinou se s tím ještě pořád dá něco dělat.“

P.S.: Dobrou noc všem, co ještě v těhle pozdních hodinách okouní tady na fóru. :)