Completed
Push — develop ( 18e76c...1630dd )
by Bob Olde
05:19
created

AuditLog_CategoryService   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 214
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 18
Bugs 4 Features 5
Metric Value
wmc 16
c 18
b 4
f 5
lcom 1
cbo 1
dl 0
loc 214
ccs 71
cts 71
cp 1
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A log() 0 11 1
A onBeforeSaveCategory() 0 18 2
B onSaveCategory() 0 38 4
B onBeforeDeleteCategory() 0 36 2
B fields() 0 62 7
1
<?php
2
3
namespace Craft;
4
5
/**
6
 * Audit Log Category service.
7
 *
8
 * Contains logics for logging categories
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_CategoryService 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('categories.onBeforeSaveCategory', array($this, 'onBeforeSaveCategory'));
41
42
        // Get values after saving
43
        craft()->on('categories.onSaveCategory', array($this, 'onSaveCategory'));
44
45
        // Get values before deleting
46
        craft()->on('categories.onBeforeDeleteCategory', array($this, 'onBeforeDeleteCategory'));
47
    }
48
49
    /**
50
     * Handle the onBeforeSaveCategory event.
51
     *
52
     * @param Event $event
53
     */
54 2
    public function onBeforeSaveCategory(Event $event)
55
    {
56
        // Get category id to save
57 2
        $id = $event->params['category']->id;
58
59 2
        if (!$event->params['isNewCategory']) {
60
61
            // Get old category from db
62 1
            $category = CategoryModel::populateModel(CategoryRecord::model()->findById($id));
63
64
            // Get fields
65 1
            $this->before = $this->fields($category);
66 1
        } else {
67
68
            // Get fields
69 1
            $this->before = $this->fields($event->params['category'], true);
70
        }
71 2
    }
72
73
    /**
74
     * Handle the onSaveCategory event.
75
     *
76
     * @param Event $event
77
     */
78 2
    public function onSaveCategory(Event $event)
79
    {
80
        // Get saved category
81 2
        $category = $event->params['category'];
82
83
        // Get fields
84 2
        $this->after = $this->fields($category);
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::Category;
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['isNewCategory'] ? AuditLogModel::CREATED : AuditLogModel::MODIFIED);
109
110
        // Save row
111 2
        $log->save(false);
112
113
        // Callback
114 2
        craft()->auditLog->elementHasChanged(ElementType::Category, $category->id, $this->before, $this->after);
115 2
    }
116
117
    /**
118
     * Handle the onBeforeDeleteCategory event.
119
     *
120
     * @param Event $event
121
     */
122 2
    public function onBeforeDeleteCategory(Event $event)
123
    {
124
        // Get deleted category
125 2
        $category = $event->params['category'];
126
127
        // Get fields
128 2
        $this->before = $this->fields($category);
129 2
        $this->after = $this->fields($category, 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::Category;
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::Category, $category->id, $this->before, $this->after);
157 2
    }
158
159
    /**
160
     * Parse category fields.
161
     *
162
     * @param CategoryModel $category
163
     * @param bool          $empty
164
     *
165
     * @return array
166
     */
167 4
    public function fields(CategoryModel $category, $empty = false)
168
    {
169
170
        // Always save id
171
        $fields = array(
172 1
            'id' => array(
173 4
                'label' => Craft::t('ID'),
174 4
                'value' => $category->id,
175 4
            ),
176
            'title' => array(
177 4
                'label' => Craft::t('Title'),
178 4
                'value' => (string) $category->getTitle(),
179 4
            ),
180
            'group' => array(
181 4
                'label' => Craft::t('Group'),
182 4
                'value' => (string) $category->getGroup(),
183 4
            ),
184 4
        );
185
186
        // Get element type
187 4
        $elementType = craft()->elements->getElementType(ElementType::Category);
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 ($category->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
        foreach (craft()->fields->getLayoutByType(ElementType::Category)->getFields() as $field) {
212
213
            // Get field values
214 4
            $field = $field->getField();
215 4
            $handle = $field->handle;
216 4
            $label = $field->name;
217 4
            $value = $empty ? '' : craft()->auditLog->parseFieldData($handle, $category->$handle);
218
219
            // Set on fields
220 4
            $fields[$handle] = array(
221 4
                'label' => $label,
222 4
                'value' => $value,
223
            );
224 4
        }
225
226
        // Return
227 4
        return $fields;
228
    }
229
}
230