%PDF- %PDF-
| Direktori : /home1/lightco1/www/lightingrepublic.com.au/libraries/koowa/database/behavior/ |
| Current File : //home1/lightco1/www/lightingrepublic.com.au/libraries/koowa/database/behavior/lockable.php |
<?php
/**
* @version $Id$
* @package Koowa_Database
* @subpackage Behavior
* @copyright Copyright (C) 2007 - 2012 Johan Janssens. All rights reserved.
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html>
*/
/**
* Database Lockable Behavior
*
* @author Johan Janssens <johan@nooku.org>
* @package Koowa_Database
* @subpackage Behavior
*/
class KDatabaseBehaviorLockable extends KDatabaseBehaviorAbstract
{
/**
* The lock lifetime
*
* @var integer
*/
protected $_lifetime;
/**
* Initializes the options for the object
*
* Called from {@link __construct()} as a first step of object instantiation.
*
* @param object An optional KConfig object with configuration options
* @return void
*/
protected function _initialize(KConfig $config)
{
$config->append(array(
'priority' => KCommand::PRIORITY_HIGH,
'lifetime' => '900' //in seconds
));
$this->_lifetime = $config->lifetime;
parent::_initialize($config);
}
/**
* Get the methods that are available for mixin based
*
* This function conditionaly mixies the behavior. Only if the mixer
* has a 'locked_by' property the behavior will be mixed in.
*
* @param object The mixer requesting the mixable methods.
* @return array An array of methods
*/
public function getMixableMethods(KObject $mixer = null)
{
$methods = array();
if(isset($mixer->locked_by) && isset($mixer->locked_on)) {
$methods = parent::getMixableMethods($mixer);
}
return $methods;
}
/**
* Lock a row
*
* Requires an 'locked_on' and 'locked_by' column
*
* @return boolean If successfull return TRUE, otherwise FALSE
*/
public function lock()
{
//Prevent lock take over, only an saved and unlocked row and be locked
if(!$this->isNew() && !$this->locked())
{
$this->locked_by = (int) JFactory::getUser()->get('id');
$this->locked_on = gmdate('Y-m-d H:i:s');
$this->save();
}
return true;
}
/**
* Unlock a row
*
* Requires an locked_on and locked_by column to be present in the table
*
* @return boolean If successfull return TRUE, otherwise FALSE
*/
public function unlock()
{
$userid = JFactory::getUser()->get('id');
//Only an saved row can be unlocked by the user who locked it
if(!$this->isNew() && $this->locked_by != 0 && $this->locked_by == $userid)
{
$this->locked_by = 0;
$this->locked_on = 0;
$this->save();
}
return true;
}
/**
* Checks if a row is locked
*
* @return boolean If the row is locked TRUE, otherwise FALSE
*/
public function locked()
{
$result = false;
if(!$this->isNew())
{
if(isset($this->locked_on) && isset($this->locked_by))
{
$locked = strtotime($this->locked_on);
$current = strtotime(gmdate('Y-m-d H:i:s'));
//Check if the lock has gone stale
if($current - $locked < $this->_lifetime)
{
$userid = JFactory::getUser()->get('id');
if($this->locked_by != 0 && $this->locked_by != $userid) {
$result= true;
}
}
}
}
return $result;
}
/**
* Get the locked information
*
* @return string The locked information as an internationalised string
*/
public function lockMessage()
{
$message = '';
if($this->locked())
{
$user = JFactory::getUser($this->locked_by);
$date = $this->getService('com:default.template.helper.date')->humanize(array('date' => $this->locked_on));
$message = $this->getService('translator')->getTranslator($this->getIdentifier())->translate(
'Locked by %name% %date%', array('%name%' => $user->get('name'), '%date%' => $date)
);
}
return $message;
}
/**
* Checks if a row can be updated
*
* This function determines if a row can be updated based on it's locked_by information.
* If a row is locked, and not by the logged in user, the function will return false,
* otherwise it will return true
*
* @return boolean True if row can be updated, false otherwise
*/
protected function _beforeTableUpdate(KCommandContext $context)
{
return (bool) !$this->locked();
}
/**
* Checks if a row can be deleted
*
* This function determines if a row can be deleted based on it's locked_by information.
* If a row is locked, and not by the logged in user, the function will return false,
* otherwise it will return true
*
* @return boolean True if row can be deleted, false otherwise
*/
protected function _beforeTableDelete(KCommandContext $context)
{
return (bool) !$this->locked();
}
}