Nefunguje odeslani formulare
- volf.tomas
- Člen | 3
Dobry den, mam problem s odeslanim formulare… Nasledujici kod mam v BasePresenteru
<?php
abstract class BasePresenter extends Presenter
{
public function __construct() {
$this->template->loginForm = $this['loginForm'];
}
//login form
public function createComponentLoginForm() {
$form = new AppForm;
$form->addText("user", "")->setEmptyValue("Používateľské meno")->addRule(Form::FILLED, "Prosím vyplňte meno.");
$form->addText("password", "")->setEmptyValue("Heslo")->addRule(Form::FILLED, "Prosím vyplňte heslo.");
$form->addImage("send", "images/prihlasenie_button.png", "Odoslať");
$form->onSubmit[] = callback($this, "processLoginForm");
$renderer = $form->getRenderer();
$renderer->wrappers['controls']['container'] = 'table';
$renderer->wrappers['pair']['container'] = 'tr';
$renderer->wrappers['label']['container'] = NULL;
$renderer->wrappers['control']['container'] = 'td align="right"';
return $form;
}
public function processLoginForm(AppForm $form) {
die('b');
if($form['send']->isSubmittedBy()) {
die('a');
$this->redirect("Msg:view", array("msg" => "Na váš podnet budeme reagovať čo najskôr, ako to bude možné."));
}
}
}
?>
, v sablone pomoci
{$loginForm->render('begin')}
<table>
<tr class="required">
<td align="right">{$loginForm['user']->control}</td>
</tr>
<tr>
<td align="right">{$loginForm['password']->control}</td>
</tr>
<tr>
<td align="right"><a href="{plink User:forgottenPassword}" style="float: right; font-size: smaller; color: #474747;">Zabudol som heslo</a>{$loginForm['send']->control}</td>
</tr>
</table>
{$loginForm->render('end')}</script>
vykreslim formular a ocekaval bych, ze po jeho odeslani uvidim bilou obrazovku s jednim pismenem b. Nicmene zobrazi se uplne stejna stranka jako predtim… ale url se zmeni jakoby byl formular odeslan… Kde mam chybu? Respektive co mi unika? Jeste dodam ze mam verzi 1.0alpha a ze pro system jsem v presenteru XYZ, ktery extenduje BasePresenter (XYZ extends BasePresenter). Predem dik za rady a napady.
- Lopata
- Člen | 139
Ty si ten form vykresluješ manuálně. Zapomínáš ale vykreslit errory.
Takhle se běžně formuláře v nette chovají, pokud nejsou odeslány
validně → metoda processLoginForm se vůbec nezavolá.
Zkus
{if $form->getErrors()}<div class="error">{$form->render('errors')}</div>{/if}
Mimochodem, to s tím heslovým inputem vůbec není pěkné. Jak se má přihlásit uživatel bez javascriptu? Co když bude jeho heslo „Heslo“? Toto je v praxi lepší řešit absolutním napozicováním divu „nad“ input a pak jej jen schovávat…
Editoval Lopata (28. 5. 2010 12:33)
- volf.tomas
- Člen | 3
Lopata wrote:
Ty si ten form vykresluješ manuálně. Zapomínáš ale vykreslit errory. Takhle se běžně formuláře v nette chovají, pokud nejsou odeslány validně → metoda processLoginForm se vůbec nezavolá.
Zkus{if $form->getErrors()}<div class="error">{$form->render('errors')}</div>{/if}
tenhle radek jsem tam doplnil, ale zadna chyba se nevypise (v html kodu neni ani <div class=„error“>, takze zde chyba zrejme neni…)…
A jeste jsem zjistil, ze pokud v construktoru basePresenteru smazu to prirazeni $this->template->loginForm = $this[‚loginForm‘]; a formular vykreslim pres {widget loginForm}, tak vse funguje tak jak ma… Vi nekdo jak to udelat fungujici i s manualnim vykreslovanim?
ps: jsem to zmenil na password (pres addPassword) a bez defaultni hodnoty
Editoval volf.tomas (28. 5. 2010 13:02)
- volf.tomas
- Člen | 3
action*() je pro me nepouzitelne, ale vyresil jsem to pres startup(), diky za radu :)
- fejtis
- Člen | 16
Ahoj
Mám naprosto stejný problém, ale z uvedených nápadů nejsem moc
moudrý.
Do action zpracování dát nemůžu, protože Authenticator vyhazuje výjímky
a metoda
public function loginFormSubmited() mi na odeslání nereaguje. Do startupu bych
to asi mohl dát, ale jak dám vědět, že se jedná právě o tento
konkrétní form?
- fejtis
- Člen | 16
public function createComponentLoginForm($name) {
$form = new AppForm($this, $name);
$form->addText('email', 'Email')
->addRule(Form::FILLED, 'Nevyplnil(a) jste emailovou adresu.')
->addRule(Form::EMAIL, 'Zadejte platnou emailovou adresu.')
->setAttribute("onfocus", "isActive('','loginForm')")
->setHtmlId('loginForm')
->setValue('');
$form->addPassword('password', 'Heslo')
->addRule(Form::FILLED, 'Nevyplnil(a) jste vaše heslo.')
->setAttribute("onfocus", "isActive('','passForm')")
->setHtmlId('passForm');;
$form->addSubmit('login', 'Přihlásit se')
->setAttribute('class', '');
$form->onSubmit[] = array($this, 'loginFormSubmited');
return $form;
}
public function loginFormSubmited(AppForm $form){
echo 'do something';
}
V on submit jsem zkousel jak array, tak callback. Nejake formulare uz na webu mam a funguji v pohode, ale tenhle je v BasePresenteru a zobrazuje se na kazde strance.
- fejtis
- Člen | 16
Validace projde. Prepsal sem to cele od zacatku a uz to jde. Nechapu :). Nyni
vsak resim problem v metode loginFormSubmitted v BasePresenteru, kdykoli
pouzivam objekt $this napr:
$this->redirect(‚User:default‘);
$user = $this->getUser(); vyskoci chyba
Fatal Error Using $this when not in object context
V jinych metodach v tomto presenteru funguje v pohode. Diky a omlouvam se za zacatecnicke dotazy
- bojovyletoun
- Člen | 667
zřejmě používáš closury
$f->addsubmit()->onClick[]=function($Button){};
v netbeans
Create callbacks as closures- to vypni->
radši bych volil normální postup – vyčlenit metodu
v presenteru $f->addsubmit()->onClick[]=array($this,'cb'
Navíc co je to za omezení, že nejde v cložureách
používat =function($x)use($this){};