Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:30.10.2019 21:18

Pouzitie udalosti window.onbefo­reunload

Zkusil jsem: skusal som window.onunload, window.onbefo­reunload, ale podpora na Firefox, Opera, Chrome je nejasna...

Chci docílit: Potreboval by som pravdepod. v JS vytvorit udalost pri ktorej by po potvrdeni zavreti okna, by sa web presunul na url stranku odhlasenia s unset($_SESSI­ON['user']); ...kde by doslo k update na nastavenie uzivatela na offline...

Odpovědět
30.10.2019 21:18
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Milan Turyna
Tvůrce
Avatar
Milan Turyna:31.10.2019 9:33

Kdyby jsi tohle aplikoval na nějaký web tak bych tam moc dlouho nezůstával. protože přihlašovat se pokaždé po tom co zavřu okno a za 3 sekundy ho zase otevřu se mi moc nechce.. Pokud chceš mít nějaký offline/online status tak stačí to mít udělané úplně jednoduše že budeš mít prodlevu na online a offline a bude to pouze o expiraci session (čas potom co uživatel je neaktivní si můžeš nastavit).

web presunul na url stranku odhlasenia s unset($_SESSI­ON['user']);

Podle mně je ještě horší nápad ale docílit aby se po zavření okna redirectlo na nějakou jinou stránku (myslím že to možná ani nejde, jelikož prohlížeč si vynutí zavření) ale prostě když uživatel klikne na křížek tak to má fungovat jako křížek.

Kdybych viděl něco takovéto na webu, tak tam moc dlouho nezůstanu, pokud si ale myslel po zavření prohlížeče tak to se dá něco takového udělat pomocí websocketů (aspoň myslím) že budeš komunikovat s prohlížečem do té doby než se nevypne (ale zase nevím jak to je s podporou u prohlížeču a nebo jestli to tak vůbec funguje, ale mělo by to jít.)

Nahoru Odpovědět
31.10.2019 9:33
Řeš pouze to, co dokážeš ovlivnit.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:31.10.2019 11:16

No, evidentne jsi nepochopil problemy, ktere jsem zminoval v tech starych tematech.
Jedine skutecne dobre pouziti tehle udalosti jsem videl pri editaci. Uzivatel neco edituje, neklikne ulozit, vykrizkuje okno a to ho upozorni, ze neulozil, jestli opravdu chce okno zavrit.

Ve Firefoxu to funguje od verze 1.
https://developer.mozilla.org/…unload_event

 
Nahoru Odpovědět
31.10.2019 11:16
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Milan Turyna
Otvorený Zdroj:31.10.2019 13:19

protože přihlašovat se pokaždé po tom co zavřu okno a za 3 sekundy ho zase otevřu se mi moc nechce..

Tak logika hovori, ze ked zavrem co i len kartu, tak tam asi nechcem byt :-), a keď znovu otvoris web, zase musis nieco natukat..tak natukas aj prihlasenie:-), zdrhat sa nevyplati :-) ..ani auto nenechas neuzamknute, ked zavres dvere, nenastavujes mu expiracnu dobu kedy sa ma samo zavret. :-)

bude to pouze o expiraci session,

podla problematiky aspon viem ze tie statusy nebudu potom uplne hodnoverne, ak sa nepouzije websocket....

Nahoru Odpovědět
31.10.2019 13:19
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Milan Turyna
Tvůrce
Avatar
Milan Turyna:31.10.2019 14:03

Ale predstav si uzivatel ma vic karet na tvem webu a kdyz jednu zavre, musi se znova prihlasit na vsech. Prirovnani neni moc dobre.. Predstav si ze mas facebook a po zavreti okna se to automaticky odhlasi ale za 2 minuty tam jdes znova a musis se prihlasovat, na itnetworku, na google, vsude nic takoveho nemas jelikoz po delsi dobe to lidi bude stvat.

Nahoru Odpovědět
31.10.2019 14:03
Řeš pouze to, co dokážeš ovlivnit.
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Milan Turyna
Otvorený Zdroj:31.10.2019 14:22

to ano na vic karet sa to nehodi, ale po zavreti celeho prehliadaca, by som to aspon zvazil :-)

Nahoru Odpovědět
31.10.2019 14:22
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar

