Pagina tegelijkertijd bezoeken
Nu is het niet de bedoeling dat als iemand in een onderwerp aan het werken is, iemand anders het onderwerp tegelijkertijd bewerkt.
Dan zou informatie verloren kunnen gaan.
Hoe kan ik ervoor zorgen dat maar een iemand tegelijkertijd een pagina (met daarin het formulier) kan bezoeken?
Vragen zijn wel: hoe lang kan/mag iemand aan een onderwerp werken? Stel je hier een max aan? Want wat als iemand, om welke reden ook, wel een pagina opvraagt, maar daarna de browser afsluit.
Of beide: vergrendelingsmechanisme èn versiebeheer. Volgens mij valt dit onder workflow.
Maar de vraag blijft: hoe maak ik zoiets met php?
Eventueel kan je in dat geval kan je met dit script: van beide versies de verschillen tonen:
http://code.stephenmorley.org/php/diff-implementation/
Gewijzigd op 11/01/2016 16:30:13 door - Ariën -
Dit zou je kunnen bereiken door bij de resource wat extra informatie op te slaan:
- het user id van de eerste persoon die het formulier van deze resource bezoekt
- het tijdstip waarop dit gebeurt
Als iemand de resource inhoudelijk wil wijzigen (de persoon klikt op een edit-icoon o.i.d.) wordt eerst gekeken of iemand die al in gebruik heeft (en mogelijk hoe lang). Is er niemand bezig dan "claimt" deze gebruiker de resource. Indien dit wel het geval is toon je een melding.
Vervolgens heb je verschillende strategieën voor het weer vrijgeven van de resource:
- een timeout (maar dan heb je nog steeds kans op dataverlies), je zou evt nog een bevestiging in kunnen bouwen en kunnen controleren of de desbetreffende gebruiker "online" is om de kans dat je werk overschrijft te verkleinen
- het handmatig vrijgeven wanneer je klaar bent
Het is waarschijnlijk wel handiger wanneer niet iedereen op hetzelfde moment bezig is in 1 document. Je zou ook kunnen nadenken over alternatieve oplossingen.
Gewijzigd op 11/01/2016 16:57:52 door Thomas van den Heuvel
Conflicten tussen twee versies kan je prima herkennen met mijn aangedragen oplossing, en er gaat gaan fysieke data verloren. En een extra voordeel: Je hebt een perfecte geschiedenis om op terug te vallen als je een aanpassing van iemand wilt undo'en.
Feitelijk spreek je dan gewoon van een vereenvoudigd versiebeheer systeem.
Gewijzigd op 11/01/2016 17:19:02 door - Ariën -
Alleen de vraag is: hoe unlock je als iemand het browser afsluit.
Voor de rest denk ik dat ik met php-sessies kan werken?
Heeft iemand misschien een aardig voorbeeld? Of opzetje?
Je kan met een regelmatige AJAX request kijken of iemand zich nog op die pagina bevindt. En zo niet, dan geef je hem vrij.
Heb je misschien een voorbeeld(link) Ariën? Want ik heb geen idee hoe ik zoiets kan maken....
http://www.w3schools.com/jquery/ajax_ajax.asp
Hiermee kan je een AJAX-request uitvoeren. Deze voer je regelmatig uit met setInterval, bijv.elke 30 sec.
Hierin geef je de userID mee van diegene die hem bewerkt, en de huidige tijd en datum.
Als deze bij het openen van het wijzigingsformulier jonger dan +/- 1 minuut is, dan wordt er aan gewerkt en geef je een foutmelding.
Hiermee kan je een AJAX-request uitvoeren. Deze voer je regelmatig uit met setInterval, bijv.elke 30 sec.
Hierin geef je de userID mee van diegene die hem bewerkt, en de huidige tijd en datum.
Als deze bij het openen van het wijzigingsformulier jonger dan +/- 1 minuut is, dan wordt er aan gewerkt en geef je een foutmelding.
Als je grotere artikelen aan het schrijven bent submit je lang niet zo vaak / zo snel teksten. Wat je ook zou kunnen doen is een soort van crontaak inroosteren voor het vrijgeven van de lock, en elke keer als iemand een wijziging doet schuif je deze een uur verder in de tijd. Je zult ook enigszins met inactiviteit van een gebruiker en/of sessie-timeouts rekening moeten houden en misschien is het doorstarten van sessies wel naadloos in het systeem geïntegreerd dus enkel een sessie-timeout zegt ook lang niet alles.
Ik bekijk je voorbeeld, maar heb nog nooit gewerkt met AJAX... Ik heb geen idee hoe ik er elke 30 seconden voor kan zorgen dat er een SQL-update wordt uitgevoerd...
In script.php sla je die doorgegeven data op in je database.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$(document).ready(function(){
function loadData(username,time) {
$.ajax({
url: "script.php",
type: "POST",
data: "{'username':'" + username+ "', 'time':'" + time+ "'}",
cache: false,
success: function(html){
$(".result").empty().html(html);
setTimeout(function () {
loadData(username, time);
}, 30000);
},
error:function (xhr, ajaxOptions, thrownError){
$(".result").empty().html('Error:'+ xhr.status + ' '+ thrownError);
}
});
}
});
function loadData(username,time) {
$.ajax({
url: "script.php",
type: "POST",
data: "{'username':'" + username+ "', 'time':'" + time+ "'}",
cache: false,
success: function(html){
$(".result").empty().html(html);
setTimeout(function () {
loadData(username, time);
}, 30000);
},
error:function (xhr, ajaxOptions, thrownError){
$(".result").empty().html('Error:'+ xhr.status + ' '+ thrownError);
}
});
}
});
Gewijzigd op 12/01/2016 16:21:30 door - Ariën -
- Ariën - op 12/01/2016 16:20:46:
In het JavaScript jQuery-framework zou dit moeten helpen. Je moet dan de loadData functie eenmalig aanroepen met de username en tijd.
In script.php sla je die doorgegeven data op in je database.
In script.php sla je die doorgegeven data op in je database.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$(document).ready(function(){
function loadData(username,time) {
$.ajax({
url: "script.php",
type: "POST",
data: "{'username':'" + username+ "', 'time':'" + time+ "'}",
cache: false,
success: function(html){
$(".result").empty().html(html);
setTimeout(function () {
loadData(username, time);
}, 30000);
},
error:function (xhr, ajaxOptions, thrownError){
$(".result").empty().html('Error:'+ xhr.status + ' '+ thrownError);
}
});
}
});
function loadData(username,time) {
$.ajax({
url: "script.php",
type: "POST",
data: "{'username':'" + username+ "', 'time':'" + time+ "'}",
cache: false,
success: function(html){
$(".result").empty().html(html);
setTimeout(function () {
loadData(username, time);
}, 30000);
},
error:function (xhr, ajaxOptions, thrownError){
$(".result").empty().html('Error:'+ xhr.status + ' '+ thrownError);
}
});
}
});
Je vergeet hier wel de loadData() functie aan te roepen
Goed gezien, hoewel ik had het al wel duidelijk gemaakt in mijn post.
pagina.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$itemID = '5';
?>
<script>
$(document).ready(function(){
function loadData(username,time) {
$.ajax({
url: "shared/blocktime.php",
type: "POST",
data: "{'<? echo $itemID; ?>':'" + itemID+ "'}",
cache: false,
success: function(html){
$(".result").empty().html(html);
setTimeout(function () {
loadData(username, time);
}, 30000);
},
error:function (xhr, ajaxOptions, thrownError){
$(".result").empty().html('Error:'+ xhr.status + ' '+ thrownError);
}
});
}
});
</script>
$itemID = '5';
?>
<script>
$(document).ready(function(){
function loadData(username,time) {
$.ajax({
url: "shared/blocktime.php",
type: "POST",
data: "{'<? echo $itemID; ?>':'" + itemID+ "'}",
cache: false,
success: function(html){
$(".result").empty().html(html);
setTimeout(function () {
loadData(username, time);
}, 30000);
},
error:function (xhr, ajaxOptions, thrownError){
$(".result").empty().html('Error:'+ xhr.status + ' '+ thrownError);
}
});
}
});
</script>
shared/blocktime.php
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
if(isset($_POST['itemID'])){
$itemID = $_POST['itemID'];
$blocktime = time();
$update_item = mysql_query("UPDATE items SET blocktime = '".$blocktime."' WHERE itemID ='".$itemID."'");
}
?>
if(isset($_POST['itemID'])){
$itemID = $_POST['itemID'];
$blocktime = time();
$update_item = mysql_query("UPDATE items SET blocktime = '".$blocktime."' WHERE itemID ='".$itemID."'");
}
?>
<? - shorttags zijn niet meer toegestaan.
Je mist een connectie met MySQL.
De foutafhandeling mist.
PS: Stap liever over op de MySQLi functies of PDO. De mysql-functies gaan er in PHP uit.
Hoe roep ik dan de loadData() aan? En welke foutafhandeling mist?
En moet <script> in de head of mag het ook in de body?
De userID en de ItemID lijken me het interessants, evenals de huidige datum: 2016-01-12 18:23:00.
Deze data moet je in de loadData functie aanroepen, en verwerk je dus in de data-event van je $.ajax() functie.
Verder kan je PHP-variabelen niet direct in JavaScript gebruiken. Je moet ze uiteraard eerst echo'en. PHp draait op de server, en JavaScript bij de client.
Gewijzigd op 12/01/2016 18:30:36 door - Ariën -