yii2-audittrail
Yii2 edition of the audittrail extension., (*1)
Installation
The preferred way to install this extension is through composer., (*2)
php composer.phar require sammaye/yii2-audittrail
Migration
There are two ways of doing this:, (*3)
- Copy the migration file (within the
migrations
folder) to your console/migrations
folder
- Run
php yii migrate --migrationPath=@vendor/sammaye/yii2-audittrail/migrations
How to use
To use this extension you can simply add it to the model's behaviours:, (*4)
use yii\db\ActiveRecord;
class Model extends ActiveRecord
{
public function behaviors()
{
return [
'sammaye\audittrail\LoggableBehavior'
];
}
}
You can convert the entered behaviour into a key - value structure to define options for the extension for that model:, (*5)
class Model extends ActiveRecord
{
public function behaviors()
{
return [
'LoggableBehavior' => [
'class' => 'sammaye\audittrail\LoggableBehavior',
'ignored' => ['some_field'], // This ignores fields from a selection of all fields, not needed with allowed
'allowed' => ['another_field'] // optional, not needed if you use ignore
]
];
}
}
And that is basically how to setup this extension., (*6)
Changes
There are a couple of changes., (*7)
One of them is how to define global parameters for this extension., (*8)
An example of global parameters would be setting you own table name or defining the location of the user model., (*9)
To define your own table you can add a parameter to your params.php
file called audittrail.table
which would take something like {{%audit}}
., (*10)
To define your own user model location you can add audittrail.model
using a value like common\models\User
., (*11)
The only other change is really to do with the best way to query the audit trail., (*12)
The below example is the one from the previous documentation rewritten for Yii2:, (*13)
id, Title::className()));
foreach($model->products as $id => $product){
$model_ids[] = array($product->id, Product::className());
}
$criteria = AuditTrail::find();
$param_id = 0;
// $model_ids is the one you built in your original code
foreach( $model_ids as $id_pair ) {
$criteria->orWhere('model_id = :id' . $param_id . ' AND model = :model' . $param_id);
$criteria->addParams([
':id' . $param_id => $id_pair[0],
':model' . $param_id => $id_pair[1]
]);
$param_id++;
}
$criteria->orderBy(['stamp' => SORT_DESC]);
echo yii\grid\GridView::widget([
'dataProvider' => new ActiveDataProvider([
'query' => $criteria,
'pagination' => [
'pageSize' => 100,
]
]),
'columns' => [
[
'label' => 'Author',
'value' => function($model, $index, $widget){
return $model->user ? $model->user->email : "";
}
],
[
'attribute' => 'model',
'value' => function($model, $index, $widget){
$p = explode('\\', $model->model);
return end($p);
}
],
'model_id',
'action',
[
'label' => 'field',
'value' => function($model, $index, $widget){
return $model->getParent()->getAttributeLabel($model->field);
}
],
'old_value',
'new_value',
[
'label' => 'Date Changed',
'value' => function($model, $index, $widget){
return date("d-m-Y H:i:s", strtotime($model->stamp));
}
]
]
]); ?>
Notice the:, (*14)
[
'attribute' => 'model',
'value' => function($model, $index, $widget){
$p = explode('\\', $model->model);
return end($p);
}
],
This allows us to get the name of the model without the namespace part on it., (*15)
Currently in this extension I store the fully qualified name of the class to:, (*16)
- Take advantage of namespacing to create uniqueness
- To make it easier to query using the
className()
function in Objects.
Resources