Failed Conditions
Pull Request — master (#3485)
by Frieder
03:25
created

Editor::addToolbar()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 2
nop 2
dl 0
loc 17
rs 9.7
c 0
b 0
f 0
1
<?php
2
3
namespace dokuwiki\Ui;
4
5
use dokuwiki\Extension\Event;
6
use dokuwiki\Form\Form;
7
8
/**
9
 * DokuWiki Page Editor
10
 *
11
 * @package dokuwiki\Ui
12
 */
13
class Editor extends Ui
14
{
15
    /**
16
     * Display the Edit Window
17
     * preprocess edit form data
18
     *
19
     * @author   Andreas Gohr <[email protected]>
20
     *
21
     * @triggers EDIT_FORM_ADDTEXTAREA
22
     * @return void
23
     */
24
    public function show()
25
    {
26
        global $INPUT;
27
        global $ID;
28
        global $REV;
29
        global $DATE;
30
        global $PRE;
31
        global $SUF;
32
        global $INFO;
33
        global $SUM;
34
        global $lang;
35
        global $conf;
36
        global $TEXT;
37
38
        global $license;
39
40
        if ($INPUT->has('changecheck')) {
41
            $check = $INPUT->str('changecheck');
42
        } elseif (!$INFO['exists']) {
43
            // $TEXT has been loaded from page template
44
            $check = md5('');
45
        } else {
46
            $check = md5($TEXT);
47
        }
48
        $mod = (md5($TEXT) !== $check);
49
50
        $wr = $INFO['writable'] && !$INFO['locked'];
51
52
        // intro locale text (edit, rditrev, or read)
53
        if ($wr) {
54
            $intro = ($REV) ? 'editrev' : 'edit';
55
        } else {
56
            // check pseudo action 'source'
57
            if (!actionOK('source')) {
58
                msg('Command disabled: source', -1);
59
                return;
60
            }
61
            $intro = 'read';
62
        }
63
64
        // create the Editor form
65
        $form = new Form(['id' => 'dw__editform']);
66
        $form->setHiddenField('id', $ID);
67
        $form->setHiddenField('rev', $REV);
68
        $form->setHiddenField('date', $DATE);
69
        $form->setHiddenField('prefix', $PRE .'.');
70
        $form->setHiddenField('suffix', $SUF);
71
        $form->setHiddenField('changecheck', $check);
72
73
        // prepare data for EDIT_FORM_ALTERNATE event
74
        $data = array(
75
            'form' => $form,
76
            'wr'   => $wr,
77
            'media_manager' => true,
78
            'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section',
79
            'intro_locale' => $intro,
80
        );
81
82
        $this->addToolbar($data, $wr);
83
84
        if ($data['target'] !== 'section') {
85
            // Only emit event if page is writable, section edit data is valid and
86
            // edit target is not section.
87
            Event::createAndTrigger('EDIT_FORM_ADDTEXTAREA', $data, [$this,'addTextarea'], true);
88
        } else {
89
            $this->addTextarea($data);
90
        }
91
92
        $form->setHiddenField('target', $data['target']);
93
94
        if ($INPUT->has('hid')) {
95
            $form->setHiddenField('hid', $INPUT->str('hid'));
96
        }
97
        if ($INPUT->has('codeblockOffset')) {
98
            $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset'));
99
        }
100
101
        $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar');
102
103
        $form->addTagOpen('div')->id('size__ctl');
104
        $form->addTagClose('div');
105
106
        if ($wr) {
107
            // add edit buttons: save, preview, cancel
108
            $form->addTagOpen('div')->addClass('editButtons');
109
            $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit')
110
                ->attrs(['accesskey' => 's', 'tabindex' => '4'])
111
                ->id('edbtn__save');
112
            $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit')
113
                ->attrs(['accesskey' => 'p', 'tabindex' => '5'])
114
                ->id('edbtn__preview');
115
            $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit')
116
                ->attrs(['tabindex' => '6']);
117
            $form->addTagClose('div'); // close div editButtons class
118
119
            // add a textbox for edit summary
120
            $form->addTagOpen('div')->addClass('summary');
121
            $input = $form->addTextInput('summary', $lang['summary'])
122
                ->attrs(['size' => '50', 'tabindex' => '2'])
123
                ->id('edit__summary')->addClass('edit')
124
                ->val($SUM);
125
            $input->getLabel()->attr('class', 'nowrap');
126
127
            // adds a checkbox for minor edits for logged in users
128
            if ($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
129
                $form->addHTML(' ');
130
                $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1');
131
            }
132
            $form->addTagClose('div'); // close div summary class
133
        }
134
135
        $form->addTagClose('div'); // close div editBar class
136
137
        // license note
138
        if ($wr && $conf['license']) {
139
            $attr = array(
140
                'href'   => $license[$conf['license']]['url'],
141
                'rel'    => 'license',
142
                'class'  => 'urlextern',
143
                'target' => $conf['target']['extern'] ? $conf['target']['extern'] : '',
144
            );
145
            $form->addTagOpen('div')->addClass('license');
146
            $form->addHTML($lang['licenseok']
147
                .' <a '.buildAttributes($attr, true).'>'.$license[$conf['license']]['name'].'</a>'
148
            );
149
            $form->addTagClose('div');
150
        }
151
152
        // start editor html output
153
        if ($wr) {
154
            // sets changed to true when previewed
155
            echo '<script>/*<![CDATA[*/'.'textChanged = '. ($mod ? 'true' : 'false') .'/*!]]>*/</script>';
156
        }
157
158
        // print intro locale text (edit, rditrev, or read.txt)
159
        if (isset($data['intro_locale'])) {
160
            echo p_locale_xhtml($data['intro_locale']);
161
        }
162
163
        echo '<div class="editBox" role="application">';
164
165
        echo '<div id="draft__status" class="draft__status">';
166
        $draft = new \dokuwiki\Draft($ID, $INFO['client']);
167
        if ($draft->isDraftAvailable()) {
168
            echo $draft->getDraftMessage();
169
        }
170
        echo '</div>';
171
172
        echo $form->toHTML('Edit');
173
174
        echo '</div>'; // close div editBox class
175
    }
176
177
    /**
178
     * Display the default edit form (textarea)
179
     *
180
     * the default action for EDIT_FORM_ADDTEXTAREA
181
     *
182
     * @param mixed[] $data
183
     */
184
    public function addTextarea(&$data)
185
    {
186
        global $TEXT;
187
188
        if ($data['target'] !== 'section') {
189
            msg('No editor for edit target '. hsc($data['target']) .' found.', -1);
190
        }
191
192
        // set textarea attributes
193
        $attr = array('tabindex' => '1');
194
        if (!$data['wr']) $attr['readonly'] = 'readonly';
195
        $attr['dir']  = 'auto';
196
        $attr['cols'] = '80';
197
        $attr['rows'] = '10';
198
199
        /** @var dokuwiki\Form\Form $data['form'] */
200
        $data['form']->addTextarea('wikitext','')->attrs($attr)->val($TEXT)
201
                ->id('wiki__text')->addClass('edit');
202
    }
203
204
    /**
205
     * Display the toolbar
206
     *
207
     * @param mixed[] $data
208
     * @param bool $wr
209
     */
210
    public function addToolbar(&$data, $wr)
211
    {
212
        global $INFO;
213
214
        $html = '<div class="toolbar group">';
215
        $html .= '<div id="tool__bar" class="tool__bar">';
216
        if ($wr && $data['media_manager']) {
217
            $html .= '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.$INFO['namespace'].'" target="_blank">';
218
            $html .= $lang['mediaselect'];
0 ignored issues
show
Bug introduced by
The variable $lang does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
219
            $html .= '</a>';
220
        }
221
        $html .= '</div>';
222
        $html .= '</div>';
223
224
        /** @var dokuwiki\Form\Form $data['form'] */
225
        $data['form']->addHTML($html);
226
    }
227
}
228