Člen
Avatar
:31.10.2019 14:37

Riešením je implementovať prezenčný protokol. Už hotový, alebo urobiť vlastný, napr. nad websoketmi.

 
Nahoru Odpovědět
31.10.2019 14:37
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.11.2019 8:34

S temi sockety to funguje tak, ze mas na serveru spusteny socket server. Tam se pres js prihlasis a dokud se neodhlasis, bude si stranka se serverem pingat. Kdyz nekdo prestane odpovidat, tak ti server vyhodi udalost s error, na kterou muzes navazat dalsi kod, predat mu udaje, id uzivatele, aby ho odlogoval.
A ted je uz na tobe, jestli si to cele udelas sam, treba i v php a nebo pouzijes hotove reseni. Pokud se da neco vygooglovat. Takove, ktere by streba zvladalo i vic oken najednou.

 
Nahoru Odpovědět
1.11.2019 8:34
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:1.11.2019 16:16

Ten socket, asi nesposkytuje bezny webhosting, pre zaciatok by stacilo, nieco ako update predlzovanie casu expiracie u prihlasaneho.

Myslim cas prihlasenia + session expiracia v php a po vyprsani expiracie keby bol uzivatel este stale prihlaseny by bol poslany alert potvrdte prihlasenie.

Session expirancia php by bola znizena z 24min, napr.na 12min, a po potvrdeni alertu by sa predlzovala o 12min, len co by bolo z casom keby sa cakalo na potvrdenie....ten by sa tiez musel niekde nastavit napr.na 12 minut a potom by vykonal odhlasenie natvrdo bez potvrdenia...

Nieco hotove by ma celkom potesilo :-)

Nahoru Odpovědět
1.11.2019 16:16
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Otvorený Zdroj
Jaroslav Smrž:1.11.2019 17:04

Ty tomu moc nechceš rozumět, co ti tu všichni říkají. WebSockets je nejlepší / jediná možnost, jak udělat to, co požaduješ. Sockety se píšou třeba v JSON, Node.js, Angular, SignalR a podobně. Podle toho, jakou používáš technologii. Např pro .NET aplikace je nejlepší SignalR. U PHP to bude asi jedno, jaký jazyk použiješ. Pokud se v tom vůbec neorientuješ, tak zde zadej nabídku k práci a někdo ti to určitě napíše. Pokud chceš zjistit víc, tak tuším, že tu někde byl článek o secketech, ale bude už asi starý. Popis SignalR najdeš zde

Nahoru Odpovědět
1.11.2019 17:04
/* Life runs on code */
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Otvorený Zdroj
Otvorený Zdroj:1.11.2019 17:40

Websocket potrebuje podporu webhostingu, alebo VPS server...zase niekomu poslat do vrecka, ak mas link na sponzora, tak...kludne dam websocket...

Websocket dam maximalne na chat. Na prihlasovanie a statusy staci...co som napisal....takto napr,.funguje u fio banky...a nikto sa nestazuje ...jedine co treba je optimalne nastavit optimalne casy....

Nahoru Odpovědět
1.11.2019 17:40
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar

Člen
Avatar
Odpovídá na Otvorený Zdroj
:2.11.2019 11:33

Žiadne optimálne časy neexistujú. Má to tak aj Wordpress a ľudí vie nenormálne nasrať, že po tom, čo pol hodinu prácne editovali článok, im ho následne WP neuloží, pretože boli odhlasení v dôsledku neaktivity. A nad týmto premýšľaš len preto, aby si ušetril tri eurá mesačne...

Editováno 2.11.2019 11:34
 
Nahoru Odpovědět
2.11.2019 11:33
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:3.11.2019 0:34

3E sice nie je vela, ale k tomu treba priratat aj nove ucenie, a momentalne tlaci cas...

Pridavanie casu do session je jednoduchsie, nikoho nenaserie, ked vyprsi cas, ukaze alert predlzit session...a vybavene...moje JS je slabsie, takze ak ma niekto..dobry skript, budem rad :-)

