xref: /plugin/structnotification/admin.php (revision 922aade72833a1850ff96fdccd4da59286e31af8)
1a1f4c7baSSzymon Olewniczak<?php
2a1f4c7baSSzymon Olewniczak/**
3a1f4c7baSSzymon Olewniczak * DokuWiki Plugin structnotification (Admin Component)
4a1f4c7baSSzymon Olewniczak *
5a1f4c7baSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6a1f4c7baSSzymon Olewniczak * @author  Szymon Olewniczak <it@rid.pl>
7a1f4c7baSSzymon Olewniczak */
8a1f4c7baSSzymon Olewniczak
9a1f4c7baSSzymon Olewniczak// must be run within Dokuwiki
10a1f4c7baSSzymon Olewniczakif (!defined('DOKU_INC')) {
11a1f4c7baSSzymon Olewniczak    die();
12a1f4c7baSSzymon Olewniczak}
13a1f4c7baSSzymon Olewniczak
14a1f4c7baSSzymon Olewniczakclass admin_plugin_structnotification extends DokuWiki_Admin_Plugin
15a1f4c7baSSzymon Olewniczak{
16a1f4c7baSSzymon Olewniczak
17*922aade7SSzymon Olewniczak    protected $headers = ['schema', 'field', 'operator', 'days', 'users_and_groups', 'message'];
18*922aade7SSzymon Olewniczak    protected $operators = ['before', 'after'];
19*922aade7SSzymon Olewniczak
20a1f4c7baSSzymon Olewniczak    /**
21a1f4c7baSSzymon Olewniczak     * @return int sort number in admin menu
22a1f4c7baSSzymon Olewniczak     */
23a1f4c7baSSzymon Olewniczak    public function getMenuSort()
24a1f4c7baSSzymon Olewniczak    {
25*922aade7SSzymon Olewniczak        return 499;
26a1f4c7baSSzymon Olewniczak    }
27a1f4c7baSSzymon Olewniczak
28a1f4c7baSSzymon Olewniczak    /**
29a1f4c7baSSzymon Olewniczak     * @return bool true if only access for superuser, false is for superusers and moderators
30a1f4c7baSSzymon Olewniczak     */
31a1f4c7baSSzymon Olewniczak    public function forAdminOnly()
32a1f4c7baSSzymon Olewniczak    {
33a1f4c7baSSzymon Olewniczak        return false;
34a1f4c7baSSzymon Olewniczak    }
35a1f4c7baSSzymon Olewniczak
36a1f4c7baSSzymon Olewniczak    /**
37a1f4c7baSSzymon Olewniczak     * Should carry out any processing required by the plugin.
38a1f4c7baSSzymon Olewniczak     */
39a1f4c7baSSzymon Olewniczak    public function handle()
40a1f4c7baSSzymon Olewniczak    {
41*922aade7SSzymon Olewniczak        global $INPUT;
42*922aade7SSzymon Olewniczak        global $ID;
43a1f4c7baSSzymon Olewniczak
44*922aade7SSzymon Olewniczak        try {
45*922aade7SSzymon Olewniczak            /** @var \helper_plugin_structnotification_db$db_helper */
46*922aade7SSzymon Olewniczak            $db_helper = plugin_load('helper', 'structnotification_db');
47*922aade7SSzymon Olewniczak            $sqlite = $db_helper->getDB();
48*922aade7SSzymon Olewniczak        } catch (Exception $e) {
49*922aade7SSzymon Olewniczak            msg($e->getMessage(), -1);
50*922aade7SSzymon Olewniczak            return;
51*922aade7SSzymon Olewniczak        }
52*922aade7SSzymon Olewniczak
53*922aade7SSzymon Olewniczak
54*922aade7SSzymon Olewniczak        if ($INPUT->str('action') && $INPUT->arr('predicate') && checkSecurityToken()) {
55*922aade7SSzymon Olewniczak            $predicate = $INPUT->arr('predicate');
56*922aade7SSzymon Olewniczak            if ($INPUT->str('action') === 'add') {
57*922aade7SSzymon Olewniczak                $errors = $this->validate($predicate);
58*922aade7SSzymon Olewniczak                if ($errors) {
59*922aade7SSzymon Olewniczak                    $this->display_errors($errors);
60*922aade7SSzymon Olewniczak                    return;
61*922aade7SSzymon Olewniczak                }
62*922aade7SSzymon Olewniczak                $ok = $sqlite->storeEntry('predicate', $predicate);
63*922aade7SSzymon Olewniczak                if(!$ok) msg('failed to add predicate', -1);
64*922aade7SSzymon Olewniczak            } elseif($INPUT->str('action') === 'delete') {
65*922aade7SSzymon Olewniczak                $ok = $sqlite->query('DELETE FROM predicate WHERE id=?', $predicate['id']);
66*922aade7SSzymon Olewniczak                if(!$ok) msg('failed to delete predicate', -1);
67*922aade7SSzymon Olewniczak            } elseif($INPUT->str('action') === 'update') {
68*922aade7SSzymon Olewniczak                $errors = $this->validate($predicate);
69*922aade7SSzymon Olewniczak                if ($errors) {
70*922aade7SSzymon Olewniczak                    $this->display_errors($errors);
71*922aade7SSzymon Olewniczak                    return;
72*922aade7SSzymon Olewniczak                }
73*922aade7SSzymon Olewniczak
74*922aade7SSzymon Olewniczak                $set = implode(',', array_map(function ($header) {
75*922aade7SSzymon Olewniczak                    return "$header=?";
76*922aade7SSzymon Olewniczak                }, $this->headers));
77*922aade7SSzymon Olewniczak                $predicate['id'] = $INPUT->str('edit');
78*922aade7SSzymon Olewniczak                $ok = $sqlite->query("UPDATE predicate SET $set WHERE id=?", $predicate);
79*922aade7SSzymon Olewniczak                if(!$ok) msg('failed to update predicate', -1);
80*922aade7SSzymon Olewniczak            }
81*922aade7SSzymon Olewniczak
82*922aade7SSzymon Olewniczak
83*922aade7SSzymon Olewniczak            if ($ok) send_redirect(wl($ID, array('do' => 'admin', 'page' => 'structnotification'), true, '&'));
84*922aade7SSzymon Olewniczak        }
85a1f4c7baSSzymon Olewniczak    }
86a1f4c7baSSzymon Olewniczak
87a1f4c7baSSzymon Olewniczak    /**
88a1f4c7baSSzymon Olewniczak     * Render HTML output, e.g. helpful text and a form
89a1f4c7baSSzymon Olewniczak     */
90a1f4c7baSSzymon Olewniczak    public function html()
91a1f4c7baSSzymon Olewniczak    {
92*922aade7SSzymon Olewniczak        global $INPUT;
93*922aade7SSzymon Olewniczak        global $ID;
94*922aade7SSzymon Olewniczak
95*922aade7SSzymon Olewniczak        try {
96*922aade7SSzymon Olewniczak            /** @var \helper_plugin_structnotification_db$db_helper */
97*922aade7SSzymon Olewniczak            $db_helper = plugin_load('helper', 'structnotification_db');
98*922aade7SSzymon Olewniczak            $sqlite = $db_helper->getDB();
99*922aade7SSzymon Olewniczak        } catch (Exception $e) {
100*922aade7SSzymon Olewniczak            msg($e->getMessage(), -1);
101*922aade7SSzymon Olewniczak            return;
102*922aade7SSzymon Olewniczak        }
103*922aade7SSzymon Olewniczak
104a1f4c7baSSzymon Olewniczak        ptln('<h1>' . $this->getLang('menu') . '</h1>');
105*922aade7SSzymon Olewniczak        ptln('<table>');
106*922aade7SSzymon Olewniczak
107*922aade7SSzymon Olewniczak        ptln('<tr>');
108*922aade7SSzymon Olewniczak        foreach ($this->headers as $header) {
109*922aade7SSzymon Olewniczak            ptln('<th>' . $this->getLang('admin header '. $header) . '</th>');
110*922aade7SSzymon Olewniczak        }
111*922aade7SSzymon Olewniczak        //extra field for buttons
112*922aade7SSzymon Olewniczak        ptln('<th></th>');
113*922aade7SSzymon Olewniczak        ptln('</tr>');
114*922aade7SSzymon Olewniczak
115*922aade7SSzymon Olewniczak        $q = 'SELECT * FROM predicate';
116*922aade7SSzymon Olewniczak        $res = $sqlite->query($q);
117*922aade7SSzymon Olewniczak
118*922aade7SSzymon Olewniczak        $predicates = $sqlite->res2arr($res);
119*922aade7SSzymon Olewniczak
120*922aade7SSzymon Olewniczak        foreach ($predicates as $predicate) {
121*922aade7SSzymon Olewniczak            if ($INPUT->str('edit') == $predicate['id']) {
122*922aade7SSzymon Olewniczak                if (!$INPUT->has('predicate')) {
123*922aade7SSzymon Olewniczak                    $INPUT->set('predicate', $predicate);
124*922aade7SSzymon Olewniczak                }
125*922aade7SSzymon Olewniczak
126*922aade7SSzymon Olewniczak                ptln($this->form('update'));
127*922aade7SSzymon Olewniczak                continue;
128*922aade7SSzymon Olewniczak            }
129*922aade7SSzymon Olewniczak
130*922aade7SSzymon Olewniczak            ptln('<tr>');
131*922aade7SSzymon Olewniczak            foreach ($this->headers as $header) {
132*922aade7SSzymon Olewniczak                ptln('<td>' . $predicate[$header] . '</td>');
133*922aade7SSzymon Olewniczak            }
134*922aade7SSzymon Olewniczak
135*922aade7SSzymon Olewniczak            ptln('<td>');
136*922aade7SSzymon Olewniczak            $link = wl(
137*922aade7SSzymon Olewniczak                $ID, array(
138*922aade7SSzymon Olewniczak                    'do' => 'admin',
139*922aade7SSzymon Olewniczak                    'page' => 'structnotification',
140*922aade7SSzymon Olewniczak                    'edit' => $predicate['id']
141*922aade7SSzymon Olewniczak                )
142*922aade7SSzymon Olewniczak            );
143*922aade7SSzymon Olewniczak            ptln('<a href="' . $link . '">'.$this->getLang('edit').'</a> | ');
144*922aade7SSzymon Olewniczak
145*922aade7SSzymon Olewniczak            $link = wl(
146*922aade7SSzymon Olewniczak                $ID, array(
147*922aade7SSzymon Olewniczak                    'do' => 'admin',
148*922aade7SSzymon Olewniczak                    'page' => 'structnotification',
149*922aade7SSzymon Olewniczak                    'action' => 'delete',
150*922aade7SSzymon Olewniczak                    'sectok' => getSecurityToken(),
151*922aade7SSzymon Olewniczak                    'predicate[id]' => $predicate['id']
152*922aade7SSzymon Olewniczak                )
153*922aade7SSzymon Olewniczak            );
154*922aade7SSzymon Olewniczak            ptln('<a class="plugin__structnotification_delete" href="' . $link . '">'.$this->getLang('delete').'</a>');
155*922aade7SSzymon Olewniczak
156*922aade7SSzymon Olewniczak            ptln('</td>');
157*922aade7SSzymon Olewniczak            ptln('</tr>');
158*922aade7SSzymon Olewniczak        }
159*922aade7SSzymon Olewniczak        if (!$INPUT->has('edit')) {
160*922aade7SSzymon Olewniczak            ptln($this->form());
161*922aade7SSzymon Olewniczak        }
162*922aade7SSzymon Olewniczak        ptln('</table>');
163*922aade7SSzymon Olewniczak    }
164*922aade7SSzymon Olewniczak
165*922aade7SSzymon Olewniczak    protected function form($action='add')
166*922aade7SSzymon Olewniczak    {
167*922aade7SSzymon Olewniczak        global $ID;
168*922aade7SSzymon Olewniczak
169*922aade7SSzymon Olewniczak        $form = new dokuwiki\Form\Form();
170*922aade7SSzymon Olewniczak        $form->addTagOpen('tr');
171*922aade7SSzymon Olewniczak
172*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
173*922aade7SSzymon Olewniczak        $form->addTextInput('predicate[schema]');
174*922aade7SSzymon Olewniczak        $form->addTagClose('td');
175*922aade7SSzymon Olewniczak
176*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
177*922aade7SSzymon Olewniczak        $form->addTextInput('predicate[field]');
178*922aade7SSzymon Olewniczak        $form->addTagClose('td');
179*922aade7SSzymon Olewniczak
180*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
181*922aade7SSzymon Olewniczak        $form->addDropdown('predicate[operator]', $this->operators);
182*922aade7SSzymon Olewniczak        $form->addTagClose('td');
183*922aade7SSzymon Olewniczak
184*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
185*922aade7SSzymon Olewniczak        $form->addTextInput('predicate[days]');
186*922aade7SSzymon Olewniczak        $form->addTagClose('td');
187*922aade7SSzymon Olewniczak
188*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
189*922aade7SSzymon Olewniczak        $form->addTextInput('predicate[users_and_groups]');
190*922aade7SSzymon Olewniczak        $form->addTagClose('td');
191*922aade7SSzymon Olewniczak
192*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
193*922aade7SSzymon Olewniczak        $form->addTextarea('predicate[message]');
194*922aade7SSzymon Olewniczak        $form->addTagClose('td');
195*922aade7SSzymon Olewniczak
196*922aade7SSzymon Olewniczak        $form->addTagOpen('td');
197*922aade7SSzymon Olewniczak        $form->addButton('action', $this->getLang($action))->val($action);
198*922aade7SSzymon Olewniczak        $link = wl(
199*922aade7SSzymon Olewniczak            $ID, [
200*922aade7SSzymon Olewniczak                'do' => 'admin',
201*922aade7SSzymon Olewniczak                'page' => 'structnotification',
202*922aade7SSzymon Olewniczak            ]
203*922aade7SSzymon Olewniczak        );
204*922aade7SSzymon Olewniczak        $cancel_link = '<a href="' . $link . '" style="margin-left:1em" id="plugin__structnotification_cancel">' . $this->getLang('cancel') . '</a>';
205*922aade7SSzymon Olewniczak        $form->addHTML($cancel_link);
206*922aade7SSzymon Olewniczak        $form->addTagClose('td');
207*922aade7SSzymon Olewniczak
208*922aade7SSzymon Olewniczak
209*922aade7SSzymon Olewniczak        $form->addTagClose('tr');
210*922aade7SSzymon Olewniczak
211*922aade7SSzymon Olewniczak        return $form->toHTML();
212*922aade7SSzymon Olewniczak    }
213*922aade7SSzymon Olewniczak
214*922aade7SSzymon Olewniczak    protected function validate($predicate)
215*922aade7SSzymon Olewniczak    {
216*922aade7SSzymon Olewniczak        $errors = [];
217*922aade7SSzymon Olewniczak        if (blank($predicate['schema'])) {
218*922aade7SSzymon Olewniczak            $errors[] = 'val schema blank';
219*922aade7SSzymon Olewniczak        }
220*922aade7SSzymon Olewniczak
221*922aade7SSzymon Olewniczak        if (blank($predicate['field'])) {
222*922aade7SSzymon Olewniczak            $errors[] = 'val field blank';
223*922aade7SSzymon Olewniczak        }
224*922aade7SSzymon Olewniczak
225*922aade7SSzymon Olewniczak        if (blank($predicate['operator'])) {
226*922aade7SSzymon Olewniczak            $errors[] = 'val operator blank';
227*922aade7SSzymon Olewniczak        }
228*922aade7SSzymon Olewniczak
229*922aade7SSzymon Olewniczak        if (blank($predicate['days'])) {
230*922aade7SSzymon Olewniczak            $errors[] = 'val days blank';
231*922aade7SSzymon Olewniczak        }
232*922aade7SSzymon Olewniczak
233*922aade7SSzymon Olewniczak        if (!preg_match('/^[0-9]*$/', $predicate['days'])) {
234*922aade7SSzymon Olewniczak            $errors[] = 'val days integer';
235*922aade7SSzymon Olewniczak        }
236*922aade7SSzymon Olewniczak
237*922aade7SSzymon Olewniczak        if (blank($predicate['users_and_groups'])) {
238*922aade7SSzymon Olewniczak            $errors[] = 'val users_and_groups blank';
239*922aade7SSzymon Olewniczak        }
240*922aade7SSzymon Olewniczak
241*922aade7SSzymon Olewniczak        if (blank($predicate['message'])) {
242*922aade7SSzymon Olewniczak            $errors[] = 'val message blank';
243*922aade7SSzymon Olewniczak        }
244*922aade7SSzymon Olewniczak
245*922aade7SSzymon Olewniczak        return $errors;
246*922aade7SSzymon Olewniczak    }
247*922aade7SSzymon Olewniczak
248*922aade7SSzymon Olewniczak    protected function display_errors($errors) {
249*922aade7SSzymon Olewniczak        foreach ($errors as $error) {
250*922aade7SSzymon Olewniczak            $msg = $this->getLang($error);
251*922aade7SSzymon Olewniczak            if (!$msg) $msg = $error;
252*922aade7SSzymon Olewniczak            msg($error, -1);
253*922aade7SSzymon Olewniczak        }
254a1f4c7baSSzymon Olewniczak    }
255a1f4c7baSSzymon Olewniczak}
256a1f4c7baSSzymon Olewniczak
257