Redirect na odeslání formu po přihlášení + flashMessages
- Savannah
- Člen | 30
Ahoj, právě řešim takovej problém. Mam nějaký modul, kde když uživatel není přihlášený, tak ho to hodí na login page. Po přihlášení bych chtěl, aby ho to redirectlo zpět a zobrazilo mu to flashMessage. Jsem ve fázi, kdy redirect mi funguje napůl (pouze pokud redirectuje na GET požadavek, ne na POST odeslání formu) a flash vůbec.
Když udělám postup:
- přihlásim se
- v druhém panelu se odhlásim
- kliknu na nějaký GET odkaz vygenerovaný {link}em, třeba example.tld/admin/pages/list/
- hodí mě to na login form, který má v url backlink, např. /admin/login.html?backlink=3cf0
- vyplním přihlášení, odešlu form (action má /admin/login.html?backlink=3cf0&do=loginForm-submit)
- přesměruje mě to zpět na /admin/pages/list/, ale nezobrazí mi to tu flash message. Pokud se přihlásím bez toho ?backlink vyplněného, tak flash dostanu.
Pokud to samé praktikuju na odeslání formuláře:
- přihlásim se, zobrazí se mi nějaký formulář (AppForm), jsem na url /admin/test.html
- v druhém panelu se odhlásim
- odešlu formulář (action=/admin/test.html?do=test-submit)
- hodí mě to na login form, který má v url backlink, např. /admin/login.html?backlink=ad5d
- vyplním přihlášení, odešlu form (action má /admin/login.html?backlink=ad5d&do=loginForm-submit)
- tady už ale přesměrování vůbec není, zůstanu na url /admin/login.html?backlink=ad5d&do=loginForm-submit. Flash message se nezobrazí. Ale form má správně vyplněná data a pokud nekontroluji v jeho callback submit metodě (ta co se vyplňuje AppFormu jako $form->onSubmit[] = callback(…))
if ($this -> getRequest() -> hasFlag(PresenterRequest::RESTORED)) return;
tak se vykoná jeho odeslání.
Ale rád bych zobrazil ty flash messages a zároveň bych i u toho formu ocenil, když by mě to přesměrovalo zpět na tu /admin/test.html?do=test-submit. Lze tohle nějak vyřešit?
Nette Framework 0.9.3-dev (revision 42e9ad2 released on 2010–01–23).
Base presenter, který vyžaduje mít login:
protected function startup () {
parent::startup();
$user = Environment::getUser();
if (!$user->isAuthenticated()) {
$this->redirect('Auth:login', array('backlink' => $this->getApplication()->storeRequest()));
}
}
Na Auth:login jenom v šabloně vypíšu {widget loginForm}. Samotný Auth má
class Admin_AuthPresenter extends Admin_BasePresenter {
/** @persistent */
public $backlink = '';
// ...
public function loginFormSubmitted($form) {
try {
$user = Environment::getUser();
$user -> setAuthenticationHandler(new AdminUserHandler);
$user->authenticate($form['username']->getValue(), $form['password']->getValue());
$this->flashMessage('Byl jste přihlášen jako ' . $user->getIdentity() -> getName() . '.', 'true');
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('Admin:');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
- se tam vyrobí ten formálář (nic speciálního nemá, normální AppForm).
Ten testovací formulář:
class Admin_AdminPresenter extends Admin_SecuredPresenter {
public function createComponentTest () {
$form = new AppForm();
$form->addText('foo', 'Bar:');
$form->addSubmit('login', 'Login');
$form->onSubmit[] = callback($this, 'testFormSubmitted');
return $form;
}
public function testFormSubmitted ($form) {
if ($this -> getRequest() -> hasFlag(PresenterRequest::RESTORED)) return;
// do something with form
}
}
(zobrazuju přes {widget testForm} v šabloně)
- Ondřej Mirtes
- Člen | 1536
V Nette je bug, kdy nejde kombinovat restoreRequest a flash zprávičky (zkrátka se nezobrazí). Oprava se chystá.
Takže ti ještě nefunguje ta metoda loginFormSubmitted? A volá se vůbec?
- Vyki
- Člen | 388
Mám editaci statických stránek napsanou v podobném stylu a vše běhá v pohodě. Moc nechápu, kde by mělo být to nečekané chování. Popíšu jak to mám já
- v panelu 1 jsem přihlášen, jsem v editačním formu
- ve panelu 2 se odhlásím
- v panelu 1 odešlu form ke zpracování
- jsem přesměrován na přihlašovací form
- odešlu přihlašovací form
- jsem na stánce, kam mě odkáže redirect po úspěšném provedení post requestu – toho requestu který odeslal data k editaci + vyskočí flash message, která mi oznámí že se editace zdařila
Chová se to stejně s tím mezikrokem toho odhlášení/přihlášení jako
bez něj. Po každém POSTu muší byt přeci redirect. Takže jakmile jseš na
?do=test-submit
tak se ti ty data samozřejmě zpracujou a hned tě
to přesměruje. Nepochopil jsem jestli ti vadí, že se ty data po
přihlášení hned zpracují, ja ko že by jsi chtěl aby se to vrátilo na
krok, kde je vyplněný formulář?
Editoval Vyki (29. 1. 2010 17:43)
- Vyki
- Člen | 388
K těm falsh messages jsem něco našel zde https://forum.nette.org/…flashmessage. \\EDIT: jsem tu úpravu od Kravča z toho zmíněného příspěvku testoval a funguje to v pohodě
Editoval Vyki (29. 1. 2010 19:28)