Nahoru Odpovědět
3.11.2019 0:34
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.11.2019 8:13
  • Web socket je dobry proto, ze posila ping 2-4 byte sam, periodicky a tim udrzuje spojeni. A sam ti da vedet, kdyz spojeni vypadne. Problem muze nastat, pokud ma clovek nestabilni pripojeni. Wifi, treba huste snezi, vypadky. Cili, je to az prilis citlive, prilis casto si pinga, prilis kratky cas (nevim to ted z hlavy, ale myslim, ze se jedna o ms, s).

Ten cas jde ale tusim snad nastavit... Nejsem si ted moc jisty, nepouzivam to zatim nikde, jenom nejake testy jsem zkousel.

  • Session je proti tomu celkem idealni. To drzi spojeni 17 minut a je tak odolnejsi na kratke vypadky a samo se obnovi pri otevreni noveho okna, prepnuti stranky.
  • Muzes udelat neco jako web-sockety pomoci js ajaxu. Javascriptem otevirat stranku do skryteho iframe / object (nebo js httprequestem do promene). Nevyhoda je, ze pri nacitani stranky se posila 1000-2000 byte hlavicka + stranka. Ping websocketu byl 2 byte. Tady bych dal treba 5 takovych stranka-pingu nez bych prohlasil uzivatele za definitivne odpojeneho. Opet totiz muze mit vypadky spojeni a muze ho to pri prvnim pozde odeslanem pingu odlogovat.
  • Ja bych zkombinoval websocket a ajax. Ajax by navazal websocketove pripojeni a kdyz by padlo, tak se nic nedeje, ajax periodicky zkusi znovu. Tady se jedna rekneme tak o 10-100-200 byte. Podstatne je, aby se mu to aspon jednou rekneme z 10 pokusu podarilo. Pak to pripojeni muze hned zrusit. Sice to bude bytove neusporne, ale tebe vic nezajima.

Nicmene, stale je tu moderni usporny prohlizec, ktery potlaci prave neaktivni okno (pokud mas 10 oken, tak jedno mas na popredi, ostatni jsou na pozadi, neaktivni) do pozadi a snizi mu tez vykonavani javascriptu. Timpadem ajaxove i websocketove reseni muze padnou. Ikdyz, ws si nejspis pohlida prave kvuli nenarocnosti. Kdo vi. Nezkousel jsem.

 
Nahoru Odpovědět
4.11.2019 8:13
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Peter Mlich
Otvorený Zdroj:6.11.2019 3:03
<!DOCTYPE HTML>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
p {
  text-align: center;
  font-size: 60px;
  margin-top: 0px;
}
</style>
</head>
<body>

<p id="demo"></p>

<script>

// Tu hodnotu z DB do var countDownDate = '<?php $this->vrat_time_expire() ?>';
var countDownDate = new Date().getTime()+10000;

// Update the count down every 1 second
var x = setInterval(function() {

  // Get today's date and time
  var now = new Date().getTime();

  // Find the distance between now and the count down date
  var distance = countDownDate - now;

  // Time calculations for days, hours, minutes and seconds
  var days = Math.floor(distance / (1000 * 60 * 60 * 24));
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);

  // Output the result in an element with id="demo"
 // document.getElementById("demo").innerHTML = days + "d " + hours + "h "
 // + minutes + "m " + seconds + "s ";

    document.getElementById("demo").innerHTML = minutes + "m " + seconds + "s ";

  // If the count down is over, write some text
  if (distance < 5000) {

    r=window.confirm('Stránka za 5min(5s) expiruje, želáte si predlžiť čas a ostať prihlásený? ');
    if (r == true) {
     document.write("You pressed OK!");

//<?php $this->update_time_expire() ?>

clearInterval(x);

 }
  else {

    document.write("You pressed Cancel!");

    //<?php header("Location: /cms/logout"); ?>

  clearInterval(x);
  }

  }
}, 1000);
</script>

</body>
</html>

Ajax momentalne neovladam a JS len zaklady, chcem to vyskusat na locahoste, tak aby preberalo hodnoty z DB, a odpocitavanie bolo skryte, ukazalo len vystrazne okno ked prejde stanoveny odpocitavaci cas. OK predlzi session, vykona update v DB , CANCEL - odhlasi uzivatela.... len neviem akoby JS prebral tie hodnoty PHP....

Nahoru Odpovědět
6.11.2019 3:03
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6.11.2019 8:32

