Completed
Push — develop ( 355c47...18e76c )
by Bob Olde
05:15
created

AuditLog_EntryService::log()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 13
Bugs 3 Features 4
Metric Value
c 13
b 3
f 4
dl 0
loc 11
ccs 0
cts 0
cp 0
rs 9.4285
cc 1
eloc 4
nc 1
nop 0
crap 2
1
<?php
2
3
namespace Craft;
4
5
/**
6
 * Audit Log Entry service.
7
 *
8
 * Contains logics for logging entries
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 AuditLog_EntryService extends BaseApplicationComponent
17
{
18
    /**
19
     * Catch value before saving.
20
     *
21
     * @var array
22
     */
23
    public $before = array();
24
25
    /**
26
     * Catch value after saving.
27
     *
28
     * @var array
29
     */
30
    public $after = array();
31
32
    /**
33
     * Initialize the category saving/deleting events.
34
     *
35
     * @codeCoverageIgnore
36
     */
37
    public function log()
38
    {
39
        // Get values before saving
40
        craft()->on('entries.onBeforeSaveEntry', array($this, 'onBeforeSaveEntry'));
41
42
        // Get values after saving
43
        craft()->on('entries.onSaveEntry', array($this, 'onSaveEntry'));
44
45
        // Get values before deleting
46
        craft()->on('entries.onBeforeDeleteEntry', array($this, 'onBeforeDeleteEntry'));
47
    }
48
49
    /**
50
     * Handle the onBeforeSaveEntry event.
51
     *
52
     * @param Event $event
53
     */
54 2
    public function onBeforeSaveEntry(Event $event)
55
    {
56
        // Get entry id to save
57 2
        $id = $event->params['entry']->id;
58
59 2
        if (!$event->params['isNewEntry']) {
60
61
            // Get old entry from db
62 1
            $entry = EntryModel::populateModel(EntryRecord::model()->findById($id));
63
64
            // Get fields
65 1
            $this->before = $this->fields($entry);
66 1
        } else {
67
68
            // Get fields
69 1
            $this->before = $this->fields($event->params['entry'], true);
70
        }
71 2
    }
72
73
    /**
74
     * Handle the onSaveEntry event.
75
     *
76
     * @param Event $event
77
     */
78 2
    public function onSaveEntry(Event $event)
79
    {
80
        // Get saved entry
81 2
        $entry = $event->params['entry'];
82
83
        // Get fields
84 2
        $this->after = $this->fields($entry);
85
86
        // New row
87 2
        $log = new AuditLogRecord();
88
89
        // Get user
90 2
        $user = craft()->userSession->getUser();
91
92
        // Set user id
93 2
        $log->userId = $user ? $user->id : null;
94
95
        // Set element type
96 2
        $log->type = ElementType::Entry;
97
98
        // Set origin
99 2
        $log->origin = craft()->request->isCpRequest() ? craft()->config->get('cpTrigger').'/'.craft()->request->path : craft()->request->path;
100
101
        // Set before
102 2
        $log->before = $this->before;
103
104
        // Set after
105 2
        $log->after = $this->after;
106
107
        // Set status
108 2
        $log->status = ($event->params['isNewEntry'] ? AuditLogModel::CREATED : AuditLogModel::MODIFIED);
109
110
        // Save row
111 2
        $log->save(false);
112
113
        // Callback
114 2
        craft()->auditLog->elementHasChanged(ElementType::Entry, $entry->id, $this->before, $this->after);
115 2
    }
116
117
    /**
118
     * Handle the onBeforeDeleteEntry event.
119
     *
120
     * @param Event $event
121
     */
122 2
    public function onBeforeDeleteEntry(Event $event)
123
    {
124
        // Get deleted entry
125 2
        $entry = $event->params['entry'];
126
127
        // Get fields
128 2
        $this->before = $this->fields($entry);
129 2
        $this->after = $this->fields($entry, true);
130
131
        // New row
132 2
        $log = new AuditLogRecord();
133
134
        // Set user id
135 2
        $log->userId = craft()->userSession->getUser()->id;
136
137
        // Set element type
138 2
        $log->type = ElementType::Entry;
139
140
        // Set origin
141 2
        $log->origin = craft()->request->isCpRequest() ? craft()->config->get('cpTrigger').'/'.craft()->request->path : craft()->request->path;
142
143
        // Set before
144 2
        $log->before = $this->before;
145
146
        // Set after
147 2
        $log->after = $this->after;
148
149
        // Set status
150 2
        $log->status = AuditLogModel::DELETED;
151
152
        // Save row
153 2
        $log->save(false);
154
155
        // Callback
156 2
        craft()->auditLog->elementHasChanged(ElementType::Entry, $entry->id, $this->before, $this->after);
157 2
    }
158
159
    /**
160
     * Parse entry fields.
161
     *
162
     * @param EntryModel $entry
163
     * @param bool       $empty
164
     *
165
     * @return array
166
     */
167 4
    public function fields(EntryModel $entry, $empty = false)
168
    {
169
170
        // Always save id and title
171
        $fields = array(
172 1
            'id' => array(
173 4
                'label' => Craft::t('ID'),
174 4
                'value' => $entry->id,
175 4
            ),
176
            'title' => array(
177 4
                'label' => Craft::t('Title'),
178 4
                'value' => (string) $entry->getTitle(),
179 4
            ),
180
            'section' => array(
181 4
                'label' => Craft::t('Section'),
182 4
                'value' => (string) $entry->getSection(),
183 4
            ),
184 4
        );
185
186
        // Get element type
187 4
        $elementType = craft()->elements->getElementType(ElementType::Entry);
188
189
        // Get nice attributes
190 4
        $availableAttributes = $elementType->defineAvailableTableAttributes();
191
192
        // Make 'em fit
193 4
        $attributes = array();
194 4
        foreach ($availableAttributes as $key => $result) {
195 4
            $attributes[$key] = $result['label'];
196 4
        }
197
198
        // Get static "fields"
199 4
        foreach ($entry->getAttributes() as $handle => $value) {
200
201
            // Only show nice attributes
202 4
            if (array_key_exists($handle, $attributes)) {
203 1
                $fields[$handle] = array(
204 1
                    'label' => $attributes[$handle],
205 1
                    'value' => StringHelper::arrayToString(is_array($value) ? array_filter(ArrayHelper::flattenArray($value), 'strlen') : $value, ', '),
206
                );
207 1
            }
208 4
        }
209
210
        // Get fieldlayout
211 4
        $entrytype = $entry->getType();
212 4
        if ($entrytype) {
213 4
            $tabs = craft()->fields->getLayoutById($entrytype->fieldLayoutId)->getTabs();
214 4
            foreach ($tabs as $tab) {
215 4
                foreach ($tab->getFields() as $field) {
216
217
                    // Get field values
218 4
                    $field = $field->getField();
219 4
                    $handle = $field->handle;
220 4
                    $label = $field->name;
221 4
                    $value = $empty ? '' : craft()->auditLog->parseFieldData($handle, $entry->$handle);
222
223
                    // Set on fields
224 4
                    $fields[$handle] = array(
225 4
                        'label' => $label,
226 4
                        'value' => $value,
227
                    );
228 4
                }
229 4
            }
230 4
        }
231
232
        // Return
233 4
        return $fields;
234
    }
235
}
236