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