xref: /plugin/structnotification/admin.php (revision 22ceb3ec42ad0c0a0966c8a1084e9b54fe097c53)
1a1f4c7baSSzymon Olewniczak<?php
2*22ceb3ecSAnna Dabrowska
3*22ceb3ecSAnna Dabrowskause dokuwiki\Extension\AdminPlugin;
4*22ceb3ecSAnna Dabrowskause dokuwiki\Form\Form;
5*22ceb3ecSAnna 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 */
12*22ceb3ecSAnna 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) {
55*22ceb3ecSAnna 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) {
66*22ceb3ecSAnna Dabrowska                    $this->displayErrors($errors);
67922aade7SSzymon Olewniczak                    return;
68922aade7SSzymon Olewniczak                }
69922aade7SSzymon Olewniczak
70*22ceb3ecSAnna 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
76*22ceb3ecSAnna 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
97*22ceb3ecSAnna Dabrowska        echo '<h1>' . $this->getLang('menu') . '</h1>';
98*22ceb3ecSAnna Dabrowska        echo '<table>';
99922aade7SSzymon Olewniczak
100*22ceb3ecSAnna Dabrowska        echo '<tr>';
101922aade7SSzymon Olewniczak        foreach ($this->headers as $header) {
102*22ceb3ecSAnna Dabrowska            echo '<th>' . $this->getLang('admin header ' . $header) . '</th>';
103922aade7SSzymon Olewniczak        }
104*22ceb3ecSAnna Dabrowska        echo '<th></th>';
105*22ceb3ecSAnna Dabrowska        echo '</tr>';
106922aade7SSzymon Olewniczak
107922aade7SSzymon Olewniczak        $q = 'SELECT * FROM predicate';
108922aade7SSzymon Olewniczak        $res = $sqlite->query($q);
109922aade7SSzymon Olewniczak
110922aade7SSzymon Olewniczak        $predicates = $sqlite->res2arr($res);
111922aade7SSzymon Olewniczak
112922aade7SSzymon Olewniczak        foreach ($predicates as $predicate) {
113922aade7SSzymon Olewniczak            if ($INPUT->str('edit') == $predicate['id']) {
114922aade7SSzymon Olewniczak                if (!$INPUT->has('predicate')) {
115922aade7SSzymon Olewniczak                    $INPUT->set('predicate', $predicate);
116922aade7SSzymon Olewniczak                }
117922aade7SSzymon Olewniczak
118*22ceb3ecSAnna Dabrowska                echo $this->form('update');
119922aade7SSzymon Olewniczak                continue;
120922aade7SSzymon Olewniczak            }
121922aade7SSzymon Olewniczak
122*22ceb3ecSAnna Dabrowska            echo '<tr>';
123922aade7SSzymon Olewniczak            foreach ($this->headers as $header) {
124ac63f65fSSzymon Olewniczak                $value = $predicate[$header];
125ac63f65fSSzymon Olewniczak                if ($header == 'message') {
126ac63f65fSSzymon Olewniczak                    $html = p_render('xhtml', p_get_instructions($value), $info);
127*22ceb3ecSAnna Dabrowska                    echo '<td>' . $html . '</td>';
128ac63f65fSSzymon Olewniczak                } else {
129*22ceb3ecSAnna Dabrowska                    echo '<td>' . $value . '</td>';
130ac63f65fSSzymon Olewniczak                }
131922aade7SSzymon Olewniczak            }
132922aade7SSzymon Olewniczak
133*22ceb3ecSAnna Dabrowska            echo '<td>';
134922aade7SSzymon Olewniczak            $link = wl(
135*22ceb3ecSAnna Dabrowska                $ID,
136*22ceb3ecSAnna Dabrowska                ['do' => 'admin', 'page' => 'structnotification', 'edit' => $predicate['id']]
137922aade7SSzymon Olewniczak            );
138*22ceb3ecSAnna Dabrowska            echo '<a href="' . $link . '">' . $this->getLang('edit') . '</a> | ';
139922aade7SSzymon Olewniczak
140922aade7SSzymon Olewniczak            $link = wl(
141*22ceb3ecSAnna Dabrowska                $ID,
142*22ceb3ecSAnna Dabrowska                [
143922aade7SSzymon Olewniczak                    'do' => 'admin',
144922aade7SSzymon Olewniczak                    'page' => 'structnotification',
145922aade7SSzymon Olewniczak                    'action' => 'delete',
146922aade7SSzymon Olewniczak                    'sectok' => getSecurityToken(),
147922aade7SSzymon Olewniczak                    'predicate[id]' => $predicate['id']
148*22ceb3ecSAnna Dabrowska                ]
149922aade7SSzymon Olewniczak            );
150*22ceb3ecSAnna Dabrowska            echo '<a class="plugin__structnotification_delete" href="' . $link . '">' .
151*22ceb3ecSAnna Dabrowska                $this->getLang('delete') . '</a>';
152922aade7SSzymon Olewniczak
153*22ceb3ecSAnna Dabrowska            echo '</td>';
154*22ceb3ecSAnna Dabrowska            echo '</tr>';
155922aade7SSzymon Olewniczak        }
156922aade7SSzymon Olewniczak        if (!$INPUT->has('edit')) {
157*22ceb3ecSAnna Dabrowska            echo $this->form();
158922aade7SSzymon Olewniczak        }
159*22ceb3ecSAnna Dabrowska        echo '</table>';
160922aade7SSzymon Olewniczak    }
161922aade7SSzymon Olewniczak
162922aade7SSzymon Olewniczak    protected function form($action = 'add')
163922aade7SSzymon Olewniczak    {
164922aade7SSzymon Olewniczak        global $ID;
165922aade7SSzymon Olewniczak
166*22ceb3ecSAnna Dabrowska        $form = new Form();
167922aade7SSzymon Olewniczak        $form->addTagOpen('tr');
168922aade7SSzymon Olewniczak
169922aade7SSzymon Olewniczak        $form->addTagOpen('td');
170ac63f65fSSzymon Olewniczak        $form->addTextInput('predicate[schema]')->attr('style', 'width: 8em');
171922aade7SSzymon Olewniczak        $form->addTagClose('td');
172922aade7SSzymon Olewniczak
173922aade7SSzymon Olewniczak        $form->addTagOpen('td');
174ac63f65fSSzymon Olewniczak        $form->addTextInput('predicate[field]')->attr('style', 'width: 8em');
175922aade7SSzymon Olewniczak        $form->addTagClose('td');
176922aade7SSzymon Olewniczak
177922aade7SSzymon Olewniczak        $form->addTagOpen('td');
178922aade7SSzymon Olewniczak        $form->addDropdown('predicate[operator]', $this->operators);
179922aade7SSzymon Olewniczak        $form->addTagClose('td');
180922aade7SSzymon Olewniczak
181922aade7SSzymon Olewniczak        $form->addTagOpen('td');
1824677fc3cSSzymon Olewniczak        $form->addTextInput('predicate[value]')->attr('style', 'width: 12em');
183922aade7SSzymon Olewniczak        $form->addTagClose('td');
184922aade7SSzymon Olewniczak
185922aade7SSzymon Olewniczak        $form->addTagOpen('td');
186e96b00ceSAnna Dabrowska        $form->addTextarea('predicate[filters]')->attr('style', 'width: 12em; height: 5em;');
187e96b00ceSAnna Dabrowska        $form->addTagClose('td');
188e96b00ceSAnna Dabrowska
189e96b00ceSAnna Dabrowska        $form->addTagOpen('td');
190ac63f65fSSzymon Olewniczak        $form->addTextInput('predicate[users_and_groups]')->attr('style', 'width: 12em');
191922aade7SSzymon Olewniczak        $form->addTagClose('td');
192922aade7SSzymon Olewniczak
193922aade7SSzymon Olewniczak        $form->addTagOpen('td');
194ac63f65fSSzymon Olewniczak        $form->addHTML('<div id="tool__bar"></div>');
195ac63f65fSSzymon Olewniczak        $form->setHiddenField('id', $ID); //for linkwiz
196ac63f65fSSzymon Olewniczak        $form->addTextarea('predicate[message]')
197ac63f65fSSzymon Olewniczak            ->id('wiki__text')
198ac63f65fSSzymon Olewniczak            ->attr('style', 'width: 100%; height: 10em;');
199922aade7SSzymon Olewniczak        $form->addTagClose('td');
200922aade7SSzymon Olewniczak
201922aade7SSzymon Olewniczak        $form->addTagOpen('td');
202922aade7SSzymon Olewniczak        $form->addButton('action', $this->getLang($action))->val($action);
203922aade7SSzymon Olewniczak        $link = wl(
204*22ceb3ecSAnna Dabrowska            $ID,
205*22ceb3ecSAnna Dabrowska            [
206922aade7SSzymon Olewniczak                'do' => 'admin',
207922aade7SSzymon Olewniczak                'page' => 'structnotification',
208922aade7SSzymon Olewniczak            ]
209922aade7SSzymon Olewniczak        );
210*22ceb3ecSAnna Dabrowska        $cancel_link = '<a href="' . $link . '" style="margin-left:1em" id="plugin__structnotification_cancel">' .
211*22ceb3ecSAnna Dabrowska            $this->getLang('cancel') . '</a>';
212922aade7SSzymon Olewniczak        $form->addHTML($cancel_link);
213922aade7SSzymon Olewniczak        $form->addTagClose('td');
214922aade7SSzymon Olewniczak
215922aade7SSzymon Olewniczak
216922aade7SSzymon Olewniczak        $form->addTagClose('tr');
217922aade7SSzymon Olewniczak
218922aade7SSzymon Olewniczak        return $form->toHTML();
219922aade7SSzymon Olewniczak    }
220922aade7SSzymon Olewniczak
221922aade7SSzymon Olewniczak    protected function validate($predicate)
222922aade7SSzymon Olewniczak    {
223922aade7SSzymon Olewniczak        $errors = [];
224922aade7SSzymon Olewniczak        if (blank($predicate['schema'])) {
225922aade7SSzymon Olewniczak            $errors[] = 'val schema blank';
226922aade7SSzymon Olewniczak        }
227922aade7SSzymon Olewniczak
228922aade7SSzymon Olewniczak        if (blank($predicate['field'])) {
229922aade7SSzymon Olewniczak            $errors[] = 'val field blank';
230922aade7SSzymon Olewniczak        }
231922aade7SSzymon Olewniczak
232922aade7SSzymon Olewniczak        if (blank($predicate['operator'])) {
233922aade7SSzymon Olewniczak            $errors[] = 'val operator blank';
234922aade7SSzymon Olewniczak        }
235922aade7SSzymon Olewniczak
2364677fc3cSSzymon Olewniczak        if (blank($predicate['value'])) {
2374677fc3cSSzymon Olewniczak            $errors[] = 'val value blank';
238922aade7SSzymon Olewniczak        }
239922aade7SSzymon Olewniczak
240922aade7SSzymon Olewniczak        if (blank($predicate['users_and_groups'])) {
241922aade7SSzymon Olewniczak            $errors[] = 'val users_and_groups blank';
242922aade7SSzymon Olewniczak        }
243922aade7SSzymon Olewniczak
244922aade7SSzymon Olewniczak        if (blank($predicate['message'])) {
245922aade7SSzymon Olewniczak            $errors[] = 'val message blank';
246922aade7SSzymon Olewniczak        }
247922aade7SSzymon Olewniczak
248922aade7SSzymon Olewniczak        return $errors;
249922aade7SSzymon Olewniczak    }
250922aade7SSzymon Olewniczak
251*22ceb3ecSAnna Dabrowska    protected function displayErrors($errors)
252*22ceb3ecSAnna Dabrowska    {
253922aade7SSzymon Olewniczak        foreach ($errors as $error) {
254922aade7SSzymon Olewniczak            $msg = $this->getLang($error);
255922aade7SSzymon Olewniczak            if (!$msg) $msg = $error;
256922aade7SSzymon Olewniczak            msg($error, -1);
257922aade7SSzymon Olewniczak        }
258a1f4c7baSSzymon Olewniczak    }
259a1f4c7baSSzymon Olewniczak}
260