google = ajax firefox example
https://developer.mozilla.org/…_API/Example

Ale muzes to resit treba pres tag script

--- index.htm ---
<script src="" id="aaa"></script>
<input type=button value=klikni onclick="myclick()">
<script>
const $ = document.querySelector.bind(document);
function myclick()
{
$('#aaa').src = 'stranka.php' + '?' + Date.now(); // ten datum je tam kvuli kesovani
}
</script>

--- stranka.php ---

<?php
ob_start();
header('Content-Type: application/javascript');
header('Content-Type: text/html; charset=UTF-8');
$time = date("m.d.y H:i:s", time());
$str = "
    alert('$time');
";
echo $str;
?>
// nebo (kvuli, pokud se ti nechce komentovat uvozoky, da se pouzit zapis s <<<)
$str = <<<EOF
    alert('$time');
EOF;
// a nebo ukoncit php
?>
    alert('<?php echo $time; ?>');
    alert('<?= $time; ?>');
Editováno 6.11.2019 8:34
 
Nahoru Odpovědět
6.11.2019 8:32
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Peter Mlich
Otvorený Zdroj:8.11.2019 3:32

Session tych max 24min sa odpocitava, odkedy jedna so stranok webu pustena, a pokial sa prejde na druhu stranku toho isteho webu uz sa pocita odznova 24minut u prihlaseneho?

Kazdy reload stranky spusti vzdy nove odpocitavanie session?

Nahoru Odpovědět
8.11.2019 3:32
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Otvorený Zdroj
Peter Mlich:8.11.2019 7:55

Jo.
Nebylo by jednodussi to vyzkouset nez cekat na odpoved do rana? Prenastavit hodnotu session na 5 minut nebo nejaky kratsi interval a sledovat, co se stane?

Jako, nej problem jsou fakt vypadky spojeni. Kratky vypadek a vetsina systemu te odloguje. Proto proste kratke intervaly nemaji prilis smysl. Ale to samozrejme jde vyresit i u tech socketu. Pocitat cas, jak dlouho je vypadek a mezitim se pokouset navazat znovu spojeni. Ale nevim, zda ti nekdo da k tomu hotove reseni. Vetsinou je to know-how.

 
Nahoru Odpovědět
8.11.2019 7:55
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Peter Mlich
Otvorený Zdroj:13.11.2019 3:23

Myslim, ze sa mi podarilo dosiahnut funkcne - uspokojive riesenie bez websocketov a Ajaxu.Stacilo jednoduche PHP a JS. Bude obsahovat 2x odpocitanie.Kazda stranka po nacitani bude odpocitavat 24 min. do expiracie. Ked dosiahne 3min.do konca expiracie - Vybehne okno s upozornenim:

Stranka expiruje v case xx, do 3 minut.(3min. casu na ulozenie obsahu)
OK- mate cas 10s ulozit obsah alebo zostanete prihlaseny
Zrusit - budete odhlaseny

-- Na kazdej stranke by malo byt, alebo na jednej s dosahom na vsetky --

<body>
<?php

//cas expiracie 24minut v milisekundach, pre cas js
$time_expire_js= time()*1000+1440000;


//vystup pre uzivatela - cas expiracie, v php
$time_expire_format= date(" H:i:s", time()+1440);


?>
<p id="odpocitavanie_expiracie"></p>
<p id="odpocitavanie_poupozorneni"></p>

<script>

// cas expiracie
var countDownDate = <?php echo $time_expire_js; ?>;

