Nefunguje ajax v control u formuláře
- tttpapi
- Člen | 100
Ahoj,
můj problém → Mám tlačítko, na to když kliknu, tak se mi objeví dialogové okno s formulářem. Když formulář odešlu, tak se změní obsah dialogového okna. Když okno zavřu a znova kliknu na tlačítko, tak by se mi měl opět objevit první formulář.
Struktura vypadá teď následovně.
Mám Presenter, ve kterém jsou tlačítka.
protected function startup() {
parent::startup();
}
protected function createComponentRestorationPasswordDialog()
{
return new RestorationPasswordDialog($this, $this->model);
}
Ten vytvoří objekt dialogu.
use Nette\Application\UI;
class RestorationPasswordDialogDialog extends UI\Control
{
private $model;
private $presenter;
public function __construct($presenter, $model) {
parent::__construct();
$this->model = $model;
$this->presenter = $presenter;
}
public function render() {
$this->template->setFile(__DIR__ . '/RestorationPasswordDialog.latte');
$this->template->render();
}
protected function createComponentDialogForm() {
$pom = new DialogFormFactory($this->model, $this->presenter, $this, 'RestorationPasswordForm');
$form = $pom->form;
return $form;
}
}
RestorationPasswordDialog.latte vypadá následovně
<button id="restore-password">restore-password</button>
<div id="restorationPswdForm" title="Obnovení hesla">
{snippet restoreForm}
{control dialogForm}
{/snippet}
</div>
V dialogu volám DialogFormFactory, ve které se vybírá obsah dialogového okna.
class DialogFormFactory {
private $presenter;
private $controlDialog;
private $name;
public $confirm;
private $model;
public $form;
public function __construct($model, $presenter, $controlDialog, $name)
{
$this->presenter = $presenter;
$this->controlDialog = $controlDialog;
$this->name = $name;
$this->model = $model;
$page = 1;
if( $page == 1 ){
if( $this->name == 'RestorationPasswordForm' ){
$this->form = $this->getRestorationPasswordForm();
}
}
else if ( $page == 2){
$this->form = $this->getConfirmForm();
}
}
protected function getConfirmForm(){
return new ConfirmForm($this->presenter, $this->controlDialog, $this->name, $this);
}
protected function getRestorationPasswordForm(){
return new RestorationPasswordForm($this->model, $this->presenter, $this->controlDialog, $this);
}
RestorationPasswordForm vytvoří formulář pro obnovu hesla.
use Nette\Application\UI,Nette\Forms\Form;
class RestorationPasswordForm extends Nette\Application\UI\Form {
private $model;
private $presenter;
private $controlDialog;
private $dialogFormFactory;
public function __construct($model, $presenter, $controlDialog, $dialogFormFactory)
{
parent::__construct();
$this->model = $model;
$this->presenter = $presenter;
$this->controlDialog = $controlDialog;
$this->dialogFormFactory = $dialogFormFactory;
$this -> addText('email', 'Přihlašovací email:', 30)
-> addRule(Form::EMAIL, 'Musíte zadat platnou emailovou adresu.')
-> setRequired('error');
$this -> addSubmit('submit', 'Obnovit heslo');
$this -> onSuccess[] = callback($this, 'restorationPasswordFormSubmitted');
return $this;
}
public function restorationPasswordFormSubmitted($form) {
$values = $form->getValues();
$email = $values['email'];
$password = Password::generatePassword();
$passwordHash = Password::calculateHash($password);
$usersTable = $this -> model -> getUsers();
$usersTable -> where("email", $email) -> update(array('password' => $passwordHash));
Mails::restorePasswordMail( $password, $email );
if (!$this->presenter->isAjax()) {
$this->presenter->redirect('this');
} else {
$form->setValues(array(), TRUE);
$this->controlDialog->invalidateControl('restoreForm');
$this->presenter['restorationPasswordDialog']->invalidateControl();
}
}
}
A latte soubor
{form restorationPasswordForm class => ajax}
<div class="task-form">
{label email /} {input email size => 30, autofocus => true} {input submit id => restore}
</div>
{/form}
Takhle mi to bylo doporučeno. První problém je, že když jsem to takto předělal, tak se mi to přestalo validovat ajaxově. A netuším, jak donutit ten {control dialogForm}, aby fungoval ajaxově. Pak potřebuju nějak zajistit, aby se mi měnil obsah toho okna.
Nebo pokud by mi někdo řekl, jak to udělat úplně jinak, tak se tomu nebráním. Hlavně mi jde o to, aby to fungovalo tak, jak to mám zadané.
Díky všem za radu.