Passed
Push — master ( 03340d...5e492c )
by Andreas
20:00
created

_set_object_breadcrumb()   D

Complexity

Conditions 19
Paths 64

Size

Total Lines 119
Code Lines 88

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 83
CRAP Score 21.971

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 19
eloc 88
c 1
b 0
f 0
nc 64
nop 3
dl 0
loc 119
ccs 83
cts 104
cp 0.7981
crap 21.971
rs 4.5166

How to fix   Long Method    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
        self::setup($this->_request_data);
19
    }
20
21
    /**
22
     * Static method other plugins may use
23
     */
24 16
    public static function prepare_plugin(string $title, array &$data)
25
    {
26 16
        self::setup($data);
27
28 16
        $data['view_title'] = $title;
29
30 16
        midcom::get()->style->prepend_component_styledir(str_replace('asgard_', '', $data['plugin_name']));
31
    }
32
33 49
    private static function setup(array &$data)
34
    {
35 49
        midcom::get()->auth->require_user_do('midgard.admin.asgard:access', class: 'midgard_admin_asgard_plugin');
36
        // Disable content caching
37 49
        midcom::get()->cache->content->no_cache();
38
39
        // Preferred language
40 49
        if ($language = self::get_preference('interface_language', false)) {
41
            midcom::get()->i18n->set_language($language);
42
        }
43
        // Ensure we get the correct styles
44 49
        midcom::get()->style->prepend_component_styledir('midgard.admin.asgard');
45
46
        // Set the default object mode
47 49
        $data['default_mode'] = self::get_preference('edit_mode') ? 'edit' : 'view';
48
49 49
        $data['asgard_toolbar'] = new midgard_admin_asgard_toolbar;
50
    }
51
52 28
    public static function get_type_label(string $type) : string
53
    {
54 28
        return midcom_helper_reflector_tree::get($type)->get_class_label();
55
    }
56
57
    /**
58
     * Bind view to an object
59
     */
60 21
    public static function bind_to_object(midcom_core_dbaobject $object, string $handler_id, array &$data)
61
    {
62
        // Tell our object to MidCOM
63 21
        midcom::get()->metadata->set_request_metadata($object->metadata->revised, $object->guid);
64 21
        $data['object_reflector'] = midcom_helper_reflector::get($object);
65 21
        $data['tree_reflector'] = midcom_helper_reflector_tree::get($object);
66
67 21
        $data['object'] = $object;
68
69
        // Populate toolbars
70 21
        if (midcom::get()->dbclassloader->is_midcom_db_object($object)) {
71
            // Bind the object to the metadata service
72 21
            midcom::get()->metadata->bind_to($object);
73
74
            // These toolbars only work with DBA objects as they do ACL checks
75 21
            $view_toolbar = midcom::get()->toolbars->get_view_toolbar();
76 21
            $view_toolbar->bind_to($object);
77 21
            $data['asgard_toolbar']->bind_to_object($object, $handler_id, $data);
78 21
            self::_set_object_breadcrumb($object, $handler_id, $data);
79
        }
80
81 21
        self::set_pagetitle($object, $handler_id, $data);
82
    }
83
84 21
    public static function set_pagetitle($object, string $handler_id, array &$data)
85
    {
86 21
        $l10n = midcom::get()->i18n->get_l10n('midgard.admin.asgard');
87
        // Figure out correct title and language handling
88 21
        $title_string = match ($handler_id) {
89 21
            'object_edit' => $l10n->get('edit %s %s'),
90 21
            'object_metadata' => $l10n->get('metadata of %s %s'),
91 21
            'object_attachments',
92 21
            'object_attachments_edit' => $l10n->get('attachments of %s %s'),
93 21
            'object_parameters' => $l10n->get('parameters of %s %s'),
94 21
            'object_permissions' => $l10n->get('permissions for %s %s'),
95 21
            'object_create' => sprintf($l10n->get('create %s under %s'), self::get_type_label($data['current_type']), '%s %s'),
96 21
            'object_delete' => $l10n->get('delete %s %s'),
97 21
            default => $l10n->get('%s %s')
98 21
        };
99
100 21
        $label = $data['object_reflector']->get_object_label($object);
101 21
        $type_label = self::get_type_label(get_class($object));
102 21
        $data['view_title'] = sprintf($title_string, $type_label, $label);
103
    }