//odpocitavanie casu expiracie 1.odpocitavanie
// Update the count down every 1 second
var x = setInterval(function() {

  // Get today's date and time
  var now = new Date().getTime();

 // Find the distance between now and the count down date
  var distance = countDownDate - now;

  // Time calculations for days, hours, minutes and seconds
  var days = Math.floor(distance / (1000 * 60 * 60 * 24));
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);

  // zakomentovane nie je potrebne na vystupe, uzivatela by privadzal do stresu
  // Output the result in an element with id="odpocet_expiracie"
 //document.getElementById("odpocitavanie_expiracie").innerHTML =minutes + "m " + seconds + "s ";

  // ked odpocet expiracie dosiahne 3min=180000 milisec.
  if (distance < 180000) {

 r=window.confirm('Stránka vás automaticky odhlási po 24min. nečinnosti, presne v čase '+'<?php echo $time_expire_format; ?>'+'.\n\n'+
'Želáte si predĺžiť pobyt na webe o 24min.? (Inak automatické odhlásenie za 3min.)\n\n'+
'OK - máte 10 sekund na uloženie textu alebo zostanete prihlásený \n\n'+
'Zrušiť - budete odhlásený\n\n');

     //Ked uzivatel stlaci OK
    if (r == true) {
  clearInterval(x);

        //aktualny cas
    var casteraz=new Date().getTime();

  //ked uzivatel nezareaguje do 3minut, bude automaticky odhlaseny, cas vycleneny na reakciu uzivatela po upozorneni
    if(casteraz > countDownDate) { location.replace("administrace/odhlasit") }

// cas 2.odpocitania prida 10sec
        var countDownDatez = new Date().getTime()+10000;

// Odpocitavanie casu po upozorneni a stlaceni OK, 2.odpocitanie
// Update the count down every 1 second
var z = setInterval(function() {

  // Get today's date and time
  var nowz = new Date().getTime();

  // Find the distance between now and the count down date
  var distancez = countDownDatez - nowz;

  // Time calculations for days, hours, minutes and seconds
  var daysz = Math.floor(distancez / (1000 * 60 * 60 * 24));
  var hoursz = Math.floor((distancez % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutesz = Math.floor((distancez % (1000 * 60 * 60)) / (1000 * 60));
  var secondsz = Math.floor((distancez % (1000 * 60)) / 1000);

  // Display the result in the element with id="odpocitavanie_poupozorneni"
  document.getElementById("odpocitavanie_poupozorneni").innerHTML = "("+secondsz + "s )";

// ak uplynie cas druheho odpocitania
// If the count down is finished
  if (distancez < 0) {
    clearInterval(z);

//predlzi cas expiracie a refresh stranky
        <?php  echo $spravceUzivatelu->update_time_expire(); ?>
 location.reload()
        }
}, 1000);


}

  else {     // ked uzivatel stlaci zrusit

           location.replace("administrace/odhlasit")

  clearInterval(x);
  }
  }



}, 1000);
</script>
</body>

--subor s funkciami --

public function prihlas($email, $heslo)
        {

          // tu kod pre prihlasenie ...


                //cas expiracie nastaveny v php 24min. = 1440000milisec, v milisekundach pre js
                $time_php=1440000;

                //ulozi pole $uzivatel do session
                $_SESSION['uzivatel'] = $uzivatel;

                //cas v milisekundach pre js
                $time_start=time()*1000;

                $_SESSION['time_expire'] =$time_start + $time_php;

             $pole = array(
                        'time_expire' => $_SESSION['time_expire'],

                );

              $klice = array('time_expire');
              $hodnoty = array_intersect_key($pole, array_flip($klice));

              //automaticky vykona update v tabulke
            Db::zmen('uzivatele', $hodnoty, 'WHERE email = ?', array($email));



        }

        public function update_time_expire()
        {

            //cas v milisekundach pre js
            $time_teraz=time()*1000;

            if (isset($_SESSION['time_expire']) && $_SESSION['time_expire'] > $time_teraz)

        {
            //cas expiracie nastaveny v php 24min. = 1440000milisec, v milisekundach pre js
              $time_php=1440000;

              $_SESSION['time_expire']=$time_teraz+$time_php;

             $user =$this->vratUzivatele();


            $pole = array(
                        'time_expire' => $_SESSION['time_expire'],

                );

              $klice = array('time_expire');
              $hodnoty = array_intersect_key($pole, array_flip($klice));

              //automaticky vykona update v tabulke
            Db::zmen('uzivatele', $hodnoty, 'WHERE email = ?', array($user['email']));



        }     // ak cas expiracie mensi ako cas pri update, automaticky odhlasi, atd.
                 else {
                      header("Location: /cms/administrace/odhlasit");
                      header("Connection: close");

                 }


         }

        // Odhlásí uživatele
        public function odhlas()
        {
           // zavola funkciu v triede a ulozi do pola $user
            $user =$this->vratUzivatele();

            //nastavi uzivatela na neaktivny
            $pole = array(
                        'time_expire' => 0,
                        );

            $klice = array('time_expire');
            $hodnoty = array_intersect_key($pole, array_flip($klice));

             //automaticky vykona update v tabulke
            Db::zmen('uzivatele', $hodnoty, 'WHERE email = ?', array($user['email']));

            // a odhlasi uzivatela
            unset($_SESSION['uzivatel']);

        }

--A urcenie statusov moze byt napr.takto--

<?php  if ($this->vrat_time_expire_usera($recipient_id)> time()*1000) : ?>
    <img border="0" src="graphics/online.png" width="30" height="30"   style="margin-top:0px; margin-bottom:0px;vertical-align: top;  border-width:0px;" >
    <?php endif ?>

<?php  if ($this->vrat_time_expire_usera($recipient_id)< time()*1000) : ?>
    <img border="0" src="graphics/offline.png" width="30" height="30"   style="margin-top:0px; margin-bottom:0px;vertical-align: top;  border-width:0px;" >
    <?php endif ?>

Pokial sa nejedna o weblog, si myslim ze to..na zaciatok staci...

Nahoru Odpovědět
13.11.2019 3:23
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:13.11.2019 7:50

To je dost strasidelne.
Pro db bych v sql dotazu pouzil typ datetime, cas zapsal jako NOW().
Z php bych vytahl tabulku uzivatele (jmeno, cas), kde je last_update_cas<NOW()-hodnota. Js tedy dostane seznam uzivatelu, jejich cas a hodnotu now a dal, at si to vyresi.
Pri kazdem kliknuti se tedy v db updatuje uzivateli cas. A ty javascriptu predavas jen uzivatele, kteri ten cas maji nyni-20 minut, treba. Neni treba nikoho specialne odhlasovat. Javascript si to uz poresi i bez obnovovani stranky jim nastavi offline. Na to ti staci jednou spustit setInterval. Nebo pouzij setTimeout. Ten se sam vypne.

 
Nahoru Odpovědět
13.11.2019 7:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:13.11.2019 7:58

users (id_user, nick, name, date_last, date_reg, ...)

UPDATE users SET date_last=NOW() WHERE id_user=123 AND nick='honza' // to bych tam dal, pro jistotu, aby ten, kdo ten

sql dotaz posila vedel i neco vic nez id, nez neco uzivateli prepise

SELECT id_user, nick, name, date_last, NOW() FROM users WHERE date_last>=DATE_SUB(NOW(), INTERVAL 15 MINUTE); --  OR id_user=123

Vyber vse, kde je datum v intervalu a jeste tam muzes pridat a meho uzivatele, pokud bys te treba zajimala posledni aktivita predtim nez ji prepises

 
Nahoru Odpovědět
13.11.2019 7:58
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Peter Mlich
Otvorený Zdroj:14.11.2019 22:40

Pri kazdem kliknuti se tedy v db updatuje uzivateli cas. A ty javascriptu predavas jen uzivatele, kteri ten cas maji nyni-20 minut, treba.

Nerozumiem umyslu.V php je nastavena expiracia na 24min, a chcem docielit, aby web surovo neodhlasil uzivatela automaticky, preto 3min pred expiraciou mu poskytne upozornenie, ze ma 3 minuty pred expiraciou(3minuty casu na stlacenie OK).

Po stlaceni OK ma 10 sec casu na ulozenie obsahu a nasledne bude automaticky reload,ktorym predlzi cas expiracie. (nemusi nic ukladat, ak nechce, ak potrebuje, je mu danych 10 sec.)

Kazdym kliknutim na inu cast webu sa spusti, nove odpocitavanie(24min) a zaroven sa vykona update uzivatela v stlpci ['time_expire'] o predlzovaci cas...

Ked sa riadne odhlasi ['time_expire'] =0, status bude automaticky vyhodnoteny za offline: $this->vrat_time_ex­pire_usera($re­cipient_id)< time()*1000)

