Diskuze: Špatné zpracování formuláře
Člen
jAk3r:2.4.2017 22:37
LoginPresenter.php
<?php
namespace App\CoreModule\Presenters;
use App\Forms\UserForms;
use Nette\Application\UI\Form;
use Nette\Utils\ArrayHash;
use Nette\Security\AuthenticationException;
final class LoginPresenter extends BaseCorePresenter
{
/** @var UserForms @inject */
private $userFormsFactory;
/** @var array Společné instrukce pro přihlašovací a registrační formuláře. */
private $instructions;
/** @persistent */
public $flashMessage;
/**
* Konstruktor s injektovanou továrničkou na uživatelské formuláře.
* @param UserForms $userForms automaticky injektovaná třída továrničky na uživatelské formuláře
*/
public function __construct(UserForms $userForms)
{
parent::__construct();
$this->userFormsFactory = $userForms;
}
/** Volá se před každou akcí presenteru a inicializuje společné proměnné. */
public function startup()
{
parent::startup();
$this->setLayout('layoutLogin');
$this->instructions = [
'message' => null,
'redirection' => ':Core:Administration:'
];
}
/**
* Vrací komponentu přihlašovacího formuláře z továrničky.
* @return Form
*/
protected function createComponentLoginForm()
{
$this->instructions['message'] = 'Byl jste úspěšně přihlášen.';
return $this->userFormsFactory->createLoginForm(ArrayHash::from($this->instructions));
}
/*
protected function createComponentLoginForm()
{
//$this->instructions['message'] = 'Byl jste úspěšně přihlášen.';
//$instructions = ArrayHash::from($this->instructions);
$form = new Form;
$form->addText('username', '')
->setAttribute('class', 'form-control')
->setAttribute('placeholder', 'Email address')
->setRequired('Zadejte username');
$form->addPassword('password', '')
->setAttribute('class', 'form-control')
->setAttribute('placeholder', 'Password')
->setRequired('Zadejte password');
$form->addSubmit('submit', 'Přihlásit')
->setAttribute('class', 'btn btn-default');
$form->onSuccess[] = [$this, 'onLoginFormSuccess'];
return $form;
}
public function onLoginFormSuccess(Form $form)
{
//$presenter = $this; // Získej presenter ve kterém je formulář umístěn.
//$this->redirect(':Core:Login:default');
$this->redirect(':Core:Login:default', []);
try {
$values = $form->getValues();
// Extrakce hodnot z formuláře.
$username = $values->username;
$password = $values->password;
//dump($username);
// Zkusíme zaregistrovat nového uživatele.
//if ($register) $this->user->getAuthenticator()->register($username, $password);
$this->user->login($username, $password); // Zkusíme se přihlásit.
// Pokud instrukce obsahují zprávu, tak ji pošli do příslušného presenteru.
$this->flashMessage('Byl jste úspěšně přihlášen.');
//$this->restoreRequest($this->backlink);
//$this->redirect(':Core:Administration:');
} catch (AuthenticationException $ex) { // Registrace nebo přihlášení selhali.
$this->flashMessage('Něco se porouchalo');
}
}*/
}
UserForms.php
<?php
namespace App\Forms;
use Nette\Application\UI\Form;
use Nette\Object;
use Nette\Security\AuthenticationException;
use Nette\Security\User;
use Nette\Utils\ArrayHash;
/**
* Class UserFormsFactory
* @package App\Forms
*/
class UserForms extends Object
{
/** @var User Uživatel. */
private $user;
/**
* Konstruktor s injektovanou třidou uživatele.
* @param User $user automaticky injektovaná třída uživatele
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Přihlašuje a případně registruje uživatele.
* @param Form $form formulář, ze kterého se metoda volá
* @param null|ArrayHash $instructions uživatelské instrukce
* @param bool $register registruj nového uživatele
*/
private function login($form, $instructions, $register = false)
{
$presenter = $form->getPresenter(); // Získej presenter ve kterém je formulář umístěn.
try {
$values = $form->getValues();
// Extrakce hodnot z formuláře.
$username = $values->username;
$password = $values->password;
// Zkusíme zaregistrovat nového uživatele.
if ($register) $this->user->getAuthenticator()->register($username, $password);
$this->user->login($username, $password); // Zkusíme se přihlásit.
// Pokud jsou zadány uživatelské instrukce a formulář je umístěn v presenteru.
if ($instructions && $presenter) {
// Pokud instrukce obsahují zprávu, tak ji pošli do příslušného presenteru.
if (isset($instructions->message)) $presenter->flashMessage($instructions->message);
// Pokud instrukce obsahují přesměrování, tak ho proveď na příslušném presenteru.
if (isset($instructions->redirection)) $presenter->redirect($instructions->redirection);
}
} catch (AuthenticationException $ex) { // Registrace nebo přihlášení selhali.
if ($presenter) { // Pokud je formulář v presenteru.
$presenter->flashMessage($ex->getMessage()); // Pošli chybovou zprávu tam.
$presenter->redirect('this'); // Proveď přesměrování.
} else { // Jinak přidej chybovou zprávu alespoň do samotného formuláře.
$form->addError($ex->getMessage());
}
}
}
/**
* Vrací formulář se společným základem.
* @param null|Form $form formulář, který se má rozšířit o společné prky, nebo null, pokud se má vytvořit nový formulář
* @return Form formulář se společným základem
*/
private function createBasicForm(Form $form = null)
{
$form = $form ? $form : new Form;
$form->addText('username', '')->setAttribute('class', 'form-control')->setAttribute('placeholder', 'Email address')->setRequired();
$form->addPassword('password', '')->setAttribute('class', 'form-control')->setAttribute('placeholder', 'Password');
return $form;
}
/**
* Vrací komponentu formuláře s přihlašovacími prvky a zpracování přihlašování podle uživatelských instrukcí.
* @param null|Form $form komponenta formuláře, která se má rozšířit o přihlašovací prvky, nebo null, pokud se má vytvořit nový formulář
* @param null|ArrayHash $instructions uživatelské instrukce pro zpracování registrace
* @return Form komponenta formuláře s přihlašovacími prky
*/
public function createLoginForm($instructions = null, Form $form = null)
{
$form = $this->createBasicForm($form);
$form->addSubmit('submit', 'Přihlásit')->setAttribute('class', 'btn btn-default');
$form->onSuccess[] = function (Form $form) use ($instructions) {
$this->login($form, $instructions);
};
return $form;
}
/**
* Vrací komponentu formuláře s registračními prvky a zpracování registrace podle uživatelských instrukcí.
* @param null|Form $form komponenta formuláře, která se má rozšířit o registrační prvky, nebo null, pokud se má vytvořit nový formulář
* @param null|ArrayHash $instructions uživatelské instrukce pro zpracování registrace
* @return Form komponenta formuláře s registračními prky
*/
public function createRegisterForm($instructions = null, Form $form = null)
{
$form = $this->createBasicForm($form);
$form->addPassword('password_repeat', 'Heslo znovu')
->addRule(Form::EQUAL, 'Hesla nesouhlasí.', $form['password']);
$form->addText('y', 'Zadejte aktuální rok (antispam)')->setType('number')->setRequired()
->addRule(Form::EQUAL, 'Špatně vyplněný antispam.', date("Y"));
$form->addSubmit('register', 'Registrovat');
$form->onSuccess[] = function (Form $form) use ($instructions) {
$this->login($form, $instructions, true);
};
return $form;
}
}
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.
Zobrazeno 4 zpráv z 4.