Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Kontynuacja akcji POST po zalogowaniu
Forum PHP.pl > Forum > PHP
markonix
W jaki sposób rozwiązujecie wymuszenie logowania w momencie wykonania jakiejś akcji.
Przykładowo "Dodaj komentarz" -> przekierowuje do /login, logowanie przebiega pomyślnie i w jaki sposób powtórzyć wysłanie komentarza.

W przypadku GET jest dosyć prosto - po prostu po zalogowaniu robimy redirect na url wyjściowy.
Przy POST już tak prosto nie jest.

Sesja? Pola hidden?
timon27
Przeładowanie bez zmiany adresu.
1plik wysyła dane do 2plik.

W 2plik zamieszczam:

  1.  
  2. if($zalogowany){
  3. //normalny kod
  4. }else{
  5. //formularz logowania na ajax.
  6. //po poprawnym zalogowaniu odświeża stronę
  7. }
markonix
Nie rozumiem nic z Twojego postu.

Jakie odświeżenie strony? Przecież po odświeżeniu tablica POST będzie pusta.
jackraymund
Ja bym w hidden załadował 2 pola
action i data
markonix
Dobra, widzę, że coraz większy poziom "rozwiązań" się pojawia.

Dla potomnych moje rozwiązanie (CodeIgniter).

Sprawdzamy czy nie ma jakiejś zapisanej akcji.
Jeżeli jest to przypisujemy do POST czyli symuluje jakby POST był wysłany ponownie.
Koniecznie kasujemy żeby potem się gdzieś przypadkiem ponownie nie wywołało.

Przy normalnym wysłaniu żądania sprawdzamy czy zalogowany.
Jeżeli nie to zapisujemy akcje i robimy normalnie logowanie.
Po logowaniu musi tylko wrócić na stronę i wykonuje się powyższy akapit.

Dla normalnego wywołania (zalogowanego) nic się nie dzieje nietypowego więc rozwiązanie jest dość transparentne.


  1. /* Checks logged now? */
  2. $saved_action = $this->session->userdata('saved_action');
  3. if (!empty($saved_action))
  4. {
  5. $post = $saved_action['post'];
  6. $this->session->unset_userdata('saved_action');
  7. }
  8. else
  9. {
  10. $post = $this->input->post(NULL, TRUE);
  11. }
  12.  
  13. /* Cart or Wish list */
  14. if ($post)
  15. {
  16. if (empty($this->data['logged']))
  17. {
  18. /* not logged so store action and go to login page */
  19. $this->save_post_action('design', $post); // Back URL and DATA
  20. $this->check_access(); // Redirect
  21. }
  22. else
  23. {
  24. if (isset($post['add_wish']))
  25. {
  26. $this->load->model('account_model');
  27. $this->account_model->add_wish($this->logged_id, $post['item_id'], $post['size']);
  28. redirect('account/wishlist');
  29. }
  30. }
  31. }
timon27
Cytat(markonix @ 1.09.2013, 11:37:08 ) *
Jakie odświeżenie strony? Przecież po odświeżeniu tablica POST będzie pusta.


Sprawdzałeś?
Raczej nie, bo jak byś sprawdził, to byś wiedział że przeglądarka ZAWSZE pyta czy wyzerować tablicę post czy pozostawić.


nospor
Cytat
Raczej nie, bo jak byś sprawdził, to byś wiedział że przeglądarka ZAWSZE pyta czy wyzerować tablicę post czy pozostawić.
Cos ci sie pomylilo z z wcisnieciem F5. Bo odswiezanie przez js (co Ty sugerowales) nic juz nie wysyla ponownie
markonix
Cytat(timon27 @ 3.09.2013, 12:37:13 ) *
Sprawdzałeś?
Raczej nie, bo jak byś sprawdził, to byś wiedział że przeglądarka ZAWSZE pyta czy wyzerować tablicę post czy pozostawić.

Nie trzeba sprawdzać oczywistych rzeczy.

Ponad to nie pytałem o rozwiązanie w JS bo takie można faktycznie szybko wyskrobać.
Choćby wyświetlić okno logowania, po zalogowaniu zaktualizować sesje, zamknąć okienko i albo poczekać na reakcje użytkownika albo wymusić submit.
Pytałem jednak o coś typowo server side.

Jak już odgrzebałeś temat to mała poprawka - mój kod działa, ale trzeba uważać w sytuacji gdy ktoś wykona akcje, nie zaloguje się i potem będzie chciał wrócić samodzielnie na stronę wyjściową - wymuszać będzie logowanie (linia 20). Dlatego trzeba jeszcze tam jakiś warunek dodać aby te sprawdzanie zapamiętanych akcji działo się tylko w momencie powrotu z strony autoryzacji (np. parametr GET).
timon27
Cytat(nospor @ 3.09.2013, 12:48:11 ) *
Bo odswiezanie przez js (co Ty sugerowales) nic juz nie wysyla ponownie

Cytat(markonix @ 3.09.2013, 19:41:34 ) *
Nie trzeba sprawdzać oczywistych rzeczy.

Jak widać trzeba.
Ja sprawdziłem - przy odświerzaniu przez js zapytał mnie.
markonix
Cytat(timon27 @ 3.09.2013, 21:55:39 ) *
js zapytał mnie.

Nie wiedziałem że potrafi mówić.

Pokaż kod.
timon27
Cytat(markonix @ 3.09.2013, 22:51:05 ) *
Pokaż kod.


Kod formularza i przycisku refresh?
ok...

Masz, zawartość pliku a.htm:
  1. <span onClick="document.location.reload(true)">refresh</span>
  2. <br>
  3. <form action=a.htm method=post>
  4. <input name=dump>
  5. <input type=submit>


Faktycznie, działa w firefox oraz internet explorer, ale już w chromie nie.
Mój błąd, miałem tylko te dwie przeglądarki.

Cytat(markonix @ 3.09.2013, 22:51:05 ) *
Nie wiedziałem że potrafi mówić.

Czy jeśli o coś zapytasz kolegę na gadu-gadu to go nie zapytałeś, bo nic nie mówiłeś, tylko pisałeś?
markonix
Nie można opierać ważnej funkcjonalności o coś tak różnie działającego.
Poza tym nadal uważam, że wymuszanie na użytkowniku potwierdzania ponownego wysłania POST z nadzieją, że zorientuje się, że chodziło o poprzednią akcje jest totalnie nie trafione. Algorytm jakby to można zrobić JSem już podałem i często widzę takie rozwiązania na stronie i się sprawdzają.
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.