Ked zavrie okno, tak bude prihlaseny online dokial bude ['time_expire'] > ako sucastny cas:
$this->vrat_time_ex­pire_usera($re­cipient_id)> time()*1000)

takze max. do 24 minut po zavreti karty, alebo okna by bol este oznaceny za online

Aspon tak by to malo aktualne fungovat..

Problem nastal, keby uzivatel zavrel okno bez odhlasenia, a v prehliadaci by mal nastavene, po otvoreni prehliadaca zacat od existujucej relacie, stoplo by JS, a uzivatel by bol prihlaseny na vecnost, a nefungoval by update casov. U prehliadaca Opera je to tak...VTEDY sa vlastne user neodhlasi po zavreti okna automaticky..­...odhlasi ho az porovnavanie casov expiracie z db a aktualneho, ako mam v oprave...osetre­ne...

-- Oprava --

<?php

//vybere  z db aktualny cas expiracie uzivatela

$time_expire_js= $this->vrat_time_expire_usera($this->vypis_id_prihlaseneho());

//najprv porovna tento cas s aktualnym a v pripade ze je mensi odhlasi uzivatela
if($time_expire_js<time()*1000) $this->presmeruj('administrace/odhlasit');

//a az potom nastavi novy cas expiracie, 24minut v milisekundach, pre cas js, pre update
time_expire_js=time()*1000+1440000;