104
105
    /**
106
     * Construct urls for the breadcrumbs
107
     */
108 21
    private static function _generate_url(string $action, string $guid) : string
109
    {
110 21
        return '__mfa/asgard/object/' . $action . '/' . $guid . '/';
111
    }
112
113
    /**
114
     * Populate the object breadcrumb
115
     */
116 21
    private static function _set_object_breadcrumb(midcom_core_dbaobject $object, string $handler_id, array $data)
117
    {
118 21
        $breadcrumb = [];
119 21
        $label = $data['object_reflector']->get_object_label($object);
120 21
        $breadcrumb[] = [
121 21
            MIDCOM_NAV_URL => self::_generate_url('view', $object->guid),
122 21
            MIDCOM_NAV_NAME => html_entity_decode($label),
123 21
        ];
124
125 21
        $parent = $object->get_parent();
126
127 21
        if (   $object instanceof midcom_db_parameter
128 21
            && !empty($parent->guid)) {
129
            // Add "parameters" list to breadcrumb if we're in a param
130
            $breadcrumb[] = [
131
                MIDCOM_NAV_URL => self::_generate_url('parameters', $parent->guid),
132
                MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
133
            ];
134
        }
135
136 21
        $i = 0;
137 21
        while (   !empty($parent->guid)
138 21
               && $i < 10) {
139
            $i++;
140
            $parent_reflector = midcom_helper_reflector::get($parent);
0 ignored issues
show
Bug introduced by
It seems like $parent can also be of type null; however, parameter $src of midcom_helper_reflector::get() does only seem to accept object|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

140
            $parent_reflector = midcom_helper_reflector::get(/** @scrutinizer ignore-type */ $parent);
Loading history...
141
            $parent_label = $parent_reflector->get_object_label($parent);
0 ignored issues
show
Bug introduced by
It seems like $parent can also be of type null; however, parameter $object of midcom_helper_reflector::get_object_label() does only seem to accept object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

141
            $parent_label = $parent_reflector->get_object_label(/** @scrutinizer ignore-type */ $parent);
Loading history...
142
            $breadcrumb[] = [
143
                MIDCOM_NAV_URL => self::_generate_url('view', $parent->guid),
144
                MIDCOM_NAV_NAME => $parent_label,
145
            ];
146
            $parent = $parent->get_parent();
147
        }
148 21
        $breadcrumb = array_reverse($breadcrumb);
149
150
        switch ($handler_id) {
151 21
            case 'object_edit':
152 1
                $breadcrumb[] = [
153 1
                    MIDCOM_NAV_URL => self::_generate_url('edit', $object->guid),
154 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
155 1
                ];
156 1
                break;
157 20
            case 'object_copy':
158 1
                $breadcrumb[] = [
159 1
                    MIDCOM_NAV_URL => self::_generate_url('copy', $object->guid),
160 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
161 1
                ];
162 1
                break;
163 19
            case 'object_copy_tree':
164 1
                $breadcrumb[] = [
165 1
                    MIDCOM_NAV_URL => self::_generate_url('copy/tree', $object->guid),
166 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
167 1
                ];
168 1
                break;
169 18
            case 'components_configuration_edit_folder':
170 1
                $breadcrumb[] = [
171 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...
Bug Best Practice introduced by
The property component does not exist on midcom_core_dbaobject. Since you implemented __get, consider adding a @property annotation.
Loading history...
172 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('component configuration', 'midcom'),
173 1
                ];
174 1
                break;
175 17
            case 'object_metadata':
176 1
                $breadcrumb[] = [
177 1
                    MIDCOM_NAV_URL => self::_generate_url('metadata', $object->guid),
178 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('metadata', 'midcom'),
179 1
                ];
180 1
                break;
181 16
            case 'object_attachments':
182 15
            case 'object_attachments_edit':
183 2
                $breadcrumb[] = [
184 2
                    MIDCOM_NAV_URL => self::_generate_url('attachments', $object->guid),
185 2
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('attachments', 'midgard.admin.asgard'),
186 2
                ];
187
188 2
                if ($handler_id == 'object_attachments_edit') {
189 1
                    $breadcrumb[] = [
190 1
                        MIDCOM_NAV_URL => "__mfa/asgard/object/attachments/{$object->guid}/edit/",
191 1
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
192 1
                    ];
193
                }
194 2
                break;
195 14
            case 'object_parameters':
196 1
                $breadcrumb[] = [
197 1
                    MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
198 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
199 1
                ];
200 1
                break;
201 13
            case 'object_permissions':
202 1
                $breadcrumb[] = [
203 1
                    MIDCOM_NAV_URL => self::_generate_url('permissions', $object->guid),
204 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('privileges', 'midcom'),
205 1
                ];
206 1
                break;
207 12
            case 'object_create':
208 1
                if ($data['current_type'] == 'midgard_parameter') {
209
                    // Add "parameters" list to breadcrumb if we're creating a param
210
                    $breadcrumb[] = [
211
                        MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
212
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
213
                    ];
214
                }
215 1
                $breadcrumb[] = [
216 1
                    MIDCOM_NAV_URL => self::_generate_url('create' . $data['current_type'], $object->guid),
217 1
                    MIDCOM_NAV_NAME => sprintf(midcom::get()->i18n->get_string('create %s', 'midcom'), self::get_type_label($data['current_type'])),
218 1
                ];
219 1
                break;
220 11
            case 'object_delete':
221 1
                $breadcrumb[] = [
222 1
                    MIDCOM_NAV_URL => self::_generate_url('delete', $object->guid),
223 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('delete', 'midcom'),
224 1
                ];
225 1
                break;
226 10
            case '____mfa-asgard_midcom.helper.replicator-object':
227
                $breadcrumb[] = [
228
                    MIDCOM_NAV_URL => "__mfa/asgard_midcom.helper.replicator/object/{$object->guid}/",
229
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('replication information', 'midcom.helper.replicator'),
230
                ];
231
                break;
232
        }
233
234 21
        midcom_core_context::get()->set_custom_key('midcom.helper.nav.breadcrumb', $breadcrumb);
235
    }
236
237
    /**
238
     * Get a preference for the current user
239
     */
240 56
    public static function get_preference(string $preference, bool $fallback_to_config = true)
241
    {
242 56
        static $preferences = [];
243
244 56
        if (   !array_key_exists($preference, $preferences)
245 56
            && $person = midcom::get()->auth->user?->get_storage()) {
246 3
            $preferences[$preference] = $person->get_parameter('midgard.admin.asgard:preferences', $preference);
247
        }
248
249 56
        if (!array_key_exists($preference, $preferences)) {
250
            if ($fallback_to_config) {
251
                $preferences[$preference] = midcom_baseclasses_components_configuration::get('midgard.admin.asgard', 'config')->get($preference);
252
            } else {
253
                $preferences[$preference] = null;
254
            }
255
        }
256
257 56
        return $preferences[$preference];
258
    }
259
260
    /**
261
     * Get the MgdSchema root classes
262
     *
263
     * @return array containing class name and translated name
264
     */
265 2
    public static function get_root_classes() : array
266
    {
267 2
        static $root_classes = [];
268
269 2
        if (empty($root_classes)) {
270
            // Get the classes
271 1
            $classes = midcom_helper_reflector_tree::get_root_classes();
272
273
            // Get the translated name
274 1
            foreach ($classes as $class) {
275 1
                $ref = new midcom_helper_reflector($class);
276 1
                $root_classes[$class] = $ref->get_class_label();
277
            }
278
279 1
            asort($root_classes);
280
        }
281
282 2
        return $root_classes;
283
    }
284
}
285