Passed
Push — master ( 179526...2874e4 )
by Andreas
28:11
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
    }
36
37
    /**
38
     * Static method other plugins may use
39
     */
40 16
    public static function prepare_plugin(string $title, array &$data)
41
    {
42 16
        midcom::get()->auth->require_user_do('midgard.admin.asgard:access', null, 'midgard_admin_asgard_plugin');
43
        // Disable content caching
44 16
        midcom::get()->cache->content->no_cache();
45 16
        $data['view_title'] = $title;
46 16
        $data['asgard_toolbar'] = new midgard_admin_asgard_toolbar();
47 16
        self::get_default_mode($data);
48
49
        // Preferred language
50 16
        if ($language = self::get_preference('interface_language', false)) {
51
            midcom::get()->i18n->set_language($language);
52
        }
53
54 16
        midcom::get()->style->prepend_component_styledir('midgard.admin.asgard');
55 16
        midcom::get()->style->prepend_component_styledir(str_replace('asgard_', '', $data['plugin_name']));
56
    }
57
58 28
    public static function get_type_label(string $type) : string
59
    {
60 28
        return midcom_helper_reflector_tree::get($type)->get_class_label();
61
    }
62
63
    /**
64
     * Bind view to an object
65
     */
66 21
    public static function bind_to_object(midcom_core_dbaobject $object, string $handler_id, array &$data)
67
    {
68
        // Tell our object to MidCOM
69 21
        midcom::get()->metadata->set_request_metadata($object->metadata->revised, $object->guid);
70 21
        $data['object_reflector'] = midcom_helper_reflector::get($object);
71 21
        $data['tree_reflector'] = midcom_helper_reflector_tree::get($object);
72
73 21
        $data['object'] = $object;
74
75
        // Populate toolbars
76 21
        if (midcom::get()->dbclassloader->is_midcom_db_object($object)) {
77
            // Bind the object to the metadata service
78 21
            midcom::get()->metadata->bind_to($object);
79
80
            // These toolbars only work with DBA objects as they do ACL checks
81 21
            $view_toolbar = midcom::get()->toolbars->get_view_toolbar();
82 21
            $view_toolbar->bind_to($object);
83 21
            $data['asgard_toolbar']->bind_to_object($object, $handler_id, $data);
84 21
            self::_set_object_breadcrumb($object, $handler_id, $data);
85
        }
86
87 21
        self::set_pagetitle($object, $handler_id, $data);
88
    }
89
90 21
    public static function set_pagetitle($object, string $handler_id, array &$data)
91
    {
92 21
        $l10n = midcom::get()->i18n->get_l10n('midgard.admin.asgard');
93
        // Figure out correct title and language handling
94 21
        $title_string = match ($handler_id) {
95 21
            'object_edit' => $l10n->get('edit %s %s'),
96 21
            'object_metadata' => $l10n->get('metadata of %s %s'),
97 21
            'object_attachments',
98 21
            'object_attachments_edit' => $l10n->get('attachments of %s %s'),
99 21
            'object_parameters' => $l10n->get('parameters of %s %s'),
100 21
            'object_permissions' => $l10n->get('permissions for %s %s'),
101 21
            'object_create' => sprintf($l10n->get('create %s under %s'), self::get_type_label($data['current_type']), '%s %s'),
102 21
            'object_delete' => $l10n->get('delete %s %s'),
103 21
            default => $l10n->get('%s %s')
104 21
        };
105
106 21
        $label = $data['object_reflector']->get_object_label($object);
107 21
        $type_label = self::get_type_label(get_class($object));
108 21
        $data['view_title'] = sprintf($title_string, $type_label, $label);
109
    }
110
111
    /**
112
     * Set the default object mode
113
     */
114 49
    public static function get_default_mode(array &$data) : string
115
    {
116
        //only set mode once per request
117 49
        if (empty($data['default_mode'])) {
118 49
            $data['default_mode'] = self::get_preference('edit_mode') ? 'edit' : 'view';
119
        }
120 49
        return $data['default_mode'];
121
    }
122
123
    /**
124
     * Construct urls for the breadcrumbs
125
     */
126 21
    private static function _generate_url(string $action, string $guid) : string
127
    {
128 21
        return '__mfa/asgard/object/' . $action . '/' . $guid . '/';
129
    }
130
131
    /**
132
     * Populate the object breadcrumb
133
     */
134 21
    private static function _set_object_breadcrumb(midcom_core_dbaobject $object, string $handler_id, array $data)
135
    {
136 21
        $breadcrumb = [];
137 21
        $label = $data['object_reflector']->get_object_label($object);
138 21
        $breadcrumb[] = [
139 21
            MIDCOM_NAV_URL => self::_generate_url('view', $object->guid),
140 21
            MIDCOM_NAV_NAME => html_entity_decode($label),
141 21
        ];
142
143 21
        $parent = $object->get_parent();
144
145 21
        if (   $object instanceof midcom_db_parameter
146 21
            && !empty($parent->guid)) {
147
            // Add "parameters" list to breadcrumb if we're in a param
148
            $breadcrumb[] = [
149
                MIDCOM_NAV_URL => self::_generate_url('parameters', $parent->guid),
150
                MIDCOM_NAV_NAME => midcom::get()->i18n->get_string('parameters', 'midcom'),
151
            ];
152
        }
153
154 21
        $i = 0;
155 21
        while (   !empty($parent->guid)
156 21
               && $i < 10) {
157
            $i++;
158
            $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

158
            $parent_reflector = midcom_helper_reflector::get(/** @scrutinizer ignore-type */ $parent);
Loading history...
159
            $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

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