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