Presenter dva formuláře, špatné odeslání
- EdWood
- Člen | 16
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');
}
}
- duke
- Člen | 650
EdWood napsal:
Na fóru jsem našel, že musím do constructoru vložit název. Potom mi to vyhodí chybu …
Z 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.