summaryrefslogtreecommitdiff
path: root/protected/modules/auditTrail/widgets/portlets/ShowAuditTrail.php
diff options
context:
space:
mode:
Diffstat (limited to 'protected/modules/auditTrail/widgets/portlets/ShowAuditTrail.php')
-rw-r--r--protected/modules/auditTrail/widgets/portlets/ShowAuditTrail.php157
1 files changed, 157 insertions, 0 deletions
diff --git a/protected/modules/auditTrail/widgets/portlets/ShowAuditTrail.php b/protected/modules/auditTrail/widgets/portlets/ShowAuditTrail.php
new file mode 100644
index 0000000..eb5a94f
--- /dev/null
+++ b/protected/modules/auditTrail/widgets/portlets/ShowAuditTrail.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * ShowAuditTrail shows the audit trail for the current item
+ */
+
+Yii::import('zii.widgets.CPortlet');
+require_once(realpath(dirname(__FILE__) . '/../../AuditTrailModule.php'));
+
+class ShowAuditTrail extends CPortlet
+{
+ /**
+ * @var CActiveRecord the model you want to use with this field
+ */
+ public $model;
+
+ /**
+ * @var boolean whether or not to show the widget
+ */
+ public $visible = true;
+
+ /**
+ * @var this allows you to override individual columns' display properties in the datagrid.
+ * Column definitions should be indexed by column name, and the value should match the column
+ * format of CDataGrid. For example:
+ *
+ * 'dataGridColumnsOverride' => array(
+ * 'old_value' => array(
+ * 'name' => 'old_value',
+ * 'filter' => '',
+ * ),
+ * 'new_value' => array(
+ * 'name' => 'new_value',
+ * 'filter' => '',
+ * ),
+ * )
+ *
+ * Please do not specify a column if you do not wish to override the defaults of that column.
+ * Also, please be careful when specifying a format for user_id, as special handling exists
+ * to format the user name
+ */
+ public $dataGridColumnsOverride = array( );
+
+ /**
+ * @var AuditTrailModule static variable to hold the module so we don't have to instantiate it a million times to get config values
+ */
+ private static $__auditTrailModule;
+
+ /**
+ * Sets the title of the portlet
+ */
+ public function init() {
+ $this->title = "Audit Trail For " . get_class($this->model) . " " . $this->model->id;
+ parent::init();
+ }
+
+ /**
+ * generates content of widget the widget.
+ * This renders the widget, if it is visible.
+ */
+ public function renderContent()
+ {
+ if($this->visible) {
+ $auditTrail = AuditTrail::model()->recently();
+ $auditTrail->model = get_class($this->model);
+ $auditTrail->model_id = $this->model->primaryKey;
+ $columnFormat = $this->getColumnFormat();
+ $this->widget('zii.widgets.grid.CGridView', array(
+ 'id'=>'audit-trail-grid',
+ 'dataProvider'=>$auditTrail->search(),
+ 'columns'=> $this->getColumnFormat(),
+ ));
+ }
+ }
+
+ /**
+ * Builds the label code we need to display usernames correctly
+ * @return The code to be evaled to display the user info correctly
+ */
+ protected function getEvalUserLabelCode() {
+ $userClass = $this->getFromConfigOrObject('userClass');
+ $userNameColumn = $this->getFromConfigOrObject('userNameColumn');
+ $userEvalLabel = ' ( ($t = '
+ . $userClass
+ . '::model()->findByPk($data->user_id)) == null ? "": $t->'
+ . $userNameColumn
+ . ' ) ';
+ return $userEvalLabel;
+ }
+
+ /**
+ * Returns the value you want to look up, either from the config file or a user's override
+ * @var value The name of the value you would like to look up
+ * @return the config value you need
+ */
+ protected function getFromConfigOrObject($value) {
+ $at = Yii::app()->modules['auditTrail'];
+
+ //If we can get the value from the config, do that to save overhead
+ if( isset( $at[$value]) && !empty($at[$value] ) ) {
+ return $at[$value];
+ }
+
+ //If we cannot get the config value from the config file, get it from the
+ //instantiated object. Only instantiate it once though, its probably
+ //expensive to do. PS I feel this is a dirty trick and I don't like it
+ //but I don't know a better way
+ if(!is_object(self::$__auditTrailModule)) {
+ self::$__auditTrailModule = new AuditTrailModule(microtime(), null);
+ }
+
+ return self::$__auditTrailModule->$value;
+ }
+
+ /**
+ * Gets final column format. Starts with default column format (specified in this method
+ * and checks $this->dataGridColumnsOverride array to see if any columns need to use a
+ * user specified format.
+ * @return array The final format array, with any user specified formats taking precedent over defaults
+ */
+ protected function getColumnFormat() {
+ $evalUserLabel = $this->getEvalUserLabelCode();
+ $columnFormat = array();
+ $defaultColumnFormat = array(
+ 'old_value' => array(
+ 'name' => 'old_value',
+ 'filter' => '',
+ ),
+ 'new_value' => array(
+ 'name' => 'new_value',
+ 'filter' => '',
+ ),
+ 'action' => array(
+ 'name' => 'action',
+ 'filter'=> '',
+ ),
+ 'field' => array(
+ 'name' => 'field',
+ 'filter' => '',
+ ),
+ 'stamp' => array(
+ 'name' => 'stamp',
+ 'filter' => '',
+ ),
+ 'user_id' => array(
+ 'name' => 'user_id',
+ 'value'=>$evalUserLabel,
+ 'filter'=> '',
+ ),
+ );
+
+ foreach($defaultColumnFormat as $key => $format) {
+ $columnFormat[] = isset($this->dataGridColumnsOverride[$key]) ? $this->dataGridColumnsOverride[$key] : $defaultColumnFormat[$key];
+ }
+
+ return $columnFormat;
+ }
+} \ No newline at end of file