Completed
Push — master ( f6e48a...088fe8 )
by Andreas
18:26
created

midgard_admin_asgard_plugin::set_pagetitle()   B

Complexity

Conditions 10
Paths 10

Size

Total Lines 40
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 31
CRAP Score 10.003

Importance

Changes 0
Metric Value
cc 10
eloc 33
nc 10
nop 3
dl 0
loc 40
ccs 31
cts 32
cp 0.9688
crap 10.003
rs 7.6666
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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