Completed
Push — develop ( 1444a0...e0670d )
by Bob Olde
04:49
created

AuditLogService::elementHasChanged()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 33
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 3

Importance

Changes 8
Bugs 2 Features 4
Metric Value
c 8
b 2
f 4
dl 0
loc 33
ccs 19
cts 19
cp 1
rs 8.8571
cc 3
eloc 16
nc 4
nop 4
crap 3
1
<?php
2
3
namespace Craft;
4
5
/**
6
 * Audit Log service.
7
 *
8
 * Contains logics for logging
9
 *
10
 * @author    Bob Olde Hampsink <[email protected]>
11
 * @copyright Copyright (c) 2015, Bob Olde Hampsink
12
 * @license   MIT
13
 *
14
 * @link      http://github.com/boboldehampsink
15
 */
16
class AuditLogService extends BaseApplicationComponent
17
{
18
    /**
19
     * Show log with criteria.
20
     *
21
     * @param object $criteria
22
     *
23
     * @return array
24
     *
25
     * @codeCoverageIgnore
26
     */
27
    public function log($criteria)
28
    {
29
        // Build specific criteria
30
        $criteria = craft()->elements->getCriteria('AuditLog', $criteria);
31
32
        // Return occurences
33
        return $criteria->find();
34
    }
35
36
    /**
37
     * View a specific log item.
38
     *
39
     * @param int $id
40
     *
41
     * @return AuditLogModel
42
     */
43 1
    public function view($id)
44
    {
45
        // Get log from record
46 1
        $log = craft()->elements->getCriteria('AuditLog', array('id' => $id))->first();
47
48
        // Create diff
49 1
        $diff = array();
50
51
        // Loop through content
52 1
        foreach ($log->after as $handle => $item) {
53
54
            // Set parsed values
55 1
            $diff[$handle] = array(
56 1
                'label' => $item['label'],
57 1
                'changed' => ($item['value'] != $log['before'][$handle]['value']),
58 1
                'after' => $item['value'],
59 1
                'before' => $log['before'][$handle]['value'],
60
            );
61 1
        }
62
63
        // Set diff
64 1
        $log->setAttribute('diff', $diff);
65
66
        // Return the log
67 1
        return $log;
68
    }
69
70
    /**
71
     * Parse field values.
72
     *
73
     * @param string $handle
74
     * @param mixed  $data
75
     *
76
     * @return string
77
     */
78 6
    public function parseFieldData($handle, $data)
79
    {
80
        // Do we have any data at all
81 6
        if (!is_null($data)) {
82
83
            // Get field info
84 5
            $field = craft()->fields->getFieldByHandle($handle);
85
86
            // If it's a field ofcourse
87 5
            if (!is_null($field)) {
88
89
                // For some fieldtypes the're special rules
90 5
                switch ($field->type) {
91
92 5
                    case AuditLogModel::FieldTypeEntries:
93 5
                    case AuditLogModel::FieldTypeCategories:
94 5
                    case AuditLogModel::FieldTypeAssets:
95 5
                    case AuditLogModel::FieldTypeUsers:
96
97
                        // Show names
98 1
                        $data = implode(', ', $data->find());
99
100 1
                        break;
101
102 4
                    case AuditLogModel::FieldTypeLightswitch:
103
104
                        // Make data human readable
105
                        switch ($data) {
106
107 4
                            case '0':
108 1
                                $data = Craft::t('No');
109 1
                                break;
110
111 3
                            case '1':
112 1
                                $data = Craft::t('Yes');
113 1
                                break;
114
115
                        }
116
117 4
                        break;
118
119 5
                }
120 5
            }
121 5
        } else {
122
123
            // Don't return null, return empty
124 1
            $data = '';
125
        }
126
127
        // If it's an array, make it a string
128 6
        if (is_array($data)) {
129 1
            $data = StringHelper::arrayToString(array_filter(ArrayHelper::flattenArray($data), 'strlen'), ', ');
130 1
        }
131
132
        // If it's an object, make it a string
133 6
        if (is_object($data)) {
134 1
            $data = StringHelper::arrayToString(array_filter(ArrayHelper::flattenArray(get_object_vars($data)), 'strlen'), ', ');
135 1
        }
136
137 6
        return $data;
138
    }
139
140
    /**
141
     * Check if an element has changed while saving.
142
     *
143
     * @param string $elementType
144
     * @param int    $id
145
     * @param array  $before
146
     * @param array  $after
147
     *
148
     * @return array
149
     */
150 1
    public function elementHasChanged($elementType, $id, $before, $after)
151
    {
152
        // Flatten arrays
153 1
        $flatBefore = ArrayHelper::flattenArray($before);
154 1
        $flatAfter = ArrayHelper::flattenArray($after);
155
156
        // Calculate the diffence
157 1
        $flatDiff = array_diff_assoc($flatAfter, $flatBefore);
158
159
        // Expand diff again
160 1
        $expanded = ArrayHelper::expandArray($flatDiff);
161
162
        // Add labels once again
163 1
        $diff = array();
164 1
        foreach ($expanded as $key => $value) {
165 1
            $diff[$key]['label'] = $before[$key]['label'];
166 1
            $diff[$key]['value'] = $value['value'];
167 1
        }
168
169
        // If there IS a difference
170 1
        if (count($diff)) {
171
172
            // Fire an "onElementChanged" event
173 1
            $event = new Event($this, array(
174 1
                'elementType' => $elementType,
175 1
                'id' => $id,
176 1
                'diff' => $diff,
177 1
            ));
178 1
            $this->onElementChanged($event);
179 1
        }
180
181 1
        return $diff;
182
    }
183
184
    /**
185
     * Fires an "onElementChanged" event.
186
     *
187
     * @param Event $event
188
     */
189 1
    public function onElementChanged(Event $event)
190
    {
191 1
        $this->raiseEvent('onElementChanged', $event);
192 1
    }
193
194
    /**
195
     * Fires an "onFieldChanged" event.
196
     *
197
     * @param Event $event
198
     *
199
     * @codeCoverageIgnore
200
     */
201
    public function onFieldChanged(Event $event)
202
    {
203
        $this->raiseEvent('onFieldChanged', $event);
204
    }
205
}
206