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 17922aade7SSzymon Olewniczak protected $headers = ['schema', 'field', 'operator', 'days', 'users_and_groups', 'message']; 18922aade7SSzymon Olewniczak protected $operators = ['before', 'after']; 19922aade7SSzymon Olewniczak 20a1f4c7baSSzymon Olewniczak /** 21a1f4c7baSSzymon Olewniczak * @return int sort number in admin menu 22a1f4c7baSSzymon Olewniczak */ 23a1f4c7baSSzymon Olewniczak public function getMenuSort() 24a1f4c7baSSzymon Olewniczak { 25922aade7SSzymon 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 { 41922aade7SSzymon Olewniczak global $INPUT; 42922aade7SSzymon Olewniczak global $ID; 43a1f4c7baSSzymon Olewniczak 44922aade7SSzymon Olewniczak try { 45922aade7SSzymon Olewniczak /** @var \helper_plugin_structnotification_db$db_helper */ 46922aade7SSzymon Olewniczak $db_helper = plugin_load('helper', 'structnotification_db'); 47922aade7SSzymon Olewniczak $sqlite = $db_helper->getDB(); 48922aade7SSzymon Olewniczak } catch (Exception $e) { 49922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 50922aade7SSzymon Olewniczak return; 51922aade7SSzymon Olewniczak } 52922aade7SSzymon Olewniczak 53922aade7SSzymon Olewniczak 54922aade7SSzymon Olewniczak if ($INPUT->str('action') && $INPUT->arr('predicate') && checkSecurityToken()) { 55922aade7SSzymon Olewniczak $predicate = $INPUT->arr('predicate'); 56922aade7SSzymon Olewniczak if ($INPUT->str('action') === 'add') { 57922aade7SSzymon Olewniczak $errors = $this->validate($predicate); 58922aade7SSzymon Olewniczak if ($errors) { 59922aade7SSzymon Olewniczak $this->display_errors($errors); 60922aade7SSzymon Olewniczak return; 61922aade7SSzymon Olewniczak } 62922aade7SSzymon Olewniczak $ok = $sqlite->storeEntry('predicate', $predicate); 63922aade7SSzymon Olewniczak if(!$ok) msg('failed to add predicate', -1); 64922aade7SSzymon Olewniczak } elseif($INPUT->str('action') === 'delete') { 65922aade7SSzymon Olewniczak $ok = $sqlite->query('DELETE FROM predicate WHERE id=?', $predicate['id']); 66922aade7SSzymon Olewniczak if(!$ok) msg('failed to delete predicate', -1); 67922aade7SSzymon Olewniczak } elseif($INPUT->str('action') === 'update') { 68922aade7SSzymon Olewniczak $errors = $this->validate($predicate); 69922aade7SSzymon Olewniczak if ($errors) { 70922aade7SSzymon Olewniczak $this->display_errors($errors); 71922aade7SSzymon Olewniczak return; 72922aade7SSzymon Olewniczak } 73922aade7SSzymon Olewniczak 74922aade7SSzymon Olewniczak $set = implode(',', array_map(function ($header) { 75922aade7SSzymon Olewniczak return "$header=?"; 76922aade7SSzymon Olewniczak }, $this->headers)); 77922aade7SSzymon Olewniczak $predicate['id'] = $INPUT->str('edit'); 78922aade7SSzymon Olewniczak $ok = $sqlite->query("UPDATE predicate SET $set WHERE id=?", $predicate); 79922aade7SSzymon Olewniczak if(!$ok) msg('failed to update predicate', -1); 80922aade7SSzymon Olewniczak } 81922aade7SSzymon Olewniczak 82922aade7SSzymon Olewniczak 83922aade7SSzymon Olewniczak if ($ok) send_redirect(wl($ID, array('do' => 'admin', 'page' => 'structnotification'), true, '&')); 84922aade7SSzymon 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 { 92922aade7SSzymon Olewniczak global $INPUT; 93922aade7SSzymon Olewniczak global $ID; 94922aade7SSzymon Olewniczak 95922aade7SSzymon Olewniczak try { 96922aade7SSzymon Olewniczak /** @var \helper_plugin_structnotification_db$db_helper */ 97922aade7SSzymon Olewniczak $db_helper = plugin_load('helper', 'structnotification_db'); 98922aade7SSzymon Olewniczak $sqlite = $db_helper->getDB(); 99922aade7SSzymon Olewniczak } catch (Exception $e) { 100922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 101922aade7SSzymon Olewniczak return; 102922aade7SSzymon Olewniczak } 103922aade7SSzymon Olewniczak 104a1f4c7baSSzymon Olewniczak ptln('<h1>' . $this->getLang('menu') . '</h1>'); 105922aade7SSzymon Olewniczak ptln('<table>'); 106922aade7SSzymon Olewniczak 107922aade7SSzymon Olewniczak ptln('<tr>'); 108922aade7SSzymon Olewniczak foreach ($this->headers as $header) { 109922aade7SSzymon Olewniczak ptln('<th>' . $this->getLang('admin header '. $header) . '</th>'); 110922aade7SSzymon Olewniczak } 111922aade7SSzymon Olewniczak //extra field for buttons 112922aade7SSzymon Olewniczak ptln('<th></th>'); 113922aade7SSzymon Olewniczak ptln('</tr>'); 114922aade7SSzymon Olewniczak 115922aade7SSzymon Olewniczak $q = 'SELECT * FROM predicate'; 116922aade7SSzymon Olewniczak $res = $sqlite->query($q); 117922aade7SSzymon Olewniczak 118922aade7SSzymon Olewniczak $predicates = $sqlite->res2arr($res); 119922aade7SSzymon Olewniczak 120922aade7SSzymon Olewniczak foreach ($predicates as $predicate) { 121922aade7SSzymon Olewniczak if ($INPUT->str('edit') == $predicate['id']) { 122922aade7SSzymon Olewniczak if (!$INPUT->has('predicate')) { 123922aade7SSzymon Olewniczak $INPUT->set('predicate', $predicate); 124922aade7SSzymon Olewniczak } 125922aade7SSzymon Olewniczak 126922aade7SSzymon Olewniczak ptln($this->form('update')); 127922aade7SSzymon Olewniczak continue; 128922aade7SSzymon Olewniczak } 129922aade7SSzymon Olewniczak 130922aade7SSzymon Olewniczak ptln('<tr>'); 131922aade7SSzymon Olewniczak foreach ($this->headers as $header) { 132*ac63f65fSSzymon Olewniczak $value = $predicate[$header]; 133*ac63f65fSSzymon Olewniczak if ($header == 'message') { 134*ac63f65fSSzymon Olewniczak $html = p_render('xhtml',p_get_instructions($value), $info); 135*ac63f65fSSzymon Olewniczak ptln('<td>' . $html . '</td>'); 136*ac63f65fSSzymon Olewniczak } else { 137*ac63f65fSSzymon Olewniczak ptln('<td>' . $value . '</td>'); 138*ac63f65fSSzymon Olewniczak } 139922aade7SSzymon Olewniczak } 140922aade7SSzymon Olewniczak 141922aade7SSzymon Olewniczak ptln('<td>'); 142922aade7SSzymon Olewniczak $link = wl( 143922aade7SSzymon Olewniczak $ID, array( 144922aade7SSzymon Olewniczak 'do' => 'admin', 145922aade7SSzymon Olewniczak 'page' => 'structnotification', 146922aade7SSzymon Olewniczak 'edit' => $predicate['id'] 147922aade7SSzymon Olewniczak ) 148922aade7SSzymon Olewniczak ); 149922aade7SSzymon Olewniczak ptln('<a href="' . $link . '">'.$this->getLang('edit').'</a> | '); 150922aade7SSzymon Olewniczak 151922aade7SSzymon Olewniczak $link = wl( 152922aade7SSzymon Olewniczak $ID, array( 153922aade7SSzymon Olewniczak 'do' => 'admin', 154922aade7SSzymon Olewniczak 'page' => 'structnotification', 155922aade7SSzymon Olewniczak 'action' => 'delete', 156922aade7SSzymon Olewniczak 'sectok' => getSecurityToken(), 157922aade7SSzymon Olewniczak 'predicate[id]' => $predicate['id'] 158922aade7SSzymon Olewniczak ) 159922aade7SSzymon Olewniczak ); 160922aade7SSzymon Olewniczak ptln('<a class="plugin__structnotification_delete" href="' . $link . '">'.$this->getLang('delete').'</a>'); 161922aade7SSzymon Olewniczak 162922aade7SSzymon Olewniczak ptln('</td>'); 163922aade7SSzymon Olewniczak ptln('</tr>'); 164922aade7SSzymon Olewniczak } 165922aade7SSzymon Olewniczak if (!$INPUT->has('edit')) { 166922aade7SSzymon Olewniczak ptln($this->form()); 167922aade7SSzymon Olewniczak } 168922aade7SSzymon Olewniczak ptln('</table>'); 169922aade7SSzymon Olewniczak } 170922aade7SSzymon Olewniczak 171922aade7SSzymon Olewniczak protected function form($action='add') 172922aade7SSzymon Olewniczak { 173922aade7SSzymon Olewniczak global $ID; 174922aade7SSzymon Olewniczak 175922aade7SSzymon Olewniczak $form = new dokuwiki\Form\Form(); 176922aade7SSzymon Olewniczak $form->addTagOpen('tr'); 177922aade7SSzymon Olewniczak 178922aade7SSzymon Olewniczak $form->addTagOpen('td'); 179*ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[schema]')->attr('style', 'width: 8em'); 180922aade7SSzymon Olewniczak $form->addTagClose('td'); 181922aade7SSzymon Olewniczak 182922aade7SSzymon Olewniczak $form->addTagOpen('td'); 183*ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[field]')->attr('style', 'width: 8em'); 184922aade7SSzymon Olewniczak $form->addTagClose('td'); 185922aade7SSzymon Olewniczak 186922aade7SSzymon Olewniczak $form->addTagOpen('td'); 187922aade7SSzymon Olewniczak $form->addDropdown('predicate[operator]', $this->operators); 188922aade7SSzymon Olewniczak $form->addTagClose('td'); 189922aade7SSzymon Olewniczak 190922aade7SSzymon Olewniczak $form->addTagOpen('td'); 191*ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[days]')->attr('style', 'width: 3em'); 192922aade7SSzymon Olewniczak $form->addTagClose('td'); 193922aade7SSzymon Olewniczak 194922aade7SSzymon Olewniczak $form->addTagOpen('td'); 195*ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[users_and_groups]')->attr('style', 'width: 12em'); 196922aade7SSzymon Olewniczak $form->addTagClose('td'); 197922aade7SSzymon Olewniczak 198922aade7SSzymon Olewniczak $form->addTagOpen('td'); 199*ac63f65fSSzymon Olewniczak $form->addHTML('<div id="tool__bar"></div>'); 200*ac63f65fSSzymon Olewniczak $form->setHiddenField('id', $ID); //for linkwiz 201*ac63f65fSSzymon Olewniczak $form->addTextarea('predicate[message]') 202*ac63f65fSSzymon Olewniczak ->id('wiki__text') 203*ac63f65fSSzymon Olewniczak ->attr('style', 'width: 100%; height: 10em;'); 204922aade7SSzymon Olewniczak $form->addTagClose('td'); 205922aade7SSzymon Olewniczak 206922aade7SSzymon Olewniczak $form->addTagOpen('td'); 207922aade7SSzymon Olewniczak $form->addButton('action', $this->getLang($action))->val($action); 208922aade7SSzymon Olewniczak $link = wl( 209922aade7SSzymon Olewniczak $ID, [ 210922aade7SSzymon Olewniczak 'do' => 'admin', 211922aade7SSzymon Olewniczak 'page' => 'structnotification', 212922aade7SSzymon Olewniczak ] 213922aade7SSzymon Olewniczak ); 214922aade7SSzymon Olewniczak $cancel_link = '<a href="' . $link . '" style="margin-left:1em" id="plugin__structnotification_cancel">' . $this->getLang('cancel') . '</a>'; 215922aade7SSzymon Olewniczak $form->addHTML($cancel_link); 216922aade7SSzymon Olewniczak $form->addTagClose('td'); 217922aade7SSzymon Olewniczak 218922aade7SSzymon Olewniczak 219922aade7SSzymon Olewniczak $form->addTagClose('tr'); 220922aade7SSzymon Olewniczak 221922aade7SSzymon Olewniczak return $form->toHTML(); 222922aade7SSzymon Olewniczak } 223922aade7SSzymon Olewniczak 224922aade7SSzymon Olewniczak protected function validate($predicate) 225922aade7SSzymon Olewniczak { 226922aade7SSzymon Olewniczak $errors = []; 227922aade7SSzymon Olewniczak if (blank($predicate['schema'])) { 228922aade7SSzymon Olewniczak $errors[] = 'val schema blank'; 229922aade7SSzymon Olewniczak } 230922aade7SSzymon Olewniczak 231922aade7SSzymon Olewniczak if (blank($predicate['field'])) { 232922aade7SSzymon Olewniczak $errors[] = 'val field blank'; 233922aade7SSzymon Olewniczak } 234922aade7SSzymon Olewniczak 235922aade7SSzymon Olewniczak if (blank($predicate['operator'])) { 236922aade7SSzymon Olewniczak $errors[] = 'val operator blank'; 237922aade7SSzymon Olewniczak } 238922aade7SSzymon Olewniczak 239922aade7SSzymon Olewniczak if (blank($predicate['days'])) { 240922aade7SSzymon Olewniczak $errors[] = 'val days blank'; 241922aade7SSzymon Olewniczak } 242922aade7SSzymon Olewniczak 243922aade7SSzymon Olewniczak if (!preg_match('/^[0-9]*$/', $predicate['days'])) { 244922aade7SSzymon Olewniczak $errors[] = 'val days integer'; 245922aade7SSzymon Olewniczak } 246922aade7SSzymon Olewniczak 247922aade7SSzymon Olewniczak if (blank($predicate['users_and_groups'])) { 248922aade7SSzymon Olewniczak $errors[] = 'val users_and_groups blank'; 249922aade7SSzymon Olewniczak } 250922aade7SSzymon Olewniczak 251922aade7SSzymon Olewniczak if (blank($predicate['message'])) { 252922aade7SSzymon Olewniczak $errors[] = 'val message blank'; 253922aade7SSzymon Olewniczak } 254922aade7SSzymon Olewniczak 255922aade7SSzymon Olewniczak return $errors; 256922aade7SSzymon Olewniczak } 257922aade7SSzymon Olewniczak 258922aade7SSzymon Olewniczak protected function display_errors($errors) { 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} 266a1f4c7baSSzymon Olewniczak 267