yii-audittrail

AuditTrail Yii扩展的一个分支。(A fork of the AuditTrail Yii Extension)

  • 所有者: Sammaye/yii-audittrail
  • 平台: BSD, Linux, Mac, Solaris, Windows
  • 许可证:
  • 分类:
  • 主题:
  • 喜欢:
    0
      比较:

Github星跟踪图

audittrail

This is basically a modification of a previous extension made by MadSkillsTisdale at http://www.yiiframework.com/extension/audittrail.

I have basically cleaned up some of the code and made a few additions to the behaviour bundled within this extension.

Installing the extension

The method of installation has changed. I have removed the need to install a module since:

  • It only provided global configuration variables for the audit log widget
  • It was extra bloat that didn't justify the needs
  • I found that in a real system you wouldn't want a page showing all audit log entries since the audit logs
  • The audit log is quite easy to add to a page using CGridView

As such, for these reasons, the module itself has been deleted.

Composer

This extension is listed on packagist.

Step 1

To install you must first choose a folder in which to place this repository. I have chosen:

/root/backend/extensions/modules

Since this seems most right to me. Clone this repository to that location.

Step 2

Time to install the table. You can use the migration file provided by the original author of this extension or you can use the SQL file bundled within the migrations folder. Simply
run it on your DB server (using PHPMyAdmin or something) and watch the magic unfold.

Step 3

Reference the AuditTrail model within your configuration:

'import'=>array(
	'site.backend.extensions.modules.auditTrail.models.AuditTrail',
),

Note You can move AuditTrail to your models folder preventing you from having to link it like this.

Step 4

Simply use the behaviour within a model like:

'LoggableBehavior'=> array(
	'class' => 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior',
)

Epilogue

If your user class is not User then you may (depending on your setup) need to change the relation within the AuditLog model to suite your needs.

API

Please note that the below snippets are snippets only and are not tested in a real environment. It is recommend that you use this section as reference and documentation only, do not
copy and paste from here.

Custom User Attributes

Some people don't actually have defined users but do have an attribute of the auditable model that would define a unique identification of who edited it. For this end you can use:

'LoggableBehavior'=> array(
	'class' => 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior',
	'userAttribute' => 'name'
)

Storing Timestamps

The date of the audit log can be changed to used timestamps instead using:

'LoggableBehavior'=> array(
	'class' => 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior',
	'storeTimestamp' => true
)

Changing the date format

You can adjust the date format using the dateFormat property of the behaviour:

'LoggableBehavior'=> array(
	'class' => 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior',
	'dateFormat' => 'Y-m-d H:i:s'
)

Ignoring and allowing specific fields

There is one interesting addition to this version. You can now specify an allowed set of fields and a ignored set of fields...or both.

To do this include the behaviour in your models like you normally would:

'LoggableBehavior'=> 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior'

But then add either an ignored or allowed (or both) list of fields to the behaviour like so:

'LoggableBehavior'=> array(
	'class' => 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior',
	'allowed' => array(
		'version',
		'ns_purchase_description'
	),
	'ignored' => array(
		'ns_purchase_description',
		'ns_display_name',
		'update_time'
	)
)

The names put into the allowed and ignored parameters of the behaviour represent field names.

As you will notice I allow the ns_purchase_description field but also ignore it. When you use the fields in this way ignored will replace the allowed and this field will be omitted.

Ignoring a whole class

This is useful if you put the behaviour in a class that extends CActiveRecord which all your own models extend from. This is useful in cases where you want ALL your classes to share the same core (like this behaviour) without having to specify it in every model you create.

'LoggableBehavior'=> array(
	'class' => 'site.backend.extensions.modules.auditTrail.behaviors.LoggableBehavior',
  	'ignored_class' => array(
		'ErrorLog',  // I use this to log error messages to MYSQL, no need to keep a log of this
	),
)

Printing out the audit log

Since this no longer uses a module to do its work there is no global configuration for the previously inbuilt audit log to work from. Instead you can insert an audit log
like (as an example only, showing an audit of changes to a book title and it's products on a book title page):

$model_ids = array(array($model->id, 'Title'));
foreach($model->products as $id => $product){
    $model_ids[] = array($product->id, 'Product');
}

$criteria=new CDbCriteria(array(
    'order'=>'stamp DESC',
    'with'=>array('user'),
));
$param_id = 0;
foreach( $model_ids as $id_pair ) {
    $criteria->addCondition( '( model_id = :id' . $param_id . ' AND model = :model' . $param_id . ' )', 'OR' );
    $criteria->params[ ':id' . $param_id ] = $id_pair[0];
    $criteria->params[ ':model' . $param_id ] = $id_pair[1];
    $param_id++;
}

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'title-grid',
    'dataProvider'=>new CActiveDataProvider('AuditTrail', array(
        'criteria'=>$criteria,
        'pagination'=>array(
            'pageSize'=>100,
        )
    )),
    'columns'=>array(
        array(
            'name' => 'Author',
            'value' => '$data->user ? $data->user->email : ""'
        ),
        'model',
        'model_id',
        'action',
        array(
            'name' => 'field',
            'value' => '$data->getParent()->getAttributeLabel($data->field)'
        ),
        'old_value',
        'new_value',
        array(
            'name' => 'Date Changed',
            'value' => 'date("d-m-Y H:i:s", strtotime($data->stamp))'
        )
    ),
));

For more user-friendliness in the CGridView, you can use these columns:

  1. Retrieves the changed model and shows its string representation:

     array(
         'header' => Yii::t('app', 'Name'),
         'value' => '$data->findModel()',
     ),
    
  2. If the field is a relation, find the related model and use that instead of showing the FK value:

     array(
         'name' => 'old_value',
         'value' => '$data->getOldValue()', 
     ),
     array(
         'name' => 'new_value',
         'value' => '$data->getNewValue()',
     ),

主要指标

概览
名称与所有者Sammaye/yii-audittrail
主编程语言PHP
编程语言PHP (语言数: 1)
平台BSD, Linux, Mac, Solaris, Windows
许可证
所有者活动
创建于2012-08-16 10:35:55
推送于2015-10-04 19:59:56
最后一次提交2015-10-04 20:58:18
发布数9
最新版本名称2.1.0 (发布于 )
第一版名称1.0.0 (发布于 2013-04-08 08:21:54)
用户参与
星数32
关注者数10
派生数13
提交数41
已启用问题?
问题数15
打开的问题数0
拉请求数6
打开的拉请求数0
关闭的拉请求数2
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?