2016-07-04 26 views
1

Ich entwickle ein einfaches cms zur internen Verwendung. Über diese cms kann der Benutzer eine Produktseite erstellen und bearbeiten. Ich möchte den Benutzer darauf aufmerksam machen, dass er versucht, die Seite eines bestimmten Produkts zu bearbeiten, die bereits von einem anderen Benutzer geöffnet wurde.Seite sperren, wenn sie bereits geöffnet ist

Ich benutze das folgende Skript, aber ich weiß nicht, wie man den zweiten Benutzer leicht alarmiert, etwas wie "ehi, diese Seite wird von einem anderen Benutzer bearbeitet", klicken Sie auf "OK" und leiten Sie ihn um Startseite.

Ich verfolge alle Informationen korrekt, ich weiß nur nicht, wie ich den zweiten Benutzer alarmieren und die Seite für ihn sperren soll.

Vielen Dank im Voraus!

Produktseite

<script src="pages/includes/jsHandler.js"></script> 
    <script> 
    window.onload = function(){ return start('<?php echo basename($_SERVER['REQUEST_URI'], '?' . $_SERVER['PATH_INFO']); ?>');}; 
    window.onbeforeunload = function(){ return end(); }; 
    window.onclose = function(){ return end(); }; 
</script> 

jsHandler.js

