Passed
Push — master ( 58e8b5...549d64 )
by Andreas
35:13 queued 07:36
created

midgard_admin_asgard_toolbar   B

Complexity

Total Complexity 48

Size/Duplication

Total Lines 240
Duplicated Lines 0 %

Test Coverage

Coverage 85.03%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 165
dl 0
loc 240
ccs 142
cts 167
cp 0.8503
rs 8.5599
c 1
b 0
f 0
wmc 48

4 Methods

Rating   Name   Duplication   Size   Complexity  
A _generate_url() 0 3 1
F bind_to_object() 0 134 27
C _disable_active_item() 0 40 14
B get_toolbar_update_items() 0 51 6

How to fix   Complexity   

Complex Class

Complex classes like midgard_admin_asgard_toolbar often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use midgard_admin_asgard_toolbar, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * @package midgard.admin.asgard
4
 * @author CONTENT CONTROL http://www.contentcontrol-berlin.de/
5
 * @copyright CONTENT CONTROL http://www.contentcontrol-berlin.de/
6
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License
7
 */
8
9
/**
10
 * Wrapper for Asgard's toolbar
11
 *
12
 * @package midgard.admin.asgard
13
 */
14
class midgard_admin_asgard_toolbar extends midcom_helper_toolbar_view
15
{
16 20
    private function _generate_url(string $action, midcom_core_dbaobject $object) : string
17
    {
18 20
        return '__mfa/asgard/object/' . $action . '/' . $object->guid . '/';
19
    }
20
21
    /**
22
     * Populate the object toolbar
23
     */
24 21
    public function bind_to_object(midcom_core_dbaobject $object, string $handler_id, array $data)
25
    {
26 21
        if ($handler_id == 'object_deleted') {
27 1
            return;
28
        }
29 20
        $buttons = [];
30
        // Show view toolbar button, if the user hasn't configured to use straight the edit mode
31 20
        if ($data['default_mode'] === 'view') {
32 20
            $buttons[] = [
33 20
                MIDCOM_TOOLBAR_URL => $this->_generate_url('view', $object),
34 20
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('view', 'midcom'),
35 20
                MIDCOM_TOOLBAR_GLYPHICON => 'eye',
36 20
                MIDCOM_TOOLBAR_ACCESSKEY => 'v',
37
            ];
38
        }
39 20
        $config = midcom_baseclasses_components_configuration::get('midgard.admin.asgard', 'config');
40 20
        $no_permalink = false;
41 20
        foreach ($config->get_array('no_permalinks_for') as $classname) {
42 20
            if (is_a($object, $classname)) {
43
                $no_permalink = true;
44
                break;
45
            }
46
        }
47 20
        if (!$no_permalink) {
48 20
            $link = midcom::get()->permalinks->resolve_permalink($object->guid);
49 20
            if ($link) {
50
                $buttons[] = [
51
                    MIDCOM_TOOLBAR_URL => $link,
52
                    MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('view on site', 'midgard.admin.asgard'),
53
                    MIDCOM_TOOLBAR_GLYPHICON => 'globe',
54
                ];
55
            }
56
        }
57
58 20
        if ($object->can_do('midgard:update')) {
59 20
            $buttons[] = [
60 20
                MIDCOM_TOOLBAR_URL => $this->_generate_url('edit', $object),
61 20
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('edit', 'midcom'),
62 20
                MIDCOM_TOOLBAR_GLYPHICON => 'pencil',
63 20
                MIDCOM_TOOLBAR_ACCESSKEY => 'e',
64
            ];
65
        }
66
67 20
        if ($object->can_do('midgard:create')) {
68 20
            $url = (midcom_helper_reflector_tree::get_child_objects($object)) ? 'copy/tree' : 'copy';
69 20
            $buttons[] = [
70 20
                MIDCOM_TOOLBAR_URL => $this->_generate_url($url, $object),
71 20
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('copy', 'midcom'),
72 20
                MIDCOM_TOOLBAR_GLYPHICON => 'clone',
73
            ];
74
        }
75
76 20
        if ($object->can_do('midgard:update')) {
77 20
            $buttons = array_merge($buttons, $this->get_toolbar_update_items($object));
78
        }
79
80 20
        if ($object->can_do('midgard:create')) {
81
            // Find out what types of children the object can have and show create buttons for them
82 20
            $child_types = $data['tree_reflector']->get_child_classes();
83 20
            foreach ($child_types as $type) {
84 20
                $display_button = true;
85 20
                if (is_a($object, midcom_db_topic::class)) {
86
                    // With topics we should check for component before populating create buttons as so many types can be children of topics
87 13
                    switch ($type) {
88 13
                        case 'midgard_topic':
89 13
                        case 'midgard_article':
90
                            // Articles and topics can always be created
91 13
                            break;
92
                        default:
93 13
                            if (!midcom::get()->dbclassloader->get_midcom_class_name_for_mgdschema_object($type)) {
94
                                $display_button = false;
95
                                break;
96
                            }
97 13
                            $component = midcom::get()->dbclassloader->get_component_for_class($type);
98 13
                            if ($component != $object->component) {
99 13
                                $display_button = false;
100
                            }
101 13
                            break;
102
                    }
103 8
                } elseif (is_a($object, midcom_db_article::class)) {
104
                    try {
105
                        $topic = new midcom_db_topic($object->topic);
106
                        // With articles we should check for topic component before populating create buttons as so many types can be children of topics
107
                        switch ($type) {
108
                            case 'midgard_article':
109
                                // Articles can always be created
110
                                break;
111
                            default:
112
                                $component = midcom::get()->dbclassloader->get_component_for_class($type);
113
                                if ($component != $topic->component) {
114
                                    $display_button = false;
115
                                }
116
                                break;
117
                        }
118
                    } catch (midcom_error $e) {
119
                        $e->log();
120
                    }
121
                }
122
123 20
                if (!$display_button) {
124
                    // Skip this type
125 13
                    continue;
126
                }
127
128 20
                $buttons[] = [
129 20
                    MIDCOM_TOOLBAR_URL => $this->_generate_url('create/' . $type, $object),
130 20
                    MIDCOM_TOOLBAR_LABEL => sprintf(midcom::get()->i18n->get_string('create %s', 'midcom'), midgard_admin_asgard_plugin::get_type_label($type)),
131 20
                    MIDCOM_TOOLBAR_GLYPHICON => $data['tree_reflector']->get_create_icon($type),
132
                ];
133
            }
134
        }
135
136 20
        if ($object->can_do('midgard:delete')) {
137 20
            $buttons[] = [
138 20
                MIDCOM_TOOLBAR_URL => $this->_generate_url('delete', $object),
139 20
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('delete', 'midcom'),
140 20
                MIDCOM_TOOLBAR_GLYPHICON => 'trash',
141 20
                MIDCOM_TOOLBAR_ACCESSKEY => 'd',
142
            ];
143
        }
144
145 20
        if (   midcom::get()->config->get('midcom_services_rcs_enable')
146 20
            && $object->can_do('midgard:update')
147 20
            && $object->_use_rcs) {
148 20
            $buttons[] = [
149 20
                MIDCOM_TOOLBAR_URL => $this->_generate_url('rcs', $object),
150 20
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('show history', 'midcom.admin.rcs'),
151 20
                MIDCOM_TOOLBAR_GLYPHICON => 'history',
152 20
                MIDCOM_TOOLBAR_ENABLED => !str_starts_with($handler_id, 'object_rcs'),
153 20
                MIDCOM_TOOLBAR_ACCESSKEY => 'h',
154
            ];
155
        }
156 20
        $this->add_items($buttons);
157 20
        $this->_disable_active_item($handler_id, $object, $data);
158 20
    }
159
160 20
    private function _disable_active_item(string $handler_id, $object, array $data)
161
    {
162 20
        switch ($handler_id) {
163 20
            case 'object_view':
164 1
                $this->disable_item($this->_generate_url('view', $object));
165 1
                break;
166 19
            case 'object_edit':
167 1
                $this->disable_item($this->_generate_url('edit', $object));
168 1
                break;
169 18
            case 'object_copy':
170 1
                $this->disable_item($this->_generate_url('copy', $object));
171 1
                break;
172 17
            case 'object_copy_tree':
173 1
                $this->disable_item($this->_generate_url('copy/tree', $object));
174 1
                break;
175 16
            case 'components_configuration_edit_folder':
176 1
                $this->disable_item("__mfa/asgard/components/configuration/edit/{$object->component}/{$object->guid}/");
177 1
                break;
178 15
            case 'object_metadata':
179 1
                $this->disable_item($this->_generate_url('metadata', $object));
180 1
                break;
181 14
            case 'object_attachments':
182 13
            case 'object_attachments_edit':
183 2
                $this->disable_item($this->_generate_url('attachments', $object));
184 2
                break;
185 12
            case 'object_parameters':
186 1
                $this->disable_item($this->_generate_url('parameters', $object));
187 1
                break;
188 11
            case 'object_permissions':
189 1
                $this->disable_item($this->_generate_url('permissions', $object));
190 1
                break;
191 10
            case 'object_create':
192 1
                $this->disable_item($this->_generate_url('create/' . $data['current_type'], $object));
193 1
                break;
194 9
            case 'object_delete':
195 1
                $this->disable_item($this->_generate_url('delete', $object));
196 1
                break;
197 8
            case '____mfa-asgard_midcom.helper.replicator-object':
198
                $this->disable_item("__mfa/asgard_midcom.helper.replicator/object/{$object->guid}/");
199
                break;
200
        }
201 20
    }
202
203 20
    private function get_toolbar_update_items($object) : array
204
    {
205 20
        $buttons = [];
206 20
        if (   is_a($object, midcom_db_topic::class)
207 20
            && $object->component
208 20
            && $object->can_do('midcom:component_config')) {
209 13
            $buttons[] = [
210 13
                MIDCOM_TOOLBAR_URL => "__mfa/asgard/components/configuration/edit/{$object->component}/{$object->guid}/",
211 13
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('component configuration', 'midcom'),
212 13
                MIDCOM_TOOLBAR_GLYPHICON => 'wrench',
213
            ];
214
        }
215
216 20
        $buttons[] = [
217 20
            MIDCOM_TOOLBAR_URL => $this->_generate_url('metadata', $object),
218 20
            MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('metadata', 'midcom'),
219 20
            MIDCOM_TOOLBAR_GLYPHICON => 'database',
220 20
            MIDCOM_TOOLBAR_ACCESSKEY => 'm',
221
        ];
222 20
        $buttons = array_merge($buttons, $this->get_approval_controls($object));
223
224 20
        $buttons[] = [
225 20
            MIDCOM_TOOLBAR_URL => $this->_generate_url('attachments', $object),
226 20
            MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('attachments', 'midgard.admin.asgard'),
227 20
            MIDCOM_TOOLBAR_GLYPHICON => 'paperclip',
228
        ];
229
230 20
        $buttons[] = [
231 20
            MIDCOM_TOOLBAR_URL => $this->_generate_url('parameters', $object),
232 20
            MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('parameters', 'midcom'),
233 20
            MIDCOM_TOOLBAR_GLYPHICON => 'sitemap',
234 20
            MIDCOM_TOOLBAR_ENABLED => $object->can_do('midgard:parameters'),
235
        ];
236
237 20
        $buttons[] = [
238 20
            MIDCOM_TOOLBAR_URL => $this->_generate_url('permissions', $object),
239 20
            MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('privileges', 'midcom'),
240 20
            MIDCOM_TOOLBAR_GLYPHICON => 'shield',
241 20
            MIDCOM_TOOLBAR_ENABLED => $object->can_do('midgard:privileges'),
242
        ];
243
244 20
        if (   midcom::get()->componentloader->is_installed('midcom.helper.replicator')
245 20
            && midcom::get()->auth->admin) {
246
            $buttons[] = [
247
                MIDCOM_TOOLBAR_URL => "__mfa/asgard_midcom.helper.replicator/object/{$object->guid}/",
248
                MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_string('replication information', 'midcom.helper.replicator'),
249
                MIDCOM_TOOLBAR_GLYPHICON => 'files-o',
250
                MIDCOM_TOOLBAR_ACCESSKEY => 'r',
251
            ];
252
        }
253 20
        return $buttons;
254
    }
255
}
256