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 Olewniczakclass admin_plugin_structnotification extends DokuWiki_Admin_Plugin 10a1f4c7baSSzymon Olewniczak{ 11*e96b00ceSAnna Dabrowska protected $headers = ['schema', 'field', 'operator', 'value', 'filters', 'users_and_groups', 'message']; 124677fc3cSSzymon Olewniczak protected $operators = ['before', 'after', 'at']; 13922aade7SSzymon Olewniczak 14a1f4c7baSSzymon Olewniczak /** 15a1f4c7baSSzymon Olewniczak * @return int sort number in admin menu 16a1f4c7baSSzymon Olewniczak */ 17a1f4c7baSSzymon Olewniczak public function getMenuSort() 18a1f4c7baSSzymon Olewniczak { 19922aade7SSzymon Olewniczak return 499; 20a1f4c7baSSzymon Olewniczak } 21a1f4c7baSSzymon Olewniczak 22a1f4c7baSSzymon Olewniczak /** 23a1f4c7baSSzymon Olewniczak * @return bool true if only access for superuser, false is for superusers and moderators 24a1f4c7baSSzymon Olewniczak */ 25a1f4c7baSSzymon Olewniczak public function forAdminOnly() 26a1f4c7baSSzymon Olewniczak { 27a1f4c7baSSzymon Olewniczak return false; 28a1f4c7baSSzymon Olewniczak } 29a1f4c7baSSzymon Olewniczak 30a1f4c7baSSzymon Olewniczak /** 31a1f4c7baSSzymon Olewniczak * Should carry out any processing required by the plugin. 32a1f4c7baSSzymon Olewniczak */ 33a1f4c7baSSzymon Olewniczak public function handle() 34a1f4c7baSSzymon Olewniczak { 35922aade7SSzymon Olewniczak global $INPUT; 36922aade7SSzymon Olewniczak global $ID; 37a1f4c7baSSzymon Olewniczak 38922aade7SSzymon Olewniczak try { 39922aade7SSzymon Olewniczak /** @var \helper_plugin_structnotification_db$db_helper */ 40922aade7SSzymon Olewniczak $db_helper = plugin_load('helper', 'structnotification_db'); 41922aade7SSzymon Olewniczak $sqlite = $db_helper->getDB(); 42922aade7SSzymon Olewniczak } catch (Exception $e) { 43922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 44922aade7SSzymon Olewniczak return; 45922aade7SSzymon Olewniczak } 46922aade7SSzymon Olewniczak 47922aade7SSzymon Olewniczak if ($INPUT->str('action') && $INPUT->arr('predicate') && checkSecurityToken()) { 48922aade7SSzymon Olewniczak $predicate = $INPUT->arr('predicate'); 49922aade7SSzymon Olewniczak if ($INPUT->str('action') === 'add') { 50922aade7SSzymon Olewniczak $errors = $this->validate($predicate); 51922aade7SSzymon Olewniczak if ($errors) { 52922aade7SSzymon Olewniczak $this->display_errors($errors); 53922aade7SSzymon Olewniczak return; 54922aade7SSzymon Olewniczak } 55922aade7SSzymon Olewniczak $ok = $sqlite->storeEntry('predicate', $predicate); 56922aade7SSzymon Olewniczak if(!$ok) msg('failed to add predicate', -1); 57922aade7SSzymon Olewniczak } elseif($INPUT->str('action') === 'delete') { 58922aade7SSzymon Olewniczak $ok = $sqlite->query('DELETE FROM predicate WHERE id=?', $predicate['id']); 59922aade7SSzymon Olewniczak if(!$ok) msg('failed to delete predicate', -1); 60922aade7SSzymon Olewniczak } elseif($INPUT->str('action') === 'update') { 61922aade7SSzymon Olewniczak $errors = $this->validate($predicate); 62922aade7SSzymon Olewniczak if ($errors) { 63922aade7SSzymon Olewniczak $this->display_errors($errors); 64922aade7SSzymon Olewniczak return; 65922aade7SSzymon Olewniczak } 66922aade7SSzymon Olewniczak 67922aade7SSzymon Olewniczak $set = implode(',', array_map(function ($header) { 68922aade7SSzymon Olewniczak return "$header=?"; 69922aade7SSzymon Olewniczak }, $this->headers)); 70922aade7SSzymon Olewniczak $predicate['id'] = $INPUT->str('edit'); 71922aade7SSzymon Olewniczak $ok = $sqlite->query("UPDATE predicate SET $set WHERE id=?", $predicate); 72922aade7SSzymon Olewniczak if(!$ok) msg('failed to update predicate', -1); 73922aade7SSzymon Olewniczak } 74922aade7SSzymon Olewniczak 75922aade7SSzymon Olewniczak if ($ok) send_redirect(wl($ID, array('do' => 'admin', 'page' => 'structnotification'), true, '&')); 76922aade7SSzymon Olewniczak } 77a1f4c7baSSzymon Olewniczak } 78a1f4c7baSSzymon Olewniczak 79a1f4c7baSSzymon Olewniczak /** 80a1f4c7baSSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 81a1f4c7baSSzymon Olewniczak */ 82a1f4c7baSSzymon Olewniczak public function html() 83a1f4c7baSSzymon Olewniczak { 84922aade7SSzymon Olewniczak global $INPUT; 85922aade7SSzymon Olewniczak global $ID; 86922aade7SSzymon Olewniczak 87922aade7SSzymon Olewniczak try { 88922aade7SSzymon Olewniczak /** @var \helper_plugin_structnotification_db$db_helper */ 89922aade7SSzymon Olewniczak $db_helper = plugin_load('helper', 'structnotification_db'); 90922aade7SSzymon Olewniczak $sqlite = $db_helper->getDB(); 91922aade7SSzymon Olewniczak } catch (Exception $e) { 92922aade7SSzymon Olewniczak msg($e->getMessage(), -1); 93922aade7SSzymon Olewniczak return; 94922aade7SSzymon Olewniczak } 95922aade7SSzymon Olewniczak 96a1f4c7baSSzymon Olewniczak ptln('<h1>' . $this->getLang('menu') . '</h1>'); 97922aade7SSzymon Olewniczak ptln('<table>'); 98922aade7SSzymon Olewniczak 99922aade7SSzymon Olewniczak ptln('<tr>'); 100922aade7SSzymon Olewniczak foreach ($this->headers as $header) { 101922aade7SSzymon Olewniczak ptln('<th>' . $this->getLang('admin header '. $header) . '</th>'); 102922aade7SSzymon Olewniczak } 103922aade7SSzymon Olewniczak //extra field for buttons 104922aade7SSzymon Olewniczak ptln('<th></th>'); 105922aade7SSzymon Olewniczak ptln('</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 118922aade7SSzymon Olewniczak ptln($this->form('update')); 119922aade7SSzymon Olewniczak continue; 120922aade7SSzymon Olewniczak } 121922aade7SSzymon Olewniczak 122922aade7SSzymon Olewniczak ptln('<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); 127ac63f65fSSzymon Olewniczak ptln('<td>' . $html . '</td>'); 128ac63f65fSSzymon Olewniczak } else { 129ac63f65fSSzymon Olewniczak ptln('<td>' . $value . '</td>'); 130ac63f65fSSzymon Olewniczak } 131922aade7SSzymon Olewniczak } 132922aade7SSzymon Olewniczak 133922aade7SSzymon Olewniczak ptln('<td>'); 134922aade7SSzymon Olewniczak $link = wl( 135922aade7SSzymon Olewniczak $ID, array( 136922aade7SSzymon Olewniczak 'do' => 'admin', 137922aade7SSzymon Olewniczak 'page' => 'structnotification', 138922aade7SSzymon Olewniczak 'edit' => $predicate['id'] 139922aade7SSzymon Olewniczak ) 140922aade7SSzymon Olewniczak ); 141922aade7SSzymon Olewniczak ptln('<a href="' . $link . '">'.$this->getLang('edit').'</a> | '); 142922aade7SSzymon Olewniczak 143922aade7SSzymon Olewniczak $link = wl( 144922aade7SSzymon Olewniczak $ID, array( 145922aade7SSzymon Olewniczak 'do' => 'admin', 146922aade7SSzymon Olewniczak 'page' => 'structnotification', 147922aade7SSzymon Olewniczak 'action' => 'delete', 148922aade7SSzymon Olewniczak 'sectok' => getSecurityToken(), 149922aade7SSzymon Olewniczak 'predicate[id]' => $predicate['id'] 150922aade7SSzymon Olewniczak ) 151922aade7SSzymon Olewniczak ); 152922aade7SSzymon Olewniczak ptln('<a class="plugin__structnotification_delete" href="' . $link . '">'.$this->getLang('delete').'</a>'); 153922aade7SSzymon Olewniczak 154922aade7SSzymon Olewniczak ptln('</td>'); 155922aade7SSzymon Olewniczak ptln('</tr>'); 156922aade7SSzymon Olewniczak } 157922aade7SSzymon Olewniczak if (!$INPUT->has('edit')) { 158922aade7SSzymon Olewniczak ptln($this->form()); 159922aade7SSzymon Olewniczak } 160922aade7SSzymon Olewniczak ptln('</table>'); 161922aade7SSzymon Olewniczak } 162922aade7SSzymon Olewniczak 163922aade7SSzymon Olewniczak protected function form($action='add') 164922aade7SSzymon Olewniczak { 165922aade7SSzymon Olewniczak global $ID; 166922aade7SSzymon Olewniczak 167922aade7SSzymon Olewniczak $form = new dokuwiki\Form\Form(); 168922aade7SSzymon Olewniczak $form->addTagOpen('tr'); 169922aade7SSzymon Olewniczak 170922aade7SSzymon Olewniczak $form->addTagOpen('td'); 171ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[schema]')->attr('style', 'width: 8em'); 172922aade7SSzymon Olewniczak $form->addTagClose('td'); 173922aade7SSzymon Olewniczak 174922aade7SSzymon Olewniczak $form->addTagOpen('td'); 175ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[field]')->attr('style', 'width: 8em'); 176922aade7SSzymon Olewniczak $form->addTagClose('td'); 177922aade7SSzymon Olewniczak 178922aade7SSzymon Olewniczak $form->addTagOpen('td'); 179922aade7SSzymon Olewniczak $form->addDropdown('predicate[operator]', $this->operators); 180922aade7SSzymon Olewniczak $form->addTagClose('td'); 181922aade7SSzymon Olewniczak 182922aade7SSzymon Olewniczak $form->addTagOpen('td'); 1834677fc3cSSzymon Olewniczak $form->addTextInput('predicate[value]')->attr('style', 'width: 12em'); 184922aade7SSzymon Olewniczak $form->addTagClose('td'); 185922aade7SSzymon Olewniczak 186922aade7SSzymon Olewniczak $form->addTagOpen('td'); 187*e96b00ceSAnna Dabrowska $form->addTextarea('predicate[filters]')->attr('style', 'width: 12em; height: 5em;'); 188*e96b00ceSAnna Dabrowska $form->addTagClose('td'); 189*e96b00ceSAnna Dabrowska 190*e96b00ceSAnna Dabrowska $form->addTagOpen('td'); 191ac63f65fSSzymon Olewniczak $form->addTextInput('predicate[users_and_groups]')->attr('style', 'width: 12em'); 192922aade7SSzymon Olewniczak $form->addTagClose('td'); 193922aade7SSzymon Olewniczak 194922aade7SSzymon Olewniczak $form->addTagOpen('td'); 195ac63f65fSSzymon Olewniczak $form->addHTML('<div id="tool__bar"></div>'); 196ac63f65fSSzymon Olewniczak $form->setHiddenField('id', $ID); //for linkwiz 197ac63f65fSSzymon Olewniczak $form->addTextarea('predicate[message]') 198ac63f65fSSzymon Olewniczak ->id('wiki__text') 199ac63f65fSSzymon Olewniczak ->attr('style', 'width: 100%; height: 10em;'); 200922aade7SSzymon Olewniczak $form->addTagClose('td'); 201922aade7SSzymon Olewniczak 202922aade7SSzymon Olewniczak $form->addTagOpen('td'); 203922aade7SSzymon Olewniczak $form->addButton('action', $this->getLang($action))->val($action); 204922aade7SSzymon Olewniczak $link = wl( 205922aade7SSzymon Olewniczak $ID, [ 206922aade7SSzymon Olewniczak 'do' => 'admin', 207922aade7SSzymon Olewniczak 'page' => 'structnotification', 208922aade7SSzymon Olewniczak ] 209922aade7SSzymon Olewniczak ); 210922aade7SSzymon Olewniczak $cancel_link = '<a href="' . $link . '" style="margin-left:1em" id="plugin__structnotification_cancel">' . $this->getLang('cancel') . '</a>'; 211922aade7SSzymon Olewniczak $form->addHTML($cancel_link); 212922aade7SSzymon Olewniczak $form->addTagClose('td'); 213922aade7SSzymon Olewniczak 214922aade7SSzymon Olewniczak 215922aade7SSzymon Olewniczak $form->addTagClose('tr'); 216922aade7SSzymon Olewniczak 217922aade7SSzymon Olewniczak return $form->toHTML(); 218922aade7SSzymon Olewniczak } 219922aade7SSzymon Olewniczak 220922aade7SSzymon Olewniczak protected function validate($predicate) 221922aade7SSzymon Olewniczak { 222922aade7SSzymon Olewniczak $errors = []; 223922aade7SSzymon Olewniczak if (blank($predicate['schema'])) { 224922aade7SSzymon Olewniczak $errors[] = 'val schema blank'; 225922aade7SSzymon Olewniczak } 226922aade7SSzymon Olewniczak 227922aade7SSzymon Olewniczak if (blank($predicate['field'])) { 228922aade7SSzymon Olewniczak $errors[] = 'val field blank'; 229922aade7SSzymon Olewniczak } 230922aade7SSzymon Olewniczak 231922aade7SSzymon Olewniczak if (blank($predicate['operator'])) { 232922aade7SSzymon Olewniczak $errors[] = 'val operator blank'; 233922aade7SSzymon Olewniczak } 234922aade7SSzymon Olewniczak 2354677fc3cSSzymon Olewniczak if (blank($predicate['value'])) { 2364677fc3cSSzymon Olewniczak $errors[] = 'val value blank'; 237922aade7SSzymon Olewniczak } 238922aade7SSzymon Olewniczak 239922aade7SSzymon Olewniczak if (blank($predicate['users_and_groups'])) { 240922aade7SSzymon Olewniczak $errors[] = 'val users_and_groups blank'; 241922aade7SSzymon Olewniczak } 242922aade7SSzymon Olewniczak 243922aade7SSzymon Olewniczak if (blank($predicate['message'])) { 244922aade7SSzymon Olewniczak $errors[] = 'val message blank'; 245922aade7SSzymon Olewniczak } 246922aade7SSzymon Olewniczak 247922aade7SSzymon Olewniczak return $errors; 248922aade7SSzymon Olewniczak } 249922aade7SSzymon Olewniczak 250922aade7SSzymon Olewniczak protected function display_errors($errors) { 251922aade7SSzymon Olewniczak foreach ($errors as $error) { 252922aade7SSzymon Olewniczak $msg = $this->getLang($error); 253922aade7SSzymon Olewniczak if (!$msg) $msg = $error; 254922aade7SSzymon Olewniczak msg($error, -1); 255922aade7SSzymon Olewniczak } 256a1f4c7baSSzymon Olewniczak } 257a1f4c7baSSzymon Olewniczak} 258a1f4c7baSSzymon Olewniczak 259