Nefunguje odeslani formulare

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

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

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

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)

redhead
Člen | 1313
+
0
-

Konstruktory se v Nette nepřepisují!!

Když už tak využij startup() nebo rovnou nějaký pohled action*()

volf.tomas
Člen | 3
+
0
-

action*() je pro me nepouzitelne, ale vyresil jsem to pres startup(), diky za radu :)

fejtis
Člen | 16
+
0
-

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?

jasir
Člen | 746
+
0
-

Nechci to celé číst, ale – zpracování dát do loginFormSubmitted. Pokud nereaguje, máš to blbě, dej sem kód.

fejtis
Člen | 16
+
0
-
 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.

jasir
Člen | 746
+
0
-

zkus setValue()setDefaultValue()

fejtis
Člen | 16
+
0
-

Stále nic, pokud si dumpnu POST, je videt, ze se data odeslou. Ovsem nikde se nezpracovavaji. Opravdu mam totozny kod v normalnim presenteru a v base presenteru, funguje vsak pouze v normalnim.

jasir
Člen | 746
+
0
-

Vypisuješ si validační errory? Projde validace? Vyzkoušej onClick místo onSubmit. Co máš v BasePresenteru a co v normálním? Když to v normálním chodí, musí to chodit i z BasePresenteru. Bude to nějaká blbost.

fejtis
Člen | 16
+
0
-

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

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){};

Aurielle
Člen | 1281
+
0
-

Podpora $this v closurách bude přidána v dalších verzích PHP, prozatím lze obcházet takto:

$_this = $this;
$form->addSubmit('save', 'Save')
	->onClick[] = function(Nette\Forms\SubmitButton $button) use ($_this) {
		$_this->redirect('User:default');
	};