$time_expire_format= date(" H:i:s", time()+1440);
?>
public function prihlas($email, $heslo)
        {
                //doplnenie

                $maxlifetime_js=1440000;
               ** $maxlifetime_php=1440;**
              **  ini_set("session.gc_maxlifetime", $maxlifetime_php);**

                **session_regenerate_id(true);**

                //ulozi pole $uzivatel do session
                $_SESSION['uzivatel'] = $uzivatel;

               // pokracuje dalsi kod...
       }
// Odhlásí uživatele
        public function odhlas()
        {
            **session_regenerate_id(true);**
            ** $_SESSION['time_expire']=0;**

// zavola funkciu v triede a ulozi do pola $user
            $user =$this->vratUzivatele();

            //nastavi uzivatela na neaktivny
            $pole = array(
                        **'time_expire' => $_SESSION['time_expire'],**
                        );

            $klice = array('time_expire');
            $hodnoty = array_intersect_key($pole, array_flip($klice));

             //automaticky vykona update v tabulke
            Db::zmen('uzivatele', $hodnoty, 'WHERE email = ?', array($user['email']));

            // a odhlasi uzivatela
            unset($_SESSION['uzivatel']);
           ** unset($_SESSION['time_expire']);**
        }
Nahoru Odpovědět
14.11.2019 22:40
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:14.11.2019 23:37

chýba $
//a az potom nastavi novy cas expiracie, 24minut v milisekundach, pre cas js, pre update
$time_expire_js=ti­me()*1000+1440000;

Zaujimave ze niektore weby nemaju osetrenu moznost...po zatvoreni okna, a otvoreni prehliadaca zacinaju od existujucej relacie, ako jeden nemenovany hraci server:)

Nahoru Odpovědět
14.11.2019 23:37
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.11.2019 7:53

Aha. Ja to moc nestudoval. Jdes na to dost slozite. A spolehas na procesy, na ktere se spolehat nedalo asi nikdy :)
Pokud ma clovek vic oken, zalozek, nema v okne focus, prohlizec nemusi upozorneni zobrazit ani nemusi hlidat cas, aby setril cpu. Pokud by to fungovalo, mozna by se dal vyuzit i window.title (jak fb vzdycky pridava pocet novych zprav, ikdyz v okne zrovna nejsi)
To upozorneni, ikdyz se zobrazi a nema v okne focus, tak si ho neprecte.
S tim ukladanim, nevim, co presne chces ukladat, ale vetsinou si muze uzivatel sam hlidat, aby se mu neztratil obsah. Kazdopadne, pokud mu presmerujes stranku, tak o obsah prijde a nemuze jej pouzit v druhem okne. Leda bys mu to ulozil nekde mezi rozepsane, jak to delaji maily. Coz muzes delat automaticky, kazdych 5 min.

Jinak, asi postupujes dobre, podle pozadavku. Tez mivam podobne komplikovane problemy, ktere uzivatele neoceni, ale zaberou mi treba tyden casu :)

 
Nahoru Odpovědět
15.11.2019 7:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 24 zpráv z 24.