Difference between #6 and #12 of
How to log changes of ActiveRecords?

Changes

Title unchanged

How to log changes of ActiveRecords?

Category unchanged

Tutorials

Yii version unchanged

Tags changed

Logging

Content changed

A simple and effective way to keep track what your users are doing within your application is to log their activities related to database modifications. You can log whenever a record was inserted, changed or deleted, and also when and by which user this was done. For a [CActiveRecord] Model you could use a behavior for this purpose. This way you will be able to add log functionality to ActiveRecords very easily. First of all you have to create a table for the log-lines in the database. Here is an example (MySQL):     [sql]
 
CREATE TABLE ActiveRecordLog ( idActiveRecordLog INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
description VARCHAR(255) NULL,
action VARCHAR(20) NULL,
[...]
creationdate TIMESTAMP NOT NULL,
userid VARCHAR(45) NULL,
PRIMARY KEY(id
ActiveRecordLog)
)
TYPE=InnoDB;
[...]
```php
class ActiveRecordLogableBehavior extends CActiveRecordBehavior
    { private $_oldattributes = array();
 
public function afterSave($event) {
 
if (!$this->Owner->isNewRecord) {

// new attributes
[...]
// compare old and new
foreach ($newattributes as $name => $value) {
if (!empty($oldattributes)) {
$old = $oldattributes[$name];
[...]
}


 
if ($value != $old) { //$changes = $name . ' ('.$old.') => ('.$value.'), '; $log=new ActiveRecordLog; $log->description= 'User ' . Yii::app()->user->Name . ' changed ' . $name . ' for ' . get_class($this->Owner)
 
                                            . ' changed ' . $name . ' for ' 
 
                                            . get_class($this->Owner) 
 
                                           
. '[' . $this->Owner->getPrimaryKey() .'].'; $log->action= 'CHANGE'; $log->model= get_class($this->Owner); $log->idModel= $this->Owner->getPrimaryKey(); $log->field= $name; $log->creationdate= date("Y-m-d H:i:s", timenew CDbExpression('NOW()'); $log->userid= Yii::app()->user->Nameid; $log->save();
 
 
 
} } } else { $log=new ActiveRecordLog; $log->description= 'User ' . Yii::app()->user->Name
 
                                    
. ' created ' . get_class($this->Owner)
 
                                    
. '[' . $this->Owner->getPrimaryKey() .'].'; $log->action= 'CREATE'; $log->model= get_class($this->Owner); $log->idModel= $this->Owner->getPrimaryKey(); $log->field= ''; $log->creationdate= date("Y-m-d H:i:s", time new CDbExpression('NOW()'); $log->userid= Yii::app()->user->Nameid; $log->save(); } }
 
 
public function afterDelete($event) { $log=new ActiveRecordLog; $log->description= 'User ' . Yii::app()->user->Name . ' deleted ' . get_class($this->Owner)
 
                                . get_class($this->Owner) 
 
                               
. '[' . $this->Owner->getPrimaryKey() .'].'; $log->action= 'DELETE'; $log->model= get_class($this->Owner); $log->idModel= $this->Owner->getPrimaryKey(); $log->field= ''; $log->creationdate= date("Y-m-d H:i:s", time new CDbExpression('NOW()'); $log->userid= Yii::app()->user->Nameid; $log->save(); }
 
 
public function afterFind($event)
{
// Save old values
[...]
```php
public function behaviors()
    { return array(     // Classname => path to Class      'ActiveRecordLogableBehavior'=>      'application.behaviors.ActiveRecordLogableBehavior', );     } }
```
[...]
+ savethe attributeLabels instead of the field names
+ make description customizable
+ and so on...

 
 
 
31 1
47 followers
Viewed: 72 543 times
Version: 1.1
Category: Tutorials
Tags: Logging
Written by: pfth
Last updated by: Yang He
Created on: Feb 13, 2009
Last updated: 11 years ago
Update Article

Revisions

View all history