form a handlery
- bbb_
- Člen | 11
Zdravim, potřebuju poradit. Nějak nechápu, kde a jak se mají volat handlery po zpracování formuláře.
Chci mít formulář pro přihlášení uživatele, kterej po odeslání vypíše chybu (pokud nastane). Ty chyby jsou dvě – neznámý uživatel a špatné heslo. Chyba se vypíše nad formulářem.
V presenteru mam takovýto kód:
<?php
class ProceedPresenter extends BasePresenter
{
public function renderDefault()
{
$form = new Form;
$form->addGroup('Přihlášení');
$form->addText('name', 'Jméno', 20)
->addRule(Form::FILLED, 'Vyplňte jméno');
$form->addPassword('pass', 'Heslo', 20)
->addRule(Form::FILLED, 'Vyplňte heslo');
$form->addGroup();
$form->addSubmit('submit1', 'Přihlásit se')
->onClick[] = 'OkClickedHandler';
// https://forum.nette.org/cs/839-best-practice-obsluha-formularu
$this->template->form = $form;
}
public function OkClicked(SubmitButton $button)
{
$this->redirect('index.php');
}
?>
Po odeslání formuláře k žádnému přesměrování nedojde. Myslim si totiž, že se kód nedostane ani do funkce OkClicked. Co dělám špatně? Ztrácim se v tom už totálně…
- Ondřej Brejla
- Člen | 746
Pořád to samé…hledat, továrničky, AppForm, …
class ProceedPresenter extends BasePresenter
{
public function createComponentForm($name)
{
$form = new AppForm($this, $name);
$form->addGroup('Přihlášení');
$form->addText('name', 'Jméno', 20)
->addRule(Form::FILLED, 'Vyplňte jméno');
$form->addPassword('pass', 'Heslo', 20)
->addRule(Form::FILLED, 'Vyplňte heslo');
$form->addGroup();
$form->addSubmit('submit1', 'Přihlásit se')->onClick[] = array($this, 'okClicked');
}
public function okClicked(SubmitButton $button)
{
// smth stf
}
?>
V šabloně
{control form}
nezkoušel jsem…z hlavy…
Editoval Warden (18. 8. 2009 17:57)
- kravčo
- Člen | 721
Názov handlera musí pochopiteľne súhlasiť s menom funkcie („OkClickedHandler“ vs. „OkClicked“)
Navyše, keďže je handler metódou prezenteru, v callbacku to treba uviesť. Píše sa to i vo vlákne, ktoré si pripísal do odkazu… Takže správne:
class ProceedPresenter extends BasePresenter
{
public function renderDefault()
{
// ...
$form->addSubmit('submit1', 'Přihlásit se')
// callback: array(<object>, <methodName>)
->onClick[] = array($this, 'OkClicked');
// ...
}
}
Dôležité je, že tieto handlery sa zavolajú len v prípade, že je
formulár valídny. Pre opačný prípad treba pridať handler na udalosť
onInvalidClick
.
A tiež, ako píše Warden, použi AppForm
a prečítaj si
Správne
vytváranie formulárov.
Editoval kravčo (18. 8. 2009 17:58)
- bbb_
- Člen | 11
zdravim, díky, oba jste mi pomohli, už mi to šlape, akorát jeden problém, chtěl bych vypisovat chybu do stejnýho template jako mam ten formulář, pro jistotu posílam ještě jednou celý kód:
<?php
require dirname(__FILE__).'../../models/MyAuthenticator.php';
class ProceedPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->form = $this['form'];
}
protected function createComponentForm($name)
{
$form = new AppForm($this, $name);
$form->addGroup('Přihlášení');
$form->addText('name', 'Jméno', 20)
->addRule(Form::FILLED, 'Vyplňte jméno');
$form->addPassword('pass', 'Heslo', 20)
->addRule(Form::FILLED, 'Vyplňte heslo');
$form->addGroup();
$form->addSubmit('submit1', 'Přihlásit se')->onClick[] = array($this, 'okClicked');
return $form;
}
public function okClicked(SubmitButton $form)
{
$values = $form->form->getValues();
$username = $values['name'];
$password = $values['pass'];
$user = Environment::getUser();
// zaregistrujeme autentizační handler
$user->setAuthenticationHandler(new MyAuthenticator);
// nastavíme expiraci
$user->setExpiration('+ 30 minutes');
try {
// pokusíme se přihlásit uživatele...
$user->authenticate($username, $password);
// ...a v případě úspěchu presměrujeme na další stránku
Environment::getHttpResponse()->redirect('index.php');
} catch (AuthenticationException $e) {
$this->template->error = $e->getMessage();
}
// this is the end, my friend :-)
if (empty($disableExit)) exit;
}
}
?>
přihlašování funguje, ovšem jakmile nastane chyba, vypíše se na prázdnou stránku (ne nad formulář). myslim si, že tady odkazuju na neznámý template, jak to teda udělat?
<?php
} catch (AuthenticationException $e) {
$this->template->error = $e->getMessage();
}
?>
díky
- kravčo
- Člen | 721
jasir napsal(a):
Jinak si ještě říkám k tomu tvému redirectu, jestli neni lepší použít
<?php $this->redirect('JinyPresenter:jinaAkce'); ?>
Určite je.
Navyše pri použití HTTP redirectu je nutné zavolať bezpodmienečný exit:
Environment::getHttpResponse()->redirect('index.php');
exit;