Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF][ZendFramework] Przekierowanie po określonym czasie
Forum PHP.pl > Forum > PHP > Frameworki
Vill
Hej smile.gif Wygooglowałam, że takie przekierowanie można osiągnąć przez wywołanie sleep(n) przed redirectem, ale u mnie nie działa to tak jak bym chciała.

Mam taką sytuację:

Akcja kontrolera generuje formularz, który w parametrze action ma inną akcję tego kontrolera. Po submicie, jak wiadomo, przetworzenie danych, dodatkowa walidacja, jakieś komunikaty o niepowodzeniu lub powodzeniu operacji. Chciałabym, żeby po wyświetleniu takiego komunikatu (np. o powodzeniu akcji) strona odczekała kilka sekund a potem nastąpiło przekierowanie z powrotem do formularza. Niestety w tym momencie wygląda to tak, że formularz nie przechodzi na stronę kontrolera podanego w action, nie wyświetlają się żadne komunikaty, tylko przez kilka sekund się odświeża. W sensie, wygląda jakby od razu wykonywał się redirect który trwa aż kilka sekund (zend postawiony lokalnie na wampie).

Kod:

  1.  
  2. public function changeAction() {
  3.  
  4. $login = $this->_getParam('login');
  5.  
  6. //sprawdzenie czy klient istnieje
  7. $clientData = $this->clientTable->fetchRow('ClientLogin = "'.$login.'"');
  8.  
  9. if($clientData != null) {
  10.  
  11. $this->changeForm->setMethod('post')
  12. ->setAction('/client/changeform');
  13.  
  14. //elementy
  15. $login_input = $this->changeForm->createElement('hidden', 'login_input', array('value' => $login));
  16. ....
  17. $submit = $this->changeForm->createElement('submit', 'submit', array('value' => 'Wyślij'));
  18.  
  19. //walidatory
  20. ....
  21.  
  22. //filtry
  23. ....
  24.  
  25. //złożenie formularza
  26. $this->changeForm->addElement($login_input)
  27. ....
  28. ->addElement($submit);
  29.  
  30. //przekazanie formularza do widoku
  31. $this->view->changeForm = $this->changeForm;
  32.  
  33. } else {
  34.  
  35. $this->view->changeMessage = '<div class="red-alert">Nie znaleziono użytkownika o podanym loginie.</div>';
  36. }
  37. }
  38.  
  39. public function changeformAction() {
  40.  
  41. if ($this->_request->isPost() && $this->changeForm->isValid($_POST)) {
  42.  
  43. $login = $this->_request->getPost('login_input');
  44.  
  45. //sprawdzenie hasła
  46. if(...) {
  47. $this->view->changeMessage = '<div class="red-alert">Niepoprawne hasło</div>';
  48. sleep(2);
  49. $this->_redirect('/client/change/login/'.$login);
  50. return;
  51. }
  52.  
  53. $data = array(
  54. .....
  55. );
  56.  
  57. //update rekordu
  58. $check = $this->clientTable->update($data, 'ClientLogin = "'.$login.'"');
  59.  
  60. if($check<=0){
  61. $this->view->changeMessage = '<div class="red-alert">Błąd</div>';
  62. sleep(2);
  63. $this->_redirect('/client/change/login/'.$login);
  64. return;
  65. }
  66.  
  67.  
  68. $this->view->changeMessage = '<div class="green-alert">Operacja udana</div>';
  69. sleep(2);
  70. $this->_redirect('/client/change/login/'.$login);
  71. }
  72. }
  73.  
Daimos
No korzystasz już z frameworków i dalej nie wiesz, że PHP wykonuje się po stronie serwera?
Sleep jedynie opóźnia wyplucie Twojego kodu, redirect wykonuje się i tak, zanim dostaniesz odpowiedź z serwera.
Masz dwa wyjścia:
1. wyświetlasz komunikat i ustawiasz nagłówek meta z przekierowaniem czasowym, albo javascript,
2. korzystasz z flashMessengera, który jest w ZF, albo piszesz swoją obsługę komunikatu i wyświetlasz go, już PO przekierowaniu.
Osobiście bym wybrał drugą opcję wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.