Pagina tegelijkertijd bezoeken
Ik ben bezig met een systeem waarin meerdere gebruikers aan een draaiboek met daarin onderwerpen kunnen werken.
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?
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?
Bijhouden welke pagina is opgevraagd en als iemand anders die pagina op wil vragen binnen x-tijd dan blokkeren met een melding. Als degene die bewerkt kiest voor opslaan, dan de blokkade opheffen.
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.
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.
Je kan natuurlijk in plaats van updaten de nieuwe INSERTEN. En als de begintijd die je bij het open eerst opslaat, bij het submitten niet meer de nieuwste is (iemand wad jou dus voor met wijzigen) kan je een formulier tonen die beide versies kan zien en de verschillen.
Net als bij een Wikipagina dus.
Net als bij een Wikipagina dus.
Gewijzigd op 10/01/2016 17:38:08 door - Ariën -
Of beide: vergrendelingsmechanisme èn versiebeheer. Volgens mij valt dit onder workflow.
Obelix en Idefix, lijkt me een prima oplossing.
Maar de vraag blijft: hoe maak ik zoiets met php?
Maar de vraag blijft: hoe maak ik zoiets met php?
Ik zou zelf niet een bericht gaan locken. Maar wel gebruik maken van een INSERT-query om steeds de wijziging mee op te slaan. Zoals ik al zei kan je bij het openen van de bewerkpagina de huidige datum opslaan. En bij het versturen kijken of deze datum de nieuwste is. Als dit niet zo is, dan is iemand je voor gegaan.
Eventueel kan je in dat geval kan je met dit script: van beide versies de verschillen tonen:
http://code.stephenmorley.org/php/diff-implementation/
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 -
@Ariën, maar dat is wat Daan wil.
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.
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
De vraag is of locken wel gewenst is? Het klinkt erg veilig, maar is het ook gebruiksvriendelijk?
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.
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 -
Ik zou het toch fijn vinden om te locken.
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?
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.
Heb je een voorbeeldregel Ariën?
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...
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 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);
}
});
}
});
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.
Ik heb nu het volgende, maar het werkt niet... Iemand enig idee?
pagina.php
shared/blocktime.php
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."'");
}
?>
Je roept de loadData() functie nergens aan.
<? - 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.
<? - 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.
De connectie met mysql heb ik ondertussen toegevoegd.
Hoe roep ik dan de loadData() aan? En welke foutafhandeling mist?
En moet <script> in de head of mag het ook in de body?
Hoe roep ik dan de loadData() aan? En welke foutafhandeling mist?
En moet <script> in de head of mag het ook in de body?
Bedenk eerst een welke data je mee wilt sturen in je POST-request naar blocktime.php.
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.
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 -




