萨迈耶/auditrail2

热门审计跟踪扩展的重载

安装量: 16,551

依赖项: 7

建议者: 0

安全性: 0

星标: 32

关注者: 11

分支: 14

类型:yii-extension

2.1.0 2015-10-04 19:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:41:34 UTC


README

这基本上是对MadSkillsTisdale在https://yiiframework.cn/extension/audittrail处制作的先前扩展进行修改。

我基本上清理了一些代码,并在本扩展包中添加了一些功能。

安装扩展

安装方法已更改。由于

  • 它只为审计日志小部件提供了全局配置变量
  • 它是额外的膨胀,并不能满足需求
  • 我发现在一个真实系统中,你可能不希望有一个显示所有审计日志条目的页面,因为审计日志
  • 使用CGridView向页面添加审计日志非常简单

因此,出于这些原因,模块已被删除。

Composer

此扩展已在packagist上列出。

步骤 1

要安装,您必须首先选择一个文件夹来放置此存储库。我选择了

/root/backend/extensions/modules

因为这对我来说似乎是正确的。将此存储库克隆到该位置。

步骤 2

现在是安装表的时候了。您可以使用此扩展的原始作者提供的迁移文件,或者您可以使用迁移文件夹中捆绑的SQL文件。只需在您的数据库服务器上运行它(使用PHPMyAdmin或其他工具)即可观看魔法展开。

步骤 3

在您的配置中引用AuditTrail模型

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

注意 您可以将AuditTrail移动到您的models文件夹中,这样您就不需要像这样链接它。

步骤 4

只需在一个模型中使用行为,如

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

尾声

如果您的用户类不是User,则(根据您的设置)您可能需要更改AuditLog模型中的关系以符合您的需求。

API

请注意,以下代码片段仅为代码片段,并未在实际环境中进行测试。建议您将此部分用作参考和文档,不要从此处复制粘贴。

自定义用户属性

有些人没有定义用户,但有一个可审计模型的属性可以定义谁编辑了它的唯一标识符。为此,您可以使用

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

存储时间戳

可以使用以下方法将审计日志的日期更改为使用时间戳

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

更改日期格式

您可以使用行为的dateFormat属性调整日期格式

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

忽略和允许特定字段

此版本有一个有趣的添加。现在,您可以指定一个allowed字段集和一个ignored字段集...或两者都指定。

要这样做,就像您通常那样将行为包含在模型中

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

然后将一个ignoredallowed(或两者都)字段列表添加到行为中,如下所示

'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'
	)
)

放入allowedignored参数的行为中的名称代表字段名称。

正如您所注意到的,我允许使用 ns_purchase_description 字段,同时也忽略它。当您以这种方式使用字段时,ignored 将替换 allowed,并且该字段将被省略。

忽略整个类

如果您将行为放在一个扩展 CActiveRecord 的类中,而您的所有模型都从这个类扩展而来,这将非常有用。在您想让所有类共享相同的核心(如此行为)而不必在每个创建的模型中指定它的情况下,这非常有用。

'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
	),
)

打印审计日志

由于这不再使用模块来完成其工作,因此没有全局配置来使之前内置的审计日志工作。相反,您可以插入一个审计日志(例如,仅作为示例,显示对书籍标题及其产品在书籍标题页面上的更改的审计)

$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))'
        )
    ),
));

为了使 CGridView 更加用户友好,您可以使用这些列

  1. 检索已更改的模型并显示其字符串表示形式

     array(
         'header' => Yii::t('app', 'Name'),
         'value' => '$data->findModel()',
     ),
    
  2. 如果该字段是关系,则查找相关模型并使用该模型而不是显示外键值

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