summaryrefslogtreecommitdiff
path: root/framework/zii/behaviors/CTimestampBehavior.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/zii/behaviors/CTimestampBehavior.php')
-rw-r--r--framework/zii/behaviors/CTimestampBehavior.php121
1 files changed, 121 insertions, 0 deletions
diff --git a/framework/zii/behaviors/CTimestampBehavior.php b/framework/zii/behaviors/CTimestampBehavior.php
new file mode 100644
index 0000000..40343b7
--- /dev/null
+++ b/framework/zii/behaviors/CTimestampBehavior.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * CTimestampBehavior class file.
+ *
+ * @author Jonah Turnquist <poppitypop@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ */
+
+ /**
+ * CTimestampBehavior will automatically fill date and time related atributes.
+ *
+ * CTimestampBehavior will automatically fill date and time related atributes when the active record
+ * is created and/or upadated.
+ * 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>
+ * @version $Id: CTimestampBehavior.php 3229 2011-05-21 00:20:29Z alexander.makarow $
+ * @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 timstamp 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 timstamp 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
+ */
+ 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 approprate 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;
+ else if ($this->timestampExpression !== null)
+ return @eval('return '.$this->timestampExpression.';');
+
+ $columnType = $this->getOwner()->getTableSchema()->getColumn($attribute)->dbType;
+ return $this->getTimestampByColumnType($columnType);
+ }
+
+ /**
+ * Returns the approprate 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();
+ }
+} \ No newline at end of file