Flashmessage se po přihlášení nezobrazují
- darthcz
- Člen | 113
Dobrý den,
chtěl bych vás požádat o pomoc s následujícím problémem:
Mám presentery na registraci a přihlášení, které mi normálně vypisují flash zprávičky, z čehož lze usoudit, že layout bude správně. Po přihlášení se ale bohužel nezobrazí už žádná flash zprávička, a to v žádném presenteru :( Přitom po každé akci je v url normálně ?_fid=f8ea. Nevíte, čím by to mohlo být?
Za odpověď děkuji
- Cifro
- Člen | 245
Kedysi som aj ja chcel flash message po prihlasení a to na vypisanie, že sa uspešne prihlásil, ale to je somarina že? Veď keď ho to prihlasí tak ho to prihlasí, keď nie tak vypiše chybu pred prihlasovací formulár.
Ale v Nette je (asi ešte stále) bug, kedy nie je možné kombinovať (re)storeRequest s flashMessages.
Možno ti pomože, táto úprava re-storerequest-a-flashmessage?pid=18245#p18245
Editoval Cifro (3. 7. 2010 19:01)
- darthcz
- Člen | 113
No, mám presenter pro registraci, kde je po odeslání následující kód:
public function registrationFormSubmitted($form) {
try {
$values = $form->values;
if ($values['heslo'] != $values['heslo_confirm'])
throw new AuthenticationException('Vámi zadaná hesla se neshodují!');
unset($values['heslo_confirm']);
$data = $this->registrate($values);
//indikator chyby $data[-1]
if (!isset($data[-1])){
$template = new Template;
$template->registerFilter(new LatteFilter);
$template->setFile(APP_DIR.'/templates/Registrate/email.phtml');
$template->email = $values['email'];
$template->heslo = $values['heslo'];
$mail = new Mail;
$mail->setFrom('Krokus <info@krokus.cz>');
$mail->addTo($values['email']);
$mail->setSubject('Registrace do systému Krokus');
$mail->setHtmlBody($template); // nebo $mail->setBody($template) pro textovou šablonu
$mail->send();
$this->flashMessage('Byl jste úspěšně registrován(a).');
$this->redirect('Login:login');
}
else
throw new AuthenticationException($data['-1']);
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
Přesměruje to tedy uživatele na jiný presenter. Dříve to ale fungovalo. Nevím přesně, která úprava zkazila zobrazení například této zprávy… Ale v podstatě to nejde skoro nikde. V layoutu je to správně. Někde se hláška zobrazí.
V url adrese se nachází ?_fid=f5ef
- Vyki
- Člen | 388
Mně osobně fungují flash messages naprosto bez problémů. Mám poslední verzi Nette a běhá to vpohodě i při odhlašování a přihlašování. Odlaďuješ to na localu? Zkus tu chybu izolovat postupným zakomentováním kódu. Flash messages pracují se session, tak se mrkni jestli jí někde někde „neníčíš“.
- darthcz
- Člen | 113
odin napsal(a):
Nepomohlo by tohle?
https://forum.nette.org/…lash-message
bohužel nepomohlo :(
Zkusímj to odkomentovávání. Nicméně vše funguje pokud smažu řádek $this->redirect :P Když se nepřesměruje, vše běží, jak má. Jakmile se ale přesměruje, žádná hláška už není :(
- darthcz
- Člen | 113
uestla napsal(a):
Co se děje v
LoginPresenter::login()
, resp. v jiných metodách živ. cykluLoginPresenteru
?
On v podstatě ani není důležitý zrovna LoginPresenter, jelikož to nejde v žádném presenteru s přesměrováním :(
LoginPresenter
class LoginPresenter extends BasePresenter
{
/**
* Login form component factory.
* @return mixed
*/
function __construct(){
parent::__construct();
}
protected function createComponentLoginForm() {
$form = new AppForm;
$form->addText('email', 'E-mail:')
->addRule(Form::EMAIL, 'Zadejte prosím platnou e-mailovou adresu!');
$form->addPassword('heslo', 'Heslo:')
->addRule(Form::FILLED, 'Zadejte prosím své heslo!');
$form->addSubmit('login', 'Přihlásit');
$form->onSubmit[] = callback($this, 'loginFormSubmitted');
return $form;
}
public function loginFormSubmitted($form)
{
try {
$values = $form->values;
$user = new User;
// přihlášení
$authenticator = new MyAuthenticator();
$user->setAuthenticationHandler($authenticator);
$user->login($values['email'], $values['heslo']);
if ($user->isLoggedIn()){
$this->redirect('Clanky:show');
}
else
throw new AuthenticationException('Špatný e-mail nebo heslo!');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
public function renderLogout() {
Environment::getUser()->logout();
$this->flashMessage('Byl jste úspěšně odhlášen.');
$this->redirect('Login:login');
}
}
}
BasePresenter
abstract class BasePresenter extends Presenter
{
const TAB_USERS = 'users';
const TAB_CLANKY = 'clanky';
const TAB_KLICOVA_SLOVA = 'klicova_slova';
const TAB_CLANKY_KLICOVA_SLOVA = 'clanky_klicova_slova';
protected static $model;
protected static $user;
protected function startup(){
parent::startup();
if ((!Environment::getUser()->isLoggedIn()) && ($this->getAction() != 'login') && ($this->getAction() != 'registrate'))
$this->redirect('Login:login');
if (Environment::getUser()->isLoggedIn()) {
if (($this->getAction() != 'restricted') && ($this->getAction() != 'login') && ($this->getAction() != 'registrate'))
if ((!Environment::getUser()->isAllowed($this->name, $this->view)))
$this->redirect('Login:restricted');
}
}
public function __construct(){
self::$user = Environment::getUser();
if (self::$user->getIdentity())
$this->template->logged_user = self::$user->getIdentity()->getID();
else
$this->template->logged_user = false;
}
}
login.phtml
{var robots => noindex}
{var title => " | Přihlášení"}
{block #content}
<div align="center">
<div id="login">
<h1>Krokus - přihlášení</h1>
{widget loginForm}
<a href="{plink Registrate:registrate}" class="register-odkaz" title="Pro úspěšné přihlášení se musíte zaregistrovat !">Registrace</a>
</div>
</div>
- Vyki
- Člen | 388
darthcz napsal(a):
tak chyba byla v constructoru v basepresenteru… zřejmě tam nesmí být, tak sem ho smazal… díky za pomoc..
A nezapomněl jsi volat construktor rodiče?
<?php
class BasePresenter
{
public function __construct()
{
//nejaky kod
parent::__construct();
}
}
?>
Pokud chceš nějaký blok kódu provádět v ranné fázi životního cyklu je lepší použít metodu startup.
<?php
class BasePresenter
{
public function startup()
{
//nejaky kod
parent::startup();
}
}
?>