Completed
Push — master ( 842fa1...d2977d )
by Andreas
17:14
created

midgard_admin_asgard_toolbar::_generate_url()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

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