1 changed files with 105 additions and 0 deletions
			
			
		| @ -0,0 +1,105 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * @link http://www.yiiframework.com/ | ||||||
|  |  * @copyright Copyright (c) 2008 Yii Software LLC | ||||||
|  |  * @license http://www.yiiframework.com/license/ | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | namespace yii\behaviors; | ||||||
|  | 
 | ||||||
|  | use yii\base\Behavior; | ||||||
|  | use yii\db\Expression; | ||||||
|  | use yii\db\ActiveRecord; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * AutoTimestamp will automatically fill the attributes about creation time and updating time. | ||||||
|  |  * | ||||||
|  |  * AutoTimestamp fills the attributes when the associated AR model is being inserted or updated. | ||||||
|  |  * You may specify an AR to use this behavior like the following: | ||||||
|  |  * | ||||||
|  |  * ~~~ | ||||||
|  |  * public function behaviors() | ||||||
|  |  * { | ||||||
|  |  *     return array( | ||||||
|  |  *         'timestamp' => array( | ||||||
|  |  *             'class' => 'yii\behaviors\AutoTimestamp', | ||||||
|  |  *         ), | ||||||
|  |  *     ); | ||||||
|  |  * } | ||||||
|  |  * ~~~ | ||||||
|  |  * | ||||||
|  |  * By default, the attribute for keeping the creation time is named as "create_time", and the attribute | ||||||
|  |  * for updating time is "update_time". You may customize the names via [[createAttribute]] and [[updateAttribute]]. | ||||||
|  |  * | ||||||
|  |  * @author Qiang Xue <qiang.xue@gmail.com> | ||||||
|  |  * @since 2.0 | ||||||
|  |  */ | ||||||
|  | class AutoTimestamp extends Behavior | ||||||
|  | { | ||||||
|  | 	/** | ||||||
|  | 	 * @var string 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 string 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 string|Expression The expression that will be used for generating the timestamp. | ||||||
|  | 	 * This can be either a string representing a PHP expression (e.g. 'time()'), | ||||||
|  | 	 * or an [[Expression]] object representing a DB expression (e.g. `new Expression('NOW()')`). | ||||||
|  | 	 * If not set, it will use the value of `time()` to fill the attributes. | ||||||
|  | 	 */ | ||||||
|  | 	public $timestamp; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Declares event handlers for the [[owner]]'s events. | ||||||
|  | 	 * @return array events (array keys) and the corresponding event handler methods (array values). | ||||||
|  | 	 */ | ||||||
|  | 	public function events() | ||||||
|  | 	{ | ||||||
|  | 		return array( | ||||||
|  | 			ActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert', | ||||||
|  | 			ActiveRecord::EVENT_BEFORE_UPDATE => 'beforeInsert', | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * This is the event handler for the "beforeInsert" event of the associated AR object. | ||||||
|  | 	 */ | ||||||
|  | 	public function beforeInsert() | ||||||
|  | 	{ | ||||||
|  | 		if ($this->createAttribute !== null) { | ||||||
|  | 			$this->owner->{$this->createAttribute} = $this->evaluateTimestamp($this->createAttribute); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * This is the event handler for the "beforeUpdate" event of the associated AR object. | ||||||
|  | 	 */ | ||||||
|  | 	public function beforeUpdate() | ||||||
|  | 	{ | ||||||
|  | 		if ($this->updateAttribute !== null) { | ||||||
|  | 			$this->owner->{$this->updateAttribute} = $this->evaluateTimestamp($this->updateAttribute); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets the appropriate timestamp depending on the column type $attribute is | ||||||
|  | 	 * @param string $attribute attribute name | ||||||
|  | 	 * @return mixed the timestamp value | ||||||
|  | 	 */ | ||||||
|  | 	protected function evaluateTimestamp($attribute) | ||||||
|  | 	{ | ||||||
|  | 		if ($this->timestamp instanceof Expression) { | ||||||
|  | 			return $this->timestamp; | ||||||
|  | 		} elseif ($this->timestamp !== null) { | ||||||
|  | 			return eval('return ' . $this->timestamp . ';'); | ||||||
|  | 		} else { | ||||||
|  | 			return time(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue