Passed
Push — master ( ac2cf9...6ee9d0 )
by Andreas
24:39
created

midgard_admin_asgard_plugin::get_preference()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 5.675

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 6
nop 2
dl 0
loc 18
ccs 7
cts 10
cp 0.7
crap 5.675
rs 9.6111
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', false)) {
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', false)) {
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(midcom_core_dbaobject $object, string $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, string $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 49
            $data['default_mode'] = self::get_preference('edit_mode') ? 'edit' : 'view';
138
        }
139 49
        return $data['default_mode'];
140
    }
141
142
    /**
143
     * Construct urls for the breadcrumbs
144
     */
145 21
    private static function _generate_url(string $action, string $guid) : string
146
    {
147 21
        return '__mfa/asgard/object/' . $action . '/' . $guid . '/';
148
    }
149
150
    /**
151
     * Populate the object breadcrumb
152
     *
153
     * @param mixed $object        MgdSchema object for which the toolbar will be created
154
     * @param array $data          Local request data
155
     */
156 21
    private static function _set_object_breadcrumb($object, string $handler_id, array $data)
157
    {
158 21
        $breadcrumb = [];
159 21
        $label = $data['object_reflector']->get_object_label($object);
160 21
        $breadcrumb[] = [
161 21
            MIDCOM_NAV_URL => self::_generate_url('view', $object->guid),
162 21
            MIDCOM_NAV_NAME => html_entity_decode($label),
163
        ];
164
165 21
        $parent = $object->get_parent();
166
167 21
        if (   is_a($object, midcom_db_parameter::class)
168 21
            && !empty($parent->guid)) {
169
            // Add "parameters" list to breadcrumb if we're in a param
170
            $breadcrumb[] = [
171
                MIDCOM_NAV_URL => self::_generate_url('parameters', $parent->guid),
172
                MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
173
            ];
174
        }
175
176 21
        $i = 0;
177 21
        while (   !empty($parent->guid)
178 21
               && $i < 10) {
179
            $i++;
180
            $parent_reflector = midcom_helper_reflector::get($parent);
181
            $parent_label = $parent_reflector->get_object_label($parent);
182
            $breadcrumb[] = [
183
                MIDCOM_NAV_URL => self::_generate_url('view', $parent->guid),
184
                MIDCOM_NAV_NAME => $parent_label,
185
            ];
186
            $parent = $parent->get_parent();
187
        }
188 21
        $breadcrumb = array_reverse($breadcrumb);
189
190 21
        switch ($handler_id) {
191 21
            case 'object_edit':
192 1
                $breadcrumb[] = [
193 1
                    MIDCOM_NAV_URL => self::_generate_url('edit', $object->guid),
194 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
195
                ];
196 1
                break;
197 20
            case 'object_copy':
198 1
                $breadcrumb[] = [
199 1
                    MIDCOM_NAV_URL => self::_generate_url('copy', $object->guid),
200 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
201
                ];
202 1
                break;
203 19
            case 'object_copy_tree':
204 1
                $breadcrumb[] = [
205 1
                    MIDCOM_NAV_URL => self::_generate_url('copy/tree', $object->guid),
206 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
207
                ];
208 1
                break;
209 18
            case 'components_configuration_edit_folder':
210 1
                $breadcrumb[] = [
211 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...
212 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('component configuration', 'midcom'),
213
                ];
214 1
                break;
215 17
            case 'object_metadata':
216 1
                $breadcrumb[] = [
217 1
                    MIDCOM_NAV_URL => self::_generate_url('metadata', $object->guid),
218 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('metadata', 'midcom'),
219
                ];
220 1
                break;
221 16
            case 'object_attachments':
222 15
            case 'object_attachments_edit':
223 2
                $breadcrumb[] = [
224 2
                    MIDCOM_NAV_URL => self::_generate_url('attachments', $object->guid),
225 2
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('attachments', 'midgard.admin.asgard'),
226
                ];
227
228 2
                if ($handler_id == 'object_attachments_edit') {
229 1
                    $breadcrumb[] = [
230 1
                        MIDCOM_NAV_URL => "__mfa/asgard/object/attachments/{$object->guid}/edit/",
231 1
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
232
                    ];
233
                }
234 2
                break;
235 14
            case 'object_parameters':
236 1
                $breadcrumb[] = [
237 1
                    MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
238 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
239
                ];
240 1
                break;
241 13
            case 'object_permissions':
242 1
                $breadcrumb[] = [
243 1
                    MIDCOM_NAV_URL => self::_generate_url('permissions', $object->guid),
244 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('privileges', 'midcom'),
245
                ];
246 1
                break;
247 12
            case 'object_create':
248 1
                if ($data['current_type'] == 'midgard_parameter') {
249
                    // Add "parameters" list to breadcrumb if we're creating a param
250
                    $breadcrumb[] = [
251
                        MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
252
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
253
                    ];
254
                }
255 1
                $breadcrumb[] = [
256 1
                    MIDCOM_NAV_URL => self::_generate_url('create' . $data['current_type'], $object->guid),
257 1
                    MIDCOM_NAV_NAME => sprintf(midcom::get()->i18n->get_string('create %s', 'midcom'), self::get_type_label($data['current_type'])),
258
                ];
259 1
                break;
260 11
            case 'object_delete':
261 1
                $breadcrumb[] = [
262 1
                    MIDCOM_NAV_URL => self::_generate_url('delete', $object->guid),
263 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('delete', 'midcom'),
264
                ];
265 1
                break;
266 10
            case '____mfa-asgard_midcom.helper.replicator-object':
267
                $breadcrumb[] = [
268
                    MIDCOM_NAV_URL => "__mfa/asgard_midcom.helper.replicator/object/{$object->guid}/",
269
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('replication information', 'midcom.helper.replicator'),
270
                ];
271
                break;
272
        }
273
274 21
        midcom_core_context::get()->set_custom_key('midcom.helper.nav.breadcrumb', $breadcrumb);
275 21
    }
276
277
    /**
278
     * Get a preference for the current user
279
     */
280 54
    public static function get_preference(string $preference, bool $fallback_to_config = true)
281
    {
282 54
        static $preferences = [];
283
284 54
        if (midcom::get()->auth->user && !array_key_exists($preference, $preferences)) {
285 3
            $person = midcom_db_person::get_cached(midcom::get()->auth->user->guid);
286 3
            $preferences[$preference] = $person->get_parameter('midgard.admin.asgard:preferences', $preference);
287
        }
288
289 54
        if (!array_key_exists($preference, $preferences)) {
290
            if ($fallback_to_config) {
291
                $preferences[$preference] = midcom_baseclasses_components_configuration::get('midgard.admin.asgard', 'config')->get($preference);
292
            } else {
293
                $preferences[$preference] = null;
294
            }
295
        }
296
297 54
        return $preferences[$preference];
298
    }
299
300
    /**
301
     * Get the MgdSchema root classes
302
     *
303
     * @return array containing class name and translated name
304
     */
305 2
    public static function get_root_classes() : array
306
    {
307 2
        static $root_classes = [];
308
309
        // Return cached results
310 2
        if (!empty($root_classes)) {
311 1
            return $root_classes;
312
        }
313
314
        // Initialize the returnable array
315 1
        $root_classes = [];
316
317
        // Get the classes
318 1
        $classes = midcom_helper_reflector_tree::get_root_classes();
319
320
        // Get the translated name
321 1
        foreach ($classes as $class) {
322 1
            $ref = new midcom_helper_reflector($class);
323 1
            $root_classes[$class] = $ref->get_class_label();
324
        }
325
326 1
        asort($root_classes);
327
328 1
        return $root_classes;
329
    }
330
}
331