function start(pageName) { 
    var xmlhttp3; 
    if (window.XMLHttpRequest) { 
     xmlhttp3 = new XMLHttpRequest(); 
     } else { 
     xmlhttp3 = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
     xmlhttp3.onreadystatechange=function() { 
     if (xmlhttp3.readyState==4 && xmlhttp3.status==200) { 
     } 
     } 
     xmlhttp3.open("GET","pages/includes/trackStart.php?pageName="+pageName,true); 
     xmlhttp3.send(); 
    } 

    function end() { 
     var xmlhttp3; 
     if (window.XMLHttpRequest) { 
     xmlhttp3 = new XMLHttpRequest(); 
     } else { 
     xmlhttp3 = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
     xmlhttp3.onreadystatechange=function() { 
     if (xmlhttp3.readyState==4 && xmlhttp3.status==200) { 
     } 
     } 
     xmlhttp3.open("GET","pages/includes/trackEnd.php",true); 
     xmlhttp3.send(); 
    } 

trackStart.php

<?php session_start(); 
date_default_timezone_set("Europe/Rome"); 
require("dbHandler.php"); 
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
$_SESSION['startTime'] = $_SERVER['REQUEST_TIME']; 
$_SESSION['pageName'] = $_GET['pageName']; 

if(isset($_SESSION['pageViews'])) 
{ 
    $_SESSION['pageViews'] = $_SESSION['pageViews'] + 1; 
} 
else 
{ 
    $_SESSION['pageViews'] = 0; 
} 

$ip = $_SESSION['ip']; 
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json")); 
$user_location = $details->city . " , " . $details->country; 

saveData($_SESSION['ip'],$_SESSION['startTime'],'0',$_SESSION['pageName'],$_SESSION['pageViews'],'0','start',$user_location); 
?> 

trackEnd.php

<?php session_start(); 
date_default_timezone_set("Europe/Rome"); 
require("dbHandler.php"); 
$_SESSION['endTime'] = $_SERVER['REQUEST_TIME']; 
$timeSpent = $_SESSION['endTime'] - $_SESSION['startTime']; 
$timeSpent = $timeSpent . " seconds"; 

saveData($_SESSION['ip'],$_SESSION['startTime'],$_SESSION['endTime'],$_SESSION['pageName'],$_SESSION['pageViews'],$timeSpent,'end'); 
?> 

dbHandler.php

<?php 
function saveData($ip,$startTime,$endTime,$pageName,$viewCount,$timeSpent,$action,$location) 
{ 
    $mysqli = new mysqli("localhost", "blabla", "blabla", "blabla"); 

    if($action == 'start') 
    { 

     $q = "INSERT INTO track_user(ip_address,start_time,end_time,page_name,view_count,time_spent,user_location) VALUES('$ip','$startTime','$endTime','$pageName','$viewCount','$timeSpent','$location')"; 
    $mysqli->query($q); 

    } 
    else 
    { 
     $q = "UPDATE track_user SET end_time = '$endTime', time_spent = '$timeSpent' WHERE ip_address = '$ip' AND start_time = '$startTime' AND page_name = '$pageName'"; 
    $mysqli->query($q); 
    } 
} 
?> 
+0

Würden Sie nicht Wollen Sie nur verhindern, dass sie diese Seite an erster Stelle öffnen, wenn sie bereits bearbeitet wird? Ansonsten ist es nicht klar, welches spezielle Problem Sie haben. – charlietfl

+0

Zum Beispiel warnt Wordpress Sie, wenn Sie versuchen, einen Beitrag zu bearbeiten, den ein anderer Benutzer gerade bearbeitet. Nur eine Warnung, die den zweiten Benutzer darauf hinweist, dass die Seite bereits von einer anderen Person geöffnet wurde. Auf diese Weise kann die Seite nicht von 2 oder mehr Personen gleichzeitig bearbeitet werden, aber der erste Benutzer muss seine Änderung speichern, um dem zweiten Benutzer zu erlauben, diese Seite zu bearbeiten :) – Otto

+0

Also wenn es nur für das visuelle Erstellen eines Semi ist transparentes Overlay und das in der Seite einschließen, wenn Ihre 'editMode'-Bedingungen erfüllt sind – charlietfl

Antwort

0

gelöst! Ich habe eine PHP-API erstellt, die den aktuellen Seitenname auswählt. Wenn gleich und pagename end_time = 0 ist, bedeutet, dass Seite bereits geöffnet und i gesetzt $ risultato = 1. In meinem html, habe ich diesen Code den Benutzer (Bootstrap-modal) aufmerksam zu machen:

<script> 
    $('body').append('<div class="modal fade" id="session-locked" tabindex="-1" role="dialog" aria-hidden="true">'+ 
        '<div class="modal-dialog">'+ 
         '<div class="modal-content">'+ 
          '<div class="modal-header bg-primary">'+ 
           '<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="icons-office-52"></i></button>'+ 
           '<h4 class="modal-title">Scheda occupata</h4>'+ 
          '</div>'+ 
          '<div class="modal-body">'+ 
           '<p><br />La scheda è occupata da un altro utente.<br />Clicca OK per tornare in Homepage</p>'+ 
          '</div>'+ 
          '<div class="modal-footer">'+ 
           '<button id="idle-locked-dialog-keepalive" type="button" class="btn btn-primary btn-embossed" data-dismiss="modal">OK</button>'+ 
          '</div>'+ 
         '</div>'+ 
        '</div>'+ 
        '</div>'); 
    var page = '<?php echo basename($_SERVER['REQUEST_URI'], '?' . $_SERVER['PATH_INFO']); ?>'; 
    var time = '<?php echo ($_SERVER['REQUEST_TIME']); ?>'; 
     var jqxhr = $.ajax({url: api_ricerca_lock, type: "GET",dataType: "json", data: {pageName: page, startTime: time}}) 
     .done(function(json) { 
     if (json.risultato == 1) { 
      $('#session-locked').modal('show'); 
      $('#idle-locked-dialog-keepalive').on('click', function() { 
       $('#session-locked').modal('hide'); 
       window.location = "main.php"; 
      }); 
     } 
     else { 
      window.onload = function(){ return start('<?php echo basename($_SERVER['REQUEST_URI'], '?' . $_SERVER['PATH_INFO']); ?>');}; 
      window.onbeforeunload = function(){ return end(); }; 
      window.onclose = function(){ return end(); }; 
     } 
     }) 
     .fail(function(response) { 
     alert("error"); 
     }); 
</script>