_set_object_breadcrumb()   D
last analyzed

Complexity

Conditions 18
Paths 60

Size

Total Lines 113
Code Lines 83

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 77
CRAP Score 21.1886

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 18
eloc 83
nc 60
nop 3
dl 0
loc 113
ccs 77
cts 98
cp 0.7856
crap 21.1886
rs 4.8666
c 1
b 0
f 0

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 1
            'object_edit' => $l10n->get('edit %s %s'),
90 1
            'object_metadata' => $l10n->get('metadata of %s %s'),
91 21
            'object_attachments',
92 2
            'object_attachments_edit' => $l10n->get('attachments of %s %s'),
93 1
            'object_parameters' => $l10n->get('parameters of %s %s'),
94 1
            'object_permissions' => $l10n->get('permissions for %s %s'),
95 1
            'object_create' => sprintf($l10n->get('create %s under %s'), self::get_type_label($data['current_type']), '%s %s'),
96 1
            'object_delete' => $l10n->get('delete %s %s'),
97 13
            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($object::class);
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 2
                $breadcrumb[] = [
159 2
                    MIDCOM_NAV_URL => self::_generate_url('copy', $object->guid),
160 2
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('copy', 'midcom'),
161 2
                ];
162 2
                break;
163 18
            case 'components_configuration_edit_folder':
164 1
                $breadcrumb[] = [
165 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...
166 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('component configuration', 'midcom'),
167 1
                ];
168 1
                break;
169 17
            case 'object_metadata':
170 1
                $breadcrumb[] = [
171 1
                    MIDCOM_NAV_URL => self::_generate_url('metadata', $object->guid),
172 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('metadata', 'midcom'),
173 1
                ];
174 1
                break;
175 16
            case 'object_attachments':
176 15
            case 'object_attachments_edit':
177 2
                $breadcrumb[] = [
178 2
                    MIDCOM_NAV_URL => self::_generate_url('attachments', $object->guid),
179 2
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('attachments', 'midgard.admin.asgard'),
180 2
                ];
181
182 2
                if ($handler_id == 'object_attachments_edit') {
183 1
                    $breadcrumb[] = [
184 1
                        MIDCOM_NAV_URL => "__mfa/asgard/object/attachments/{$object->guid}/edit/",
185 1
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('edit', 'midcom'),
186 1
                    ];
187
                }
188 2
                break;
189 14
            case 'object_parameters':
190 1
                $breadcrumb[] = [
191 1
                    MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
192 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
193 1
                ];
194 1
                break;
195 13
            case 'object_permissions':
196 1
                $breadcrumb[] = [
197 1
                    MIDCOM_NAV_URL => self::_generate_url('permissions', $object->guid),
198 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('privileges', 'midcom'),
199 1
                ];
200 1
                break;
201 12
            case 'object_create':
202 1
                if ($data['current_type'] == 'midgard_parameter') {
203
                    // Add "parameters" list to breadcrumb if we're creating a param
204
                    $breadcrumb[] = [
205
                        MIDCOM_NAV_URL => self::_generate_url('parameters', $object->guid),
206
                        MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
207
                    ];
208
                }
209 1
                $breadcrumb[] = [
210 1
                    MIDCOM_NAV_URL => self::_generate_url('create' . $data['current_type'], $object->guid),
211 1
                    MIDCOM_NAV_NAME => sprintf(midcom::get()->i18n->get_string('create %s', 'midcom'), self::get_type_label($data['current_type'])),
212 1
                ];
213 1
                break;
214 11
            case 'object_delete':
215 1
                $breadcrumb[] = [
216 1
                    MIDCOM_NAV_URL => self::_generate_url('delete', $object->guid),
217 1
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('delete', 'midcom'),
218 1
                ];
219 1
                break;
220 10
            case '____mfa-asgard_midcom.helper.replicator-object':
221
                $breadcrumb[] = [
222
                    MIDCOM_NAV_URL => "__mfa/asgard_midcom.helper.replicator/object/{$object->guid}/",
223
                    MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('replication information', 'midcom.helper.replicator'),
224
                ];
225
                break;
226
        }
227
228 21
        midcom_core_context::get()->set_custom_key('midcom.helper.nav.breadcrumb', $breadcrumb);
229
    }
230
231
    /**
232
     * Get a preference for the current user
233
     */
234 56
    public static function get_preference(string $preference, bool $fallback_to_config = true)
235
    {
236 56
        static $preferences = [];
237
238 56
        if (   !array_key_exists($preference, $preferences)
239 56
            && $person = midcom::get()->auth->user?->get_storage()) {
240 3
            $preferences[$preference] = $person->get_parameter('midgard.admin.asgard:preferences', $preference);
241
        }
242
243 56
        if (!array_key_exists($preference, $preferences)) {
244
            if ($fallback_to_config) {
245
                $preferences[$preference] = midcom_baseclasses_components_configuration::get('midgard.admin.asgard', 'config')->get($preference);
246
            } else {
247
                $preferences[$preference] = null;
248
            }
249
        }
250
251 56
        return $preferences[$preference];
252
    }
253
254
    /**
255
     * Get the MgdSchema root classes
256
     *
257
     * @return array containing class name and translated name
258
     */
259 5
    public static function get_root_classes() : array
260
    {
261 5
        static $root_classes = [];
262
263 5
        if (empty($root_classes)) {
264
            // Get the classes
265 1
            $classes = midcom_helper_reflector_tree::get_root_classes();
266
267
            // Get the translated name
268 1
            foreach ($classes as $class) {
269 1
                $ref = new midcom_helper_reflector($class);
270 1
                $root_classes[$class] = $ref->get_class_label();
271
            }
272
273 1
            asort($root_classes);
274
        }
275
276 5
        return $root_classes;
277
    }
278
}
279