Úprava erroru [AuthenticationException() x flashMessage()]

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lopikol
Začátečník | 75
+
0
-

Používám tento modul:
https://doc.nette.org/…thentication

Poradili by ste mi prosím, jak vyměnit throw new AuthenticationException() za flashMessage()?
Pokud vyskočí error, tak se to ted vkládá do <form>. To nepotřebuji, jelikož mi to ho to pak celý rozhodí.
U flashMessage() si mohu určit místo, kde se bude danný error zobrazovat.

Authenticator.php

<?php

namespace AclProj\Security;

use Nette\Object,
    Nette\Environment,
    Nette\Security\Identity,
    Nette\Security\IAuthenticator,
    Nette\Security\AuthenticationException,
    Model\User;

class Authenticator extends Object implements IAuthenticator
{
    public function authenticate(array $credentials)
    {
        $email = $credentials[self::USERNAME];
        $row = User::findByEmail($email);

        if (!$row) {
            throw new AuthenticationException("Užívateľ s registračným emailom '$email' sa nenašiel!", self::IDENTITY_NOT_FOUND);
        }

        $config = Environment::getConfig('security');
        $password =  sha1($credentials[self::PASSWORD] . $config->salt);

        if ($row->password !== $password) {
            throw new AuthenticationException('Zadali ste nesprávne heslo!', self::INVALID_CREDENTIAL);
        }

        $identity = new Identity($row->id, $row->role);
        $identity->name = $row->name;
        $identity->email = $row->email;

        return $identity;
    }
}
?>

Editoval lopikol (11. 2. 2011 17:33)

Aurielle
Člen | 1281
+
0
-

Výjimky nech tak jak jsou, jen volání $form->addError() vymeň za $this->flashMessage().

mm-marek
Člen | 61
+
0
-

v metodě formSubmited se vyjímka hodí do formuláře ($form->addError($e->getMessage());).

flashMessage je metoda třídy Control, nemůžeš jí proto používat v tvojí ukázce

lopikol
Začátečník | 75
+
0
-

mm-marek: OK napadá mě to jedině přepsat. Tak jako mám řešené i jiné formuláře.

mm-marek
Člen | 61
+
0
-

jediný co máš přepsat ti napsal gmvasek, víc nad tím nepřemýšlej

lopikol
Začátečník | 75
+
0
-

No jenže, když to přepíšu jak psal gmvasek, tak to končí:
MemberAccessException

Call to undefined method AdminModule\Forms\LoginForm::flashMessage().

Aurielle
Člen | 1281
+
0
-

Nemáš přepisovat kód v Authenticatoru, ale v presenteru, ze kterého voláš $user->login().

lopikol
Začátečník | 75
+
0
-

gmvasek: Však já to nepřepisuji v authneticatoru (tam tento kod ani není), ale v tom formuláři kde je $form->addError().

Editoval lopikol (11. 2. 2011 20:59)

Nox
Člen | 378
+
0
-

V kódu kde voláš login() si odchytíš AuthenticationException a flashneš si co chceš … kdyžtak sem hoď kód

lopikol
Začátečník | 75
+
0
-
<?php
namespace AdminModule\Forms;

use Nette\Application\AppForm;
use Nette\Forms\Form;
use Nette\Environment;
use Nette\Security\AuthenticationException;

class LoginForm extends AppForm
{
    public function __construct($parent, $name)
    {
        parent::__construct($parent, $name);

        $this->addProtection('Prosím odošlite prihlasovacie údaje znova (vypršala platnosť bezpečnostného tokenu).');

        $this->addText('login', 'Email:')
            ->addRule(Form::FILLED, 'Prosím zadajte registračný email.')
            ->addRule(Form::EMAIL, 'Zadaný login nie je platná emailová adresa');

        $this->addPassword('password', 'Password:')
            ->addRule(Form::FILLED, 'Prosím zadajte heslo.');

        $this->addSubmit('send', 'Log in!');
        $this->onSubmit[] = array($this, 'formSubmited');
    }

    public function formSubmited($form)
    {
        try {
            $user = $this->getPresenter()->getUser();
            $user->login($form['login']->value, $form['password']->value);

            $this->getPresenter()->getApplication()->restoreRequest($this->getPresenter()->backlink);
            $this->getPresenter()->redirect('Homepage:Default');
        }
        catch (AuthenticationException $e) {
            $this->flashMessage($e->getMessage(), 'error'); //Zde jsem $form->addError() vyměnil za $this->flashMessage()
        }
    }
}
?>
Bertram
Člen | 75
+
0
-

musíš použít toto:

$this->getPresenter()->flashMessage($e->getMessage());
lopikol
Začátečník | 75
+
0
-

Bertram: Děkuji :)

Nox
Člen | 378
+
0
-