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 (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
description VARCHAR(255) NULL,[...]
creationdate TIMESTAMP NOT NULL,
userid VARCHAR(45) NULL,
PRIMARY KEY(idActiveRecordLog)
)
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->userid= Yii::app()->user->id;
$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);[...]
}
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);[...]
}
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...