Presenter dva formuláře, špatné odeslání

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

Zdravím,
v presenteru vytvářím dva formuláře. Pokud pak vyplním druhý formulář a odešlu, zavolá se mi submit prvního formuláře. Na fóru jsem našel, že musím do constructoru vložit název. Potom mi to vyhodí chybu na řádku, kde form vytvářím (Argument 1 passed to Nette\Application\UI\Form::__construct() must implement interface Nette\ComponentModel\IContainer, string given, called in C:\Program Files (x86)\Xampp\htdocs\test\app\presenters\SignPresenter.php on line 19 and defined). Příkládám celý presenter. Děkuji za pomoc.

<?php

use Nette\Application\UI\Form;

/**
 * Sign in/out presenters.
 */
class SignPresenter extends BasePresenter
{
        /** @persistent */
        public $backlink = '';

	/**
	 * Sign-in form factory.
	 * @return Nette\Application\UI\Form
	 */
        protected function createComponentSignInForm()
        {
            $form = new Form('sign');
            $form->addText('mail', 'Mail:', 30, 43);
            $form->addPassword('pass', 'Heslo:', 30);
            $form->addCheckbox('persistent', 'Pamatovat si mě na tomto počítači');
            $form->addSubmit('login', 'Přihlásit se')
            ->setAttribute('class', 'btn btn-primary');
            $form->onSuccess[] = callback($this, 'signInFormSubmitted');
            return $form;
        }

        public function signInFormSubmitted(Form $form)
        {
            try {
                $user = $this->getUser();
                $values = $form->getValues();
                if ($values->persistent) {
                    $user->setExpiration('+30 days', FALSE);
                }
                $user->login($values->mail, $values->pass);
                $this->restoreRequest($this->backlink);
                $this->redirect('Homepage:');
            } catch (NS\AuthenticationException $e) {
                $form->addError('Neplatné uživatelské jméno nebo heslo.');
            }
        }

	/**
	 * Register form factory.
	 * @return Nette\Application\UI\Form
	 */
        protected function createComponentRegisterForm() {
            $form = new Form('register');
            $form->addText('name', 'Jméno');
            $form->addText('surname', 'Příjmení');
            $form->addText('mail', 'Mail:', 30, 43)
                    ->setEmptyValue('@')
                    ->addRule(Form::FILLED, 'Vyplňte Váš email')
                    ->addCondition(Form::FILLED)
                    ->addRule(Form::EMAIL, 'Neplatná emailová adresa');
            $form->addPassword('pass', 'Heslo:', 30)
                    ->setOption('description', 'Alespoň 6 znaků')
                    ->addRule(Form::FILLED, 'Vyplňte Vaše heslo')
                    ->addRule(Form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaků.', 6);
            $form->addPassword('pass2', 'Heslo znovu:', 30)
                    ->addConditionOn($form['pass'], Form::VALID)
                    ->addRule(Form::FILLED, 'Heslo znovu')
                    ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form['pass']);
            $form->addSubmit('register', 'Registrovat');
            $form->onSuccess[] = callback($this, 'registerFormSubmitted');
            return $form;
        }

        public function registerFormSubmitted(Form $form) {
            $result = $this->userRepository->register($form->values->name, $form->values->surname, $form->values->mail, $form->values->pass);
            if ($result) {
                $this->flashMessage('Registrace proběhla v pořádku.');
            } else {
                $form->addError('Uživatel s tímto mailem již existuje');
            }
        }
Šaman
Člen | 2666
+
0
-

Ty jména zruš, je to nesmysl. Komponenta je pojmenovaná podle názvy továrničky a obslužná metosa se zjistí v nastavení onSuccess. Nemělo by to dělat problémy. Jestli bude, tak napiš jaké.

duke
Člen | 650
+
0
-

EdWood napsal:
Na fóru jsem našel, že musím do constructoru vložit název. Potom mi to vyhodí chybu …

API plyne, že první parametr konstruktoru třídy UI\Form je rodičovská komponenta, nikoli řetězec se jménem (ten je až druhým parametrem).

Šaman napsal:
Ty jména zruš, je to nesmysl.

Někdy se hodí komponentu připojit už v továrničce (tj. zavolat konstruktor s parametry rodič a jméno). Např. když chceme už v továrničce nastavovat výchozí hodnoty a chceme to dělat jen pokud formulář nebyl odeslán (zjistit to lze pouze na již připojené komponentě formuláře). Kód továrničky pak vypadá takto.

Co se týče volání nesprávného submit handleru, tak k tomu nenacházím v kódu (po opravě oněch chybných parametrů konstruktoru) příčinu.

EdWood
Člen | 16
+
0
-

Děkuji za připomínky. Tak ty jména jsem zrušil. Pak to vypadá tak, že po odeslání registrace to skočí do signInFormSubmitted a následně to odchytí vyjímku NS\AuthenticationException. Ve finále se nacházím na url /sign/in?do=signInForm-submit.

Glottis
Člen | 129
+
0
-

to je nejake divne :) a jak vypada vyrenderovany zdrojak? formy maji jake action v html? nekrizi se? a pripadne sablona vypada jak?

EdWood
Člen | 16
+
0
-

Jsem blbec, zapoměl jsem ten první formulář uzavřít {/form} a proto se to chovalo takto divně. Omlouvám se, díky.