Špatné zpracování formuláře
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- jAkErCZ
- Člen | 324
Čau kluci,
Mám takový dost zvláštní problém mám vytvořený formulář pro
přihlašování ale z nějakého nesmyslného důvodu posílá data do url a
tím pádem se nic nestane…
/rs-nette/prihlaseni/?flashMessage=1&username=admin&password=aaaaaa&_submit=Přihlásit&_do=loginForm-submit
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;
}
}
Nevíte někdo čím by to mohlo být způsobené?
A také když se pokusím prozkoumat prvek tak v form mám jako → <form novalidate="">
Předem všem děkuji za rady.
S pozdravem
jAk3r
Editoval jAkErCZ (2. 4. 2017 22:40)