124 lines
4.7 KiB
PHP
124 lines
4.7 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* CTimestampBehavior class file.
|
||
|
*
|
||
|
* @author Jonah Turnquist <poppitypop@gmail.com>
|
||
|
* @link http://www.yiiframework.com/
|
||
|
* @copyright 2008-2013 Yii Software LLC
|
||
|
* @license http://www.yiiframework.com/license/
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* CTimestampBehavior will automatically fill date and time related attributes.
|
||
|
*
|
||
|
* CTimestampBehavior will automatically fill date and time related attributes when the active record
|
||
|
* is created and/or updated.
|
||
|
* You may specify an active record model to use this behavior like so:
|
||
|
* <pre>
|
||
|
* public function behaviors(){
|
||
|
* return array(
|
||
|
* 'CTimestampBehavior' => array(
|
||
|
* 'class' => 'zii.behaviors.CTimestampBehavior',
|
||
|
* 'createAttribute' => 'create_time_attribute',
|
||
|
* 'updateAttribute' => 'update_time_attribute',
|
||
|
* )
|
||
|
* );
|
||
|
* }
|
||
|
* </pre>
|
||
|
* The {@link createAttribute} and {@link updateAttribute} options actually default to 'create_time' and 'update_time'
|
||
|
* respectively, so it is not required that you configure them. If you do not wish CTimestampBehavior
|
||
|
* to set a timestamp for record update or creation, set the corresponding attribute option to null.
|
||
|
*
|
||
|
* By default, the update attribute is only set on record update. If you also wish it to be set on record creation,
|
||
|
* set the {@link setUpdateOnCreate} option to true.
|
||
|
*
|
||
|
* Although CTimestampBehavior attempts to figure out on it's own what value to inject into the timestamp attribute,
|
||
|
* you may specify a custom value to use instead via {@link timestampExpression}
|
||
|
*
|
||
|
* @author Jonah Turnquist <poppitypop@gmail.com>
|
||
|
* @package zii.behaviors
|
||
|
* @since 1.1
|
||
|
*/
|
||
|
|
||
|
class CTimestampBehavior extends CActiveRecordBehavior {
|
||
|
/**
|
||
|
* @var mixed The name of the attribute to store the creation time. Set to null to not
|
||
|
* use a timestamp for the creation attribute. Defaults to 'create_time'
|
||
|
*/
|
||
|
public $createAttribute = 'create_time';
|
||
|
/**
|
||
|
* @var mixed The name of the attribute to store the modification time. Set to null to not
|
||
|
* use a timestamp for the update attribute. Defaults to 'update_time'
|
||
|
*/
|
||
|
public $updateAttribute = 'update_time';
|
||
|
|
||
|
/**
|
||
|
* @var bool Whether to set the update attribute to the creation timestamp upon creation.
|
||
|
* Otherwise it will be left alone. Defaults to false.
|
||
|
*/
|
||
|
public $setUpdateOnCreate = false;
|
||
|
|
||
|
/**
|
||
|
* @var mixed The expression that will be used for generating the timestamp.
|
||
|
* This can be either a string representing a PHP expression (e.g. 'time()'),
|
||
|
* or a {@link CDbExpression} object representing a DB expression (e.g. new CDbExpression('NOW()')).
|
||
|
* Defaults to null, meaning that we will attempt to figure out the appropriate timestamp
|
||
|
* automatically. If we fail at finding the appropriate timestamp, then it will
|
||
|
* fall back to using the current UNIX timestamp.
|
||
|
*
|
||
|
* A PHP expression can be any PHP code that has a value. To learn more about what an expression is,
|
||
|
* please refer to the {@link http://www.php.net/manual/en/language.expressions.php php manual}.
|
||
|
*/
|
||
|
public $timestampExpression;
|
||
|
|
||
|
/**
|
||
|
* @var array Maps column types to database method
|
||
|
*/
|
||
|
protected static $map = array(
|
||
|
'datetime'=>'NOW()',
|
||
|
'timestamp'=>'NOW()',
|
||
|
'date'=>'NOW()',
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Responds to {@link CModel::onBeforeSave} event.
|
||
|
* Sets the values of the creation or modified attributes as configured
|
||
|
*
|
||
|
* @param CModelEvent $event event parameter
|
||
|
*/
|
||
|
public function beforeSave($event) {
|
||
|
if ($this->getOwner()->getIsNewRecord() && ($this->createAttribute !== null)) {
|
||
|
$this->getOwner()->{$this->createAttribute} = $this->getTimestampByAttribute($this->createAttribute);
|
||
|
}
|
||
|
if ((!$this->getOwner()->getIsNewRecord() || $this->setUpdateOnCreate) && ($this->updateAttribute !== null)) {
|
||
|
$this->getOwner()->{$this->updateAttribute} = $this->getTimestampByAttribute($this->updateAttribute);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the appropriate timestamp depending on the column type $attribute is
|
||
|
*
|
||
|
* @param string $attribute $attribute
|
||
|
* @return mixed timestamp (eg unix timestamp or a mysql function)
|
||
|
*/
|
||
|
protected function getTimestampByAttribute($attribute) {
|
||
|
if ($this->timestampExpression instanceof CDbExpression)
|
||
|
return $this->timestampExpression;
|
||
|
elseif ($this->timestampExpression !== null)
|
||
|
return @eval('return '.$this->timestampExpression.';');
|
||
|
|
||
|
$columnType = $this->getOwner()->getTableSchema()->getColumn($attribute)->dbType;
|
||
|
return $this->getTimestampByColumnType($columnType);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the appropriate timestamp depending on $columnType
|
||
|
*
|
||
|
* @param string $columnType $columnType
|
||
|
* @return mixed timestamp (eg unix timestamp or a mysql function)
|
||
|
*/
|
||
|
protected function getTimestampByColumnType($columnType) {
|
||
|
return isset(self::$map[$columnType]) ? new CDbExpression(self::$map[$columnType]) : time();
|
||
|
}
|
||
|
}
|