Location: PHPKode > scripts > AJAXPoll > README.txt
AJAX_Locking is a framework in AJAX to manage locking of object in a web application.

The idea is "stolen" from David Perelman-Hall's column appeared in DDJ issue on 8th September 2006
http://www.ddj.com/showArticle.jhtml?articleID=192700218

The idea is to use AJAX to lock, unlock and get status of records/objects, avoiding use of locks on db (or transactions).

AJAX_Locking is a class that extends HTML_AJAX_Server and implements itself the features to lock, unlock and get status via a "driver":
the default driver (AJAX_Locking_Driver_SharedMemory) uses PEAR's package System_SharedMemory as repository of locks,
you can write your own driver to achieve the same purpose, using a db or the filesystem.

To use AJAX_Locking you have to write a "server" page like the following, that instantiate the Ajax remote object:

server.php
<?php
require_once ('AJAX_Locking/AJAX_Locking.php');

require_once('AJAX_Locking/Driver/SharedMemory.php');
$driver = new AJAX_Locking_Driver_SharedMemory(10, 'file');
$server = new AJAX_Locking($driver);
$server->handleRequest();
?>

and in your client page you have to use HTML_Ajax framework to call lock, unlock and status methods provided from server.
AJAX_Locking provides its own javascript library to help to write client-side management:

test.php
<?php
$user='fabamb';
$type='test';
$id  =1;
?>

<html>
<head>
<script type = 'text/javascript' src = "server.php?client=Locking,all&stub=all"></script>
<script type = "text/javascript">
var lockingCallbacks = { 
	count: 0, 
	lock: function(result) {
		if (result === true) {
			h.status();
		} else {
			h.stop();
			HTML_AJAX_Util.setInnerHTML('status', 'Errore durante il lock');
		}
	},                   
	unlock: function(result) {
		if (result === true) {
			h.status();
		} else {
			h.stop();
			HTML_AJAX_Util.setInnerHTML('status', 'Errore durante l\'unlock');
		}
	},                   
	status: function(result) {
		HTML_AJAX_Util.setInnerHTML('count', this.count++);
		var values = result.split('~');

		switch (values[0]) {
			case 'owned':
				html = '<img src=owned.png align=absmiddle>In fase di modifica';

				enableButton('editButton', false);
				enableButton('saveButton', true);
				break;

			case 'locked':
				html = '<img src=locked.png align=absmiddle>Bloccato da ' + values[1];

				enableButton('editButton', false);
				enableButton('saveButton', false);
				break;

			case 'unlocked':
				html = '<img src=unlocked.png align=absmiddle>';

				enableButton('editButton', true);
				enableButton('saveButton', false);
				break;

			case 'timeout':
				h.stop();

				html = '<img src=timeout.png align=absmiddle>Fase di modifica scaduta';
				enableButton('editButton', false);
				enableButton('saveButton', false);
				break;
		}

		HTML_AJAX_Util.setInnerHTML('status', html);
	}
}

function enableButton(id, enabled) {
	var button = document.getElementById(id);
	
	if (button)	button.disabled = !enabled;
}

var h = new AJAX_Locking_Handler(lockingCallbacks, '<?=$user?>', '<?=$type?>', <?=$id?>);
</script>
</head>

<body onload = 'h.start();'>
<div id = "count">
</div>

User: <?= $user ?><br>
Tipo <?= $type ?><br>
Id: <?= $id ?><br>
Status: <span id = "status"></span>

<br>
<button id = "editButton" type = "button" onClick = "h.lock()">Edit</button>
<button id = "saveButton" type = "button" onClick = "h.unlock()" disabled>Save</button>
<button id = "statusButton" type = "button" onClick = "h.status()">Status</button>

<br>
</body>
</html>
Return current item: AJAXPoll