xref: /plugin/structnotification/admin.php (revision c8b4d67adfe133fc3bd85b56011826c65d28e207)
1a1f4c7baSSzymon Olewniczak<?php
222ceb3ecSAnna Dabrowska
322ceb3ecSAnna Dabrowskause dokuwiki\Extension\AdminPlugin;
422ceb3ecSAnna Dabrowskause dokuwiki\Form\Form;
522ceb3ecSAnna Dabrowska
6a1f4c7baSSzymon Olewniczak/**
7a1f4c7baSSzymon Olewniczak * DokuWiki Plugin structnotification (Admin Component)
8a1f4c7baSSzymon Olewniczak *
9a1f4c7baSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
10a1f4c7baSSzymon Olewniczak * @author  Szymon Olewniczak <it@rid.pl>
11a1f4c7baSSzymon Olewniczak */
1222ceb3ecSAnna Dabrowskaclass admin_plugin_structnotification extends AdminPlugin
13a1f4c7baSSzymon Olewniczak{
14e96b00ceSAnna Dabrowska    protected $headers = ['schema', 'field', 'operator', 'value', 'filters', 'users_and_groups', 'message'];
154677fc3cSSzymon Olewniczak    protected $operators = ['before', 'after', 'at'];
16922aade7SSzymon Olewniczak
17a1f4c7baSSzymon Olewniczak    /**
18a1f4c7baSSzymon Olewniczak     * @return int sort number in admin menu
19a1f4c7baSSzymon Olewniczak     */
20a1f4c7baSSzymon Olewniczak    public function getMenuSort()
21a1f4c7baSSzymon Olewniczak    {
22922aade7SSzymon Olewniczak        return 499;
23a1f4c7baSSzymon Olewniczak    }
24a1f4c7baSSzymon Olewniczak
25a1f4c7baSSzymon Olewniczak    /**
26a1f4c7baSSzymon Olewniczak     * @return bool true if only access for superuser, false is for superusers and moderators
27a1f4c7baSSzymon Olewniczak     */
28a1f4c7baSSzymon Olewniczak    public function forAdminOnly()
29a1f4c7baSSzymon Olewniczak    {
30a1f4c7baSSzymon Olewniczak        return false;
31a1f4c7baSSzymon Olewniczak    }
32a1f4c7baSSzymon Olewniczak
33a1f4c7baSSzymon Olewniczak    /**
34a1f4c7baSSzymon Olewniczak     * Should carry out any processing required by the plugin.
35a1f4c7baSSzymon Olewniczak     */
36a1f4c7baSSzymon Olewniczak    public function handle()
37a1f4c7baSSzymon Olewniczak    {
38922aade7SSzymon Olewniczak        global $INPUT;
39922aade7SSzymon Olewniczak        global $ID;
40a1f4c7baSSzymon Olewniczak
41922aade7SSzymon Olewniczak        try {
42922aade7SSzymon Olewniczak            /** @var \helper_plugin_structnotification_db$db_helper */
43922aade7SSzymon Olewniczak            $db_helper = plugin_load('helper', 'structnotification_db');
44922aade7SSzymon Olewniczak            $sqlite = $db_helper->getDB();
45922aade7SSzymon Olewniczak        } catch (Exception $e) {
46922aade7SSzymon Olewniczak            msg($e->getMessage(), -1);
47922aade7SSzymon Olewniczak            return;
48922aade7SSzymon Olewniczak        }
49922aade7SSzymon Olewniczak
50922aade7SSzymon Olewniczak        if ($INPUT->str('action') && $INPUT->arr('predicate') && checkSecurityToken()) {
51922aade7SSzymon Olewniczak            $predicate = $INPUT->arr('predicate');
52922aade7SSzymon Olewniczak            if ($INPUT->str('action') === 'add') {
53922aade7SSzymon Olewniczak                $errors = $this->validate($predicate);
54922aade7SSzymon Olewniczak                if ($errors) {
5522ceb3ecSAnna Dabrowska                    $this->displayErrors($errors);
56922aade7SSzymon Olewniczak                    return;
57922aade7SSzymon Olewniczak                }
58922aade7SSzymon Olewniczak                $ok = $sqlite->storeEntry('predicate', $predicate);
59922aade7SSzymon Olewniczak                if (!$ok) msg('failed to add predicate', -1);
60922aade7SSzymon Olewniczak            } elseif ($INPUT->str('action') === 'delete') {
61922aade7SSzymon Olewniczak                $ok = $sqlite->query('DELETE FROM predicate WHERE id=?', $predicate['id']);
62922aade7SSzymon Olewniczak                if (!$ok) msg('failed to delete predicate', -1);
63922aade7SSzymon Olewniczak            } elseif ($INPUT->str('action') === 'update') {
64922aade7SSzymon Olewniczak                $errors = $this->validate($predicate);
65922aade7SSzymon Olewniczak                if ($errors) {
6622ceb3ecSAnna Dabrowska                    $this->displayErrors($errors);
67922aade7SSzymon Olewniczak                    return;
68922aade7SSzymon Olewniczak                }
69922aade7SSzymon Olewniczak
7022ceb3ecSAnna Dabrowska                $set = implode(',', array_map(static fn($header) => "$header=?", $this->headers));
71922aade7SSzymon Olewniczak                $predicate['id'] = $INPUT->str('edit');
72922aade7SSzymon Olewniczak                $ok = $sqlite->query("UPDATE predicate SET $set WHERE id=?", $predicate);
73922aade7SSzymon Olewniczak                if (!$ok) msg('failed to update predicate', -1);
74922aade7SSzymon Olewniczak            }
75922aade7SSzymon Olewniczak
7622ceb3ecSAnna Dabrowska            if ($ok) send_redirect(wl($ID, ['do' => 'admin', 'page' => 'structnotification'], true, '&'));
77922aade7SSzymon Olewniczak        }
78a1f4c7baSSzymon Olewniczak    }
79a1f4c7baSSzymon Olewniczak
80a1f4c7baSSzymon Olewniczak    /**
81a1f4c7baSSzymon Olewniczak     * Render HTML output, e.g. helpful text and a form
82a1f4c7baSSzymon Olewniczak     */
83a1f4c7baSSzymon Olewniczak    public function html()
84a1f4c7baSSzymon Olewniczak    {
85922aade7SSzymon Olewniczak        global $INPUT;
86922aade7SSzymon Olewniczak        global $ID;
87922aade7SSzymon Olewniczak
88922aade7SSzymon Olewniczak        try {
89922aade7SSzymon Olewniczak            /** @var \helper_plugin_structnotification_db$db_helper */
90922aade7SSzymon Olewniczak            $db_helper = plugin_load('helper', 'structnotification_db');
91922aade7SSzymon Olewniczak            $sqlite = $db_helper->getDB();
92922aade7SSzymon Olewniczak        } catch (Exception $e) {
93922aade7SSzymon Olewniczak            msg($e->getMessage(), -1);
94922aade7SSzymon Olewniczak            return;
95922aade7SSzymon Olewniczak        }
96922aade7SSzymon Olewniczak
9722ceb3ecSAnna Dabrowska        echo '<h1>' . $this->getLang('menu') . '</h1>';
9841fd4d28SAnna Dabrowska        echo '<div class="table"><table>';
99922aade7SSzymon Olewniczak
100*c8b4d67aSAnna Dabrowska        echo $this->locale_xhtml('intro');
101*c8b4d67aSAnna Dabrowska
10222ceb3ecSAnna Dabrowska        echo '<tr>';
103922aade7SSzymon Olewniczak        foreach ($this->headers as $header) {
10422ceb3ecSAnna Dabrowska            echo '<th>' . $this->getLang('admin header ' . $header) . '</th>';
105922aade7SSzymon Olewniczak        }
10622ceb3ecSAnna Dabrowska        echo '<th></th>';
10722ceb3ecSAnna Dabrowska        echo '</tr>';
108922aade7SSzymon Olewniczak
109922aade7SSzymon Olewniczak        $q = 'SELECT * FROM predicate';
110922aade7SSzymon Olewniczak        $res = $sqlite->query($q);
111922aade7SSzymon Olewniczak
112922aade7SSzymon Olewniczak        $predicates = $sqlite->res2arr($res);
113922aade7SSzymon Olewniczak
114922aade7SSzymon Olewniczak        foreach ($predicates as $predicate) {
115922aade7SSzymon Olewniczak            if ($INPUT->str('edit') == $predicate['id']) {
116922aade7SSzymon Olewniczak                if (!$INPUT->has('predicate')) {
117922aade7SSzymon Olewniczak                    $INPUT->set('predicate', $predicate);
118922aade7SSzymon Olewniczak                }
119922aade7SSzymon Olewniczak
12022ceb3ecSAnna Dabrowska                echo $this->form('update');
121922aade7SSzymon Olewniczak                continue;
122922aade7SSzymon Olewniczak            }
123922aade7SSzymon Olewniczak
12422ceb3ecSAnna Dabrowska            echo '<tr>';
125922aade7SSzymon Olewniczak            foreach ($this->headers as $header) {
126ac63f65fSSzymon Olewniczak                $value = $predicate[$header];
127ac63f65fSSzymon Olewniczak                if ($header == 'message') {
128ac63f65fSSzymon Olewniczak                    $html = p_render('xhtml', p_get_instructions($value), $info);
12922ceb3ecSAnna Dabrowska                    echo '<td>' . $html . '</td>';
130ac63f65fSSzymon Olewniczak                } else {
13122ceb3ecSAnna Dabrowska                    echo '<td>' . $value . '</td>';
132ac63f65fSSzymon Olewniczak                }
133922aade7SSzymon Olewniczak            }
134922aade7SSzymon Olewniczak
13522ceb3ecSAnna Dabrowska            echo '<td>';
136922aade7SSzymon Olewniczak            $link = wl(
13722ceb3ecSAnna Dabrowska                $ID,
13822ceb3ecSAnna Dabrowska                ['do' => 'admin', 'page' => 'structnotification', 'edit' => $predicate['id']]
139922aade7SSzymon Olewniczak            );
14022ceb3ecSAnna Dabrowska            echo '<a href="' . $link . '">' . $this->getLang('edit') . '</a> | ';
141922aade7SSzymon Olewniczak
142922aade7SSzymon Olewniczak            $link = wl(
14322ceb3ecSAnna Dabrowska                $ID,
14422ceb3ecSAnna Dabrowska                [
145922aade7SSzymon Olewniczak                    'do' => 'admin',
146922aade7SSzymon Olewniczak                    'page' => 'structnotification',
147922aade7SSzymon Olewniczak                    'action' => 'delete',
148922aade7SSzymon Olewniczak                    'sectok' => getSecurityToken(),
149922aade7SSzymon Olewniczak                    'predicate[id]' => $predicate['id']
15022ceb3ecSAnna Dabrowska                ]
151922aade7SSzymon Olewniczak            );
15222ceb3ecSAnna Dabrowska            echo '<a class="plugin__structnotification_delete" href="' . $link . '">' .
15322ceb3ecSAnna Dabrowska                $this->getLang('delete') . '</a>';
154922aade7SSzymon Olewniczak
15522ceb3ecSAnna Dabrowska            echo '</td>';
15622ceb3ecSAnna Dabrowska            echo '</tr>';
157922aade7SSzymon Olewniczak        }
158922aade7SSzymon Olewniczak        if (!$INPUT->has('edit')) {
15922ceb3ecSAnna Dabrowska            echo $this->form();
160922aade7SSzymon Olewniczak        }
16141fd4d28SAnna Dabrowska        echo '</table></div>';
162922aade7SSzymon Olewniczak    }
163922aade7SSzymon Olewniczak
164922aade7SSzymon Olewniczak    protected function form($action = 'add')
165922aade7SSzymon Olewniczak    {
166922aade7SSzymon Olewniczak        global $ID;
167922aade7SSzymon Olewniczak
16822ceb3ecSAnna Dabrowska        $form = new Form();
169922aade7SSzymon Olewniczak        $form->addTagOpen('tr');
170922aade7SSzymon Olewniczak
171922aade7SSzymon Olewniczak        $form->addTagOpen('td');
17241fd4d28SAnna Dabrowska        $form->addTextInput('predicate[schema]')->attr('size', 10);
173922aade7SSzymon Olewniczak        $form->addTagClose('td');
174922aade7SSzymon Olewniczak
175922aade7SSzymon Olewniczak        $form->addTagOpen('td');
17641fd4d28SAnna Dabrowska        $form->addTextInput('predicate[field]')->attr('size', 10);
177922aade7SSzymon Olewniczak        $form->addTagClose('td');
178922aade7SSzymon Olewniczak
179922aade7SSzymon Olewniczak        $form->addTagOpen('td');
180922aade7SSzymon Olewniczak        $form->addDropdown('predicate[operator]', $this->operators);
181922aade7SSzymon Olewniczak        $form->addTagClose('td');
182922aade7SSzymon Olewniczak
183922aade7SSzymon Olewniczak        $form->addTagOpen('td');
18441fd4d28SAnna Dabrowska        $form->addTextInput('predicate[value]')->attr('size', 10);
185922aade7SSzymon Olewniczak        $form->addTagClose('td');
186922aade7SSzymon Olewniczak
187922aade7SSzymon Olewniczak        $form->addTagOpen('td');
18841fd4d28SAnna Dabrowska        $form->addTextarea('predicate[filters]')
18941fd4d28SAnna Dabrowska            ->attrs([
19041fd4d28SAnna Dabrowska                'cols' => '12',
19141fd4d28SAnna Dabrowska                'rows' => '5'
19241fd4d28SAnna Dabrowska            ]);
193e96b00ceSAnna Dabrowska        $form->addTagClose('td');
194e96b00ceSAnna Dabrowska
195e96b00ceSAnna Dabrowska        $form->addTagOpen('td');
19641fd4d28SAnna Dabrowska        $form->addTextInput('predicate[users_and_groups]')->attr('size', 10);
197922aade7SSzymon Olewniczak        $form->addTagClose('td');
198922aade7SSzymon Olewniczak
199922aade7SSzymon Olewniczak        $form->addTagOpen('td');
200ac63f65fSSzymon Olewniczak        $form->addHTML('<div id="tool__bar"></div>');
201ac63f65fSSzymon Olewniczak        $form->setHiddenField('id', $ID); //for linkwiz
202ac63f65fSSzymon Olewniczak        $form->addTextarea('predicate[message]')
203ac63f65fSSzymon Olewniczak            ->id('wiki__text')
204ac63f65fSSzymon Olewniczak            ->attr('style', 'width: 100%; height: 10em;');
205922aade7SSzymon Olewniczak        $form->addTagClose('td');
206922aade7SSzymon Olewniczak
207922aade7SSzymon Olewniczak        $form->addTagOpen('td');
208922aade7SSzymon Olewniczak        $form->addButton('action', $this->getLang($action))->val($action);
209922aade7SSzymon Olewniczak        $link = wl(
21022ceb3ecSAnna Dabrowska            $ID,
21122ceb3ecSAnna Dabrowska            [
212922aade7SSzymon Olewniczak                'do' => 'admin',
213922aade7SSzymon Olewniczak                'page' => 'structnotification',
214922aade7SSzymon Olewniczak            ]
215922aade7SSzymon Olewniczak        );
21622ceb3ecSAnna Dabrowska        $cancel_link = '<a href="' . $link . '" style="margin-left:1em" id="plugin__structnotification_cancel">' .
21722ceb3ecSAnna Dabrowska            $this->getLang('cancel') . '</a>';
218922aade7SSzymon Olewniczak        $form->addHTML($cancel_link);
219922aade7SSzymon Olewniczak        $form->addTagClose('td');
220922aade7SSzymon Olewniczak
221922aade7SSzymon Olewniczak
222922aade7SSzymon Olewniczak        $form->addTagClose('tr');
223922aade7SSzymon Olewniczak
224922aade7SSzymon Olewniczak        return $form->toHTML();
225922aade7SSzymon Olewniczak    }
226922aade7SSzymon Olewniczak
227922aade7SSzymon Olewniczak    protected function validate($predicate)
228922aade7SSzymon Olewniczak    {
229922aade7SSzymon Olewniczak        $errors = [];
230922aade7SSzymon Olewniczak        if (blank($predicate['schema'])) {
231922aade7SSzymon Olewniczak            $errors[] = 'val schema blank';
232922aade7SSzymon Olewniczak        }
233922aade7SSzymon Olewniczak
234922aade7SSzymon Olewniczak        if (blank($predicate['field'])) {
235922aade7SSzymon Olewniczak            $errors[] = 'val field blank';
236922aade7SSzymon Olewniczak        }
237922aade7SSzymon Olewniczak
238922aade7SSzymon Olewniczak        if (blank($predicate['operator'])) {
239922aade7SSzymon Olewniczak            $errors[] = 'val operator blank';
240922aade7SSzymon Olewniczak        }
241922aade7SSzymon Olewniczak
2424677fc3cSSzymon Olewniczak        if (blank($predicate['value'])) {
2434677fc3cSSzymon Olewniczak            $errors[] = 'val value blank';
244922aade7SSzymon Olewniczak        }
245922aade7SSzymon Olewniczak
246922aade7SSzymon Olewniczak        if (blank($predicate['users_and_groups'])) {
247922aade7SSzymon Olewniczak            $errors[] = 'val users_and_groups blank';
248922aade7SSzymon Olewniczak        }
249922aade7SSzymon Olewniczak
250922aade7SSzymon Olewniczak        if (blank($predicate['message'])) {
251922aade7SSzymon Olewniczak            $errors[] = 'val message blank';
252922aade7SSzymon Olewniczak        }
253922aade7SSzymon Olewniczak
254922aade7SSzymon Olewniczak        return $errors;
255922aade7SSzymon Olewniczak    }
256922aade7SSzymon Olewniczak
25722ceb3ecSAnna Dabrowska    protected function displayErrors($errors)
25822ceb3ecSAnna Dabrowska    {
259922aade7SSzymon Olewniczak        foreach ($errors as $error) {
260922aade7SSzymon Olewniczak            $msg = $this->getLang($error);
261922aade7SSzymon Olewniczak            if (!$msg) $msg = $error;
262922aade7SSzymon Olewniczak            msg($error, -1);
263922aade7SSzymon Olewniczak        }
264a1f4c7baSSzymon Olewniczak    }
265a1f4c7baSSzymon Olewniczak}
266