Redirect na odeslání formu po přihlášení + flashMessages

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Savannah
Člen | 30
+
0
-

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:

  1. přihlásim se
  2. v druhém panelu se odhlásim
  3. kliknu na nějaký GET odkaz vygenerovaný {link}em, třeba example.tld/admin/pages/list/
  4. hodí mě to na login form, který má v url backlink, např. /admin/login.html?backlink=3cf0
  5. vyplním přihlášení, odešlu form (action má /admin/login.html?backlink=3cf0&do=loginForm-submit)
  6. 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:

  1. přihlásim se, zobrazí se mi nějaký formulář (AppForm), jsem na url /admin/test.html
  2. v druhém panelu se odhlásim
  3. odešlu formulář (action=/admin/test.html?do=test-submit)
  4. hodí mě to na login form, který má v url backlink, např. /admin/login.html?backlink=ad5d
  5. vyplním přihlášení, odešlu form (action má /admin/login.html?backlink=ad5d&do=loginForm-submit)
  6. 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
+
0
-

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
+
0
-

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á

  1. v panelu 1 jsem přihlášen, jsem v editačním formu
  2. ve panelu 2 se odhlásím
  3. v panelu 1 odešlu form ke zpracování
  4. jsem přesměrován na přihlašovací form
  5. odešlu přihlašovací form
  6. 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
+
0
-

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)

Savannah
Člen | 30
+
0
-

Dík. Ale moc se mi nechce zasahovat do samotného nette. Neni nějaká metoda jak to rozchodit „zvenku“?

Vyki
Člen | 388
+
0
-

Bez tohoto zásahu to asi jentak nerozběhneš. Možná si to ukládat do pomocné session nebo tak něco, ale nic jiného mě nenapadá. Nevím proč to není v Nette už opraveno, ví se o tom dost dlouho.

Editoval Vyki (5. 2. 2010 21:33)