Completed
Push — master ( 156eba...70d682 )
by Andreas
17:24
created

midgard_admin_asgard_plugin::_on_initialize()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 19
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2.0054

Importance

Changes 0
Metric Value
cc 2
eloc 8
nc 2
nop 0
dl 0
loc 19
ccs 8
cts 9
cp 0.8889
crap 2.0054
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * @package midgard.admin.asgard
4
 * @author The Midgard Project, http://www.midgard-project.org
5
 * @copyright The Midgard Project, http://www.midgard-project.org
6
 * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
7
 */
8
9
/**
10
 * Plugin interface
11
 *
12
 * @package midgard.admin.asgard
13
 */
14
class midgard_admin_asgard_plugin extends midcom_baseclasses_components_plugin
15
{
16 33
    public function _on_initialize()
17
    {
18 33
        midcom::get()->auth->require_user_do('midgard.admin.asgard:access', null, 'midgard_admin_asgard_plugin');
19
        // Disable content caching
20 33
        midcom::get()->cache->content->no_cache();
21
22
        // Preferred language
23 33
        if ($language = self::get_preference('interface_language')) {
24
            $this->_i18n->set_language($language);
25
        }
26
27
        // Enable jQuery
28 33
        midcom::get()->head->enable_jquery();
29
30
        // Ensure we get the correct styles
31 33
        midcom::get()->style->prepend_component_styledir('midgard.admin.asgard');
32
33 33
        $this->_request_data['asgard_toolbar'] = new midgard_admin_asgard_toolbar();
34 33
        self::get_default_mode($this->_request_data);
35 33
    }
36
37
    /**
38
     * Static method other plugins may use
39
     *
40
     * @param array $data      Local request data
41
     */
42 16
    public static function prepare_plugin(string $title, array &$data)
43
    {
44 16
        midcom::get()->auth->require_user_do('midgard.admin.asgard:access', null, 'midgard_admin_asgard_plugin');
45
        // Disable content caching
46 16
        midcom::get()->cache->content->no_cache();
47 16
        $data['view_title'] = $title;
48 16
        $data['asgard_toolbar'] = new midgard_admin_asgard_toolbar();
49 16
        self::get_default_mode($data);
50
51
        // Preferred language
52 16
        if (($language = self::get_preference('interface_language'))) {
53
            midcom::get()->i18n->set_language($language);
54
        }
55
56 16
        midcom::get()->style->prepend_component_styledir('midgard.admin.asgard');
57 16
        midcom::get()->style->prepend_component_styledir(str_replace('asgard_', '', $data['plugin_name']));
58 16
    }
59
60 28
    public static function get_type_label(string $type) : string
61
    {
62 28
        return midcom_helper_reflector_tree::get($type)->get_class_label();
63
    }
64
65
    /**
66
     * Bind view to an object
67
     */
68 21
    public static function bind_to_object($object, $handler_id, array &$data)
69
    {
70
        // Tell our object to MidCOM
71 21
        midcom::get()->metadata->set_request_metadata($object->metadata->revised, $object->guid);
72 21
        $data['object_reflector'] = midcom_helper_reflector::get($object);
73 21
        $data['tree_reflector'] = midcom_helper_reflector_tree::get($object);
74
75 21
        $data['object'] = $object;
76
77
        // Populate toolbars
78 21
        if (midcom::get()->dbclassloader->is_midcom_db_object($object)) {
79
            // Bind the object to the metadata service
80 21
            midcom::get()->metadata->bind_to($object);
81
82
            // These toolbars only work with DBA objects as they do ACL checks
83 21
            $view_toolbar = midcom::get()->toolbars->get_view_toolbar();
84 21
            $view_toolbar->bind_to($object);
85 21
            $data['asgard_toolbar']->bind_to_object($object, $handler_id, $data);
86 21
            self::_set_object_breadcrumb($object, $handler_id, $data);
87
        }
88
89 21
        self::set_pagetitle($object, $handler_id, $data);
90 21
    }
91
92 21
    public static function set_pagetitle($object, $handler_id, array &$data)
93
    {
94
        // Figure out correct title and language handling
95 21
        switch ($handler_id) {
96 21
            case 'object_edit':
97 1
                $title_string = midcom::get()->i18n->get_string('edit %s %s', 'midgard.admin.asgard');
98 1
                break;
99 20
            case 'object_metadata':
100 1
                $title_string = midcom::get()->i18n->get_string('metadata of %s %s', 'midgard.admin.asgard');
101 1
                break;
102 19
            case 'object_attachments':
103 18
            case 'object_attachments_edit':
104 2
                $title_string = midcom::get()->i18n->get_string('attachments of %s %s', 'midgard.admin.asgard');
105 2
                break;
106 17
            case 'object_parameters':
107 1
                $title_string = midcom::get()->i18n->get_string('parameters of %s %s', 'midgard.admin.asgard');
108 1
                break;
109 16
            case 'object_permissions':
110
                // Figure out label for the object's class
111 1
                $type = $data['object_reflector']->get_class_label();
112 1
                $title_string = sprintf(midcom::get()->i18n->get_string('permissions for %s %s', 'midgard.admin.asgard'), $type, $data['object_reflector']->get_object_label($object));
113 1
                break;
114 15
            case 'object_create':
115 1
                $title_string = sprintf(midcom::get()->i18n->get_string('create %s under %s', 'midgard.admin.asgard'), self::get_type_label($data['current_type']), '%s %s');
116 1
                break;
117 14
            case 'object_delete':
118 1
                $title_string = midcom::get()->i18n->get_string('delete %s %s', 'midgard.admin.asgard');
119 1
                break;
120
            default:
121 13
                $title_string = midcom::get()->i18n->get_string('%s %s', 'midgard.admin.asgard');
122 13
                break;
123
        }
124
125 21
        $label = $data['object_reflector']->get_object_label($object);
126 21
        $type_label = self::get_type_label(get_class($object));
127 21
        $data['view_title'] = sprintf($title_string, $type_label, $label);
128 21
    }
129
130
    /**
131
     * Set the default object mode
132
     */
133 49
    public static function get_default_mode(array &$data) : string
134
    {
135
        //only set mode once per request
136 49
        if (!empty($data['default_mode'])) {
137
            return $data['default_mode'];
138
        }
139 49
        $data['default_mode'] = 'view';
140
141 49
        if (   !self::get_preference('edit_mode')
142 49
            && midcom_baseclasses_components_configuration::get('midgard.admin.asgard', 'config')->get('edit_mode') == 1) {
143
            $data['default_mode'] = 'edit';
144 49
        } elseif (self::get_preference('edit_mode') == 1) {
145
            $data['default_mode'] = 'edit';
146
        }
147
148 49
        return $data['default_mode'];
149
    }
150
151
    /**
152
     * Construct urls for the breadcrumbs
153
     */
154 21
    private static function _generate_url(string $action, string $guid) : string
155
    {
156 21
        return '__mfa/asgard/object/' . $action . '/' . $guid . '/';
157
    }
158
159
    /**
160
     * Populate the object breadcrumb
161
     *
162
     * @param mixed $object        MgdSchema object for which the toolbar will be created
163
     * @param String $handler_id   Initialized handler id
164
     * @param array $data          Local request data
165
     */
166 21
    private static function _set_object_breadcrumb($object, $handler_id, array $data)
167
    {
168 21
        $breadcrumb = [];
169 21
        $label = $data['object_reflector']->get_object_label($object);
170 21
        $breadcrumb[] = [
171 21
            MIDCOM_NAV_URL => self::_generate_url('view', $object->guid),
172 21
            MIDCOM_NAV_NAME => html_entity_decode($label),
173
        ];
174
175 21
        $parent = $object->get_parent();
176
177 21
        if (   is_a($object, midcom_db_parameter::class)
178 21
            && !empty($parent->guid)) {
179
            // Add "parameters" list to breadcrumb if we're in a param
180
            $breadcrumb[] = [
181
                MIDCOM_NAV_URL => self::_generate_url('parameters', $parent->guid),
182
                MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
183
            ];
184
        }
185
186 21
        $i = 0;
187 21
        while (   !empty($parent->guid)
188 21
               && $i < 10) {
189
            $i++;
190
            $parent_reflector = midcom_helper_reflector::get($parent);
191
            $parent_label = $parent_reflector->get_object_label($parent);
192
            $breadcrumb[] = [
193
                MIDCOM_NAV_URL => self::_generate_url('view', $parent->guid),
194
                MIDCOM_NAV_NAME => $parent_label,
195
            ];
196
            $parent = $parent->get_parent();
197
        }
198 21
        $breadcrumb = array_reverse($breadcrumb);
199
200 21
        switch ($handler_id) {
201 21
            case 'object_edit':
202 1
                $breadcrumb[] = [
203 1
                    MIDCOM_NAV_URL => self::_generate_url('edit', $object->guid),
204 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
205
                ];
206 1
                break;
207 20
            case 'object_copy':
208 1
                $breadcrumb[] = [
209 1
                    MIDCOM_NAV_URL => self::_generate_url('copy', $object->guid),
210 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
211
                ];
212 1
                break;
213 19
            case 'object_copy_tree':
214 1
                $breadcrumb[] = [
215 1
                    MIDCOM_NAV_URL => self::_generate_url('copy/tree', $object->guid),
216 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
217
                ];
218 1
                break;
219 18
            case 'components_configuration_edit_folder':
220 1
                $breadcrumb[] = [
221 1
                    MIDCOM_NAV_URL => "__mfa/asgard/components/configuration/edit/{$object->component}/{$object->guid}/",
0 ignored issues
show
Bug Best Practice introduced by
The property component does not exist on midcom_db_parameter. Since you implemented __get, consider adding a @property annotation.
Loading history...
222 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('component configuration', 'midcom'),
223
                ];
224 1
                break;
225 17
            case 'object_metadata':
226 1
                $breadcrumb[] = [
227 1
                    MIDCOM_NAV_URL => self::_generate_url('metadata', $object->guid),
228 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('metadata', 'midcom'),
229
                ];
230 1
                break;
231 16
            case 'object_attachments':
232 15
            case 'object_attachments_edit':
233 2
                $breadcrumb[] = [
234 2
                    MIDCOM_NAV_URL => self::_generate_url('attachments', $object->guid),
235 2
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('attachments', 'midgard.admin.asgard'),
236
                ];
237
238 2
                if ($handler_id == 'object_attachments_edit') {
239 1
                    $breadcrumb[] = [
240 1
                        MIDCOM_NAV_URL => "__mfa/asgard/object/attachments/{$object->guid}/edit/",
241 1
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
242
                    ];
243
                }
244 2
                break;
245 14
            case 'object_parameters':
246 1
                $breadcrumb[] = [
247 1
                    MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
248 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
249
                ];
250 1
                break;
251 13
            case 'object_permissions':
252 1
                $breadcrumb[] = [
253 1
                    MIDCOM_NAV_URL => self::_generate_url('permissions', $object->guid),
254 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('privileges', 'midcom'),
255
                ];
256 1
                break;
257 12
            case 'object_create':
258 1
                if ($data['current_type'] == 'midgard_parameter') {
259
                    // Add "parameters" list to breadcrumb if we're creating a param
260
                    $breadcrumb[] = [
261
                        MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
262
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
263
                    ];
264
                }
265 1
                $breadcrumb[] = [
266 1
                    MIDCOM_NAV_URL => self::_generate_url('create' . $data['current_type'], $object->guid),
267 1
                    MIDCOM_NAV_NAME => sprintf(midcom::get()->i18n->get_string('create %s', 'midcom'), self::get_type_label($data['current_type'])),
268
                ];
269 1
                break;
270 11
            case 'object_delete':
271 1
                $breadcrumb[] = [
272 1
                    MIDCOM_NAV_URL => self::_generate_url('delete', $object->guid),
273 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('delete', 'midcom'),
274
                ];
275 1
                break;
276 10
            case '____mfa-asgard_midcom.helper.replicator-object':
277
                $breadcrumb[] = [
278
                    MIDCOM_NAV_URL => "__mfa/asgard_midcom.helper.replicator/object/{$object->guid}/",
279
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('replication information', 'midcom.helper.replicator'),
280
                ];
281
                break;
282
        }
283
284 21
        midcom_core_context::get()->set_custom_key('midcom.helper.nav.breadcrumb', $breadcrumb);
285 21
    }
286
287
    /**
288
     * Get a preference for the current user
289
     */
290 58
    public static function get_preference(string $preference)
291
    {
292 58
        static $preferences = [];
293
294 58
        if (!midcom::get()->auth->user) {
295 17
            return;
296
        }
297
298 41
        if (!isset($preferences[$preference])) {
299 41
            $person = midcom_db_person::get_cached(midcom::get()->auth->user->guid);
300
301 41
            $preferences[$preference] = $person->get_parameter('midgard.admin.asgard:preferences', $preference);
302
        }
303
304 41
        return $preferences[$preference];
305
    }
306
307
    /**
308
     * Get the MgdSchema root classes
309
     *
310
     * @return array containing class name and translated name
311
     */
312 2
    public static function get_root_classes() : array
313
    {
314 2
        static $root_classes = [];
315
316
        // Return cached results
317 2
        if (!empty($root_classes)) {
318 1
            return $root_classes;
319
        }
320
321
        // Initialize the returnable array
322 1
        $root_classes = [];
323
324
        // Get the classes
325 1
        $classes = midcom_helper_reflector_tree::get_root_classes();
326
327
        // Get the translated name
328 1
        foreach ($classes as $class) {
329 1
            $ref = new midcom_helper_reflector($class);
330 1
            $root_classes[$class] = $ref->get_class_label();
331
        }
332
333 1
        asort($root_classes);
334
335 1
        return $root_classes;
336
    }
337
}
338