1a1f4c7baSSzymon Olewniczak<?php 222ceb3ecSAnna Dabrowska 322ceb3ecSAnna Dabrowskause dokuwiki\Extension\AdminPlugin; 422ceb3ecSAnna Dabrowskause dokuwiki\Form\Form; 522ceb3ecSAnna 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 */ 1222ceb3ecSAnna 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) { 5522ceb3ecSAnna 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) { 6622ceb3ecSAnna Dabrowska $this->displayErrors($errors); 67922aade7SSzymon Olewniczak return; 68922aade7SSzymon Olewniczak } 69922aade7SSzymon Olewniczak 7022ceb3ecSAnna 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 7622ceb3ecSAnna 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 9722ceb3ecSAnna Dabrowska echo '<h1>' . $this->getLang('menu') . '</h1>'; 98*41fd4d28SAnna Dabrowska echo '<div class="table"><table>'; 99922aade7SSzymon Olewniczak 10022ceb3ecSAnna Dabrowska echo '<tr>'; 101922aade7SSzymon Olewniczak foreach ($this->headers as $header) { 10222ceb3ecSAnna Dabrowska echo '<th>' . $this->getLang('admin header ' . $header) . '</th>'; 103922aade7SSzymon Olewniczak } 10422ceb3ecSAnna Dabrowska echo '<th></th>'; 10522ceb3ecSAnna 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 11822ceb3ecSAnna Dabrowska echo $this->form('update'); 119922aade7SSzymon Olewniczak continue; 120922aade7SSzymon Olewniczak } 121922aade7SSzymon Olewniczak 12222ceb3ecSAnna 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); 12722ceb3ecSAnna Dabrowska echo '<td>' . $html . '</td>'; 128ac63f65fSSzymon Olewniczak } else { 12922ceb3ecSAnna Dabrowska echo '<td>' . $value . '</td>'; 130ac63f65fSSzymon Olewniczak } 131922aade7SSzymon Olewniczak } 132922aade7SSzymon Olewniczak 13322ceb3ecSAnna Dabrowska echo '<td>'; 134922aade7SSzymon Olewniczak $link = wl( 13522ceb3ecSAnna Dabrowska $ID, 13622ceb3ecSAnna Dabrowska ['do' => 'admin', 'page' => 'structnotification', 'edit' => $predicate['id']] 137922aade7SSzymon Olewniczak ); 13822ceb3ecSAnna Dabrowska echo '<a href="' . $link . '">' . $this->getLang('edit') . '</a> | '; 139922aade7SSzymon Olewniczak 140922aade7SSzymon Olewniczak $link = wl( 14122ceb3ecSAnna Dabrowska $ID, 14222ceb3ecSAnna Dabrowska [ 143922aade7SSzymon Olewniczak 'do' => 'admin', 144922aade7SSzymon Olewniczak 'page' => 'structnotification', 145922aade7SSzymon Olewniczak 'action' => 'delete', 146922aade7SSzymon Olewniczak 'sectok' => getSecurityToken(), 147922aade7SSzymon Olewniczak 'predicate[id]' => $predicate['id'] 14822ceb3ecSAnna Dabrowska ] 149922aade7SSzymon Olewniczak ); 15022ceb3ecSAnna Dabrowska echo '<a class="plugin__structnotification_delete" href="' . $link . '">' . 15122ceb3ecSAnna Dabrowska $this->getLang('delete') . '</a>'; 152922aade7SSzymon Olewniczak 15322ceb3ecSAnna Dabrowska echo '</td>'; 15422ceb3ecSAnna Dabrowska echo '</tr>'; 155922aade7SSzymon Olewniczak } 156922aade7SSzymon Olewniczak if (!$INPUT->has('edit')) { 15722ceb3ecSAnna Dabrowska echo $this->form(); 158922aade7SSzymon Olewniczak } 159*41fd4d28SAnna Dabrowska echo '</table></div>'; 160922aade7SSzymon Olewniczak } 161922aade7SSzymon Olewniczak 162922aade7SSzymon Olewniczak protected function form($action = 'add') 163922aade7SSzymon Olewniczak { 164922aade7SSzymon Olewniczak global $ID; 165922aade7SSzymon Olewniczak 16622ceb3ecSAnna Dabrowska $form = new Form(); 167922aade7SSzymon Olewniczak $form->addTagOpen('tr'); 168922aade7SSzymon Olewniczak 169922aade7SSzymon Olewniczak $form->addTagOpen('td'); 170*41fd4d28SAnna Dabrowska $form->addTextInput('predicate[schema]')->attr('size', 10); 171922aade7SSzymon Olewniczak $form->addTagClose('td'); 172922aade7SSzymon Olewniczak 173922aade7SSzymon Olewniczak $form->addTagOpen('td'); 174*41fd4d28SAnna Dabrowska $form->addTextInput('predicate[field]')->attr('size', 10); 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'); 182*41fd4d28SAnna Dabrowska $form->addTextInput('predicate[value]')->attr('size', 10); 183922aade7SSzymon Olewniczak $form->addTagClose('td'); 184922aade7SSzymon Olewniczak 185922aade7SSzymon Olewniczak $form->addTagOpen('td'); 186*41fd4d28SAnna Dabrowska $form->addTextarea('predicate[filters]') 187*41fd4d28SAnna Dabrowska ->attrs([ 188*41fd4d28SAnna Dabrowska 'cols' => '12', 189*41fd4d28SAnna Dabrowska 'rows' => '5' 190*41fd4d28SAnna Dabrowska ]); 191e96b00ceSAnna Dabrowska $form->addTagClose('td'); 192e96b00ceSAnna Dabrowska 193e96b00ceSAnna Dabrowska $form->addTagOpen('td'); 194*41fd4d28SAnna Dabrowska $form->addTextInput('predicate[users_and_groups]')->attr('size', 10); 195922aade7SSzymon Olewniczak $form->addTagClose('td'); 196922aade7SSzymon Olewniczak 197922aade7SSzymon Olewniczak $form->addTagOpen('td'); 198ac63f65fSSzymon Olewniczak $form->addHTML('<div id="tool__bar"></div>'); 199ac63f65fSSzymon Olewniczak $form->setHiddenField('id', $ID); //for linkwiz 200ac63f65fSSzymon Olewniczak $form->addTextarea('predicate[message]') 201ac63f65fSSzymon Olewniczak ->id('wiki__text') 202ac63f65fSSzymon Olewniczak ->attr('style', 'width: 100%; height: 10em;'); 203922aade7SSzymon Olewniczak $form->addTagClose('td'); 204922aade7SSzymon Olewniczak 205922aade7SSzymon Olewniczak $form->addTagOpen('td'); 206922aade7SSzymon Olewniczak $form->addButton('action', $this->getLang($action))->val($action); 207922aade7SSzymon Olewniczak $link = wl( 20822ceb3ecSAnna Dabrowska $ID, 20922ceb3ecSAnna Dabrowska [ 210922aade7SSzymon Olewniczak 'do' => 'admin', 211922aade7SSzymon Olewniczak 'page' => 'structnotification', 212922aade7SSzymon Olewniczak ] 213922aade7SSzymon Olewniczak ); 21422ceb3ecSAnna Dabrowska $cancel_link = '<a href="' . $link . '" style="margin-left:1em" id="plugin__structnotification_cancel">' . 21522ceb3ecSAnna Dabrowska $this->getLang('cancel') . '</a>'; 216922aade7SSzymon Olewniczak $form->addHTML($cancel_link); 217922aade7SSzymon Olewniczak $form->addTagClose('td'); 218922aade7SSzymon Olewniczak 219922aade7SSzymon Olewniczak 220922aade7SSzymon Olewniczak $form->addTagClose('tr'); 221922aade7SSzymon Olewniczak 222922aade7SSzymon Olewniczak return $form->toHTML(); 223922aade7SSzymon Olewniczak } 224922aade7SSzymon Olewniczak 225922aade7SSzymon Olewniczak protected function validate($predicate) 226922aade7SSzymon Olewniczak { 227922aade7SSzymon Olewniczak $errors = []; 228922aade7SSzymon Olewniczak if (blank($predicate['schema'])) { 229922aade7SSzymon Olewniczak $errors[] = 'val schema blank'; 230922aade7SSzymon Olewniczak } 231922aade7SSzymon Olewniczak 232922aade7SSzymon Olewniczak if (blank($predicate['field'])) { 233922aade7SSzymon Olewniczak $errors[] = 'val field blank'; 234922aade7SSzymon Olewniczak } 235922aade7SSzymon Olewniczak 236922aade7SSzymon Olewniczak if (blank($predicate['operator'])) { 237922aade7SSzymon Olewniczak $errors[] = 'val operator blank'; 238922aade7SSzymon Olewniczak } 239922aade7SSzymon Olewniczak 2404677fc3cSSzymon Olewniczak if (blank($predicate['value'])) { 2414677fc3cSSzymon Olewniczak $errors[] = 'val value blank'; 242922aade7SSzymon Olewniczak } 243922aade7SSzymon Olewniczak 244922aade7SSzymon Olewniczak if (blank($predicate['users_and_groups'])) { 245922aade7SSzymon Olewniczak $errors[] = 'val users_and_groups blank'; 246922aade7SSzymon Olewniczak } 247922aade7SSzymon Olewniczak 248922aade7SSzymon Olewniczak if (blank($predicate['message'])) { 249922aade7SSzymon Olewniczak $errors[] = 'val message blank'; 250922aade7SSzymon Olewniczak } 251922aade7SSzymon Olewniczak 252922aade7SSzymon Olewniczak return $errors; 253922aade7SSzymon Olewniczak } 254922aade7SSzymon Olewniczak 25522ceb3ecSAnna Dabrowska protected function displayErrors($errors) 25622ceb3ecSAnna Dabrowska { 257922aade7SSzymon Olewniczak foreach ($errors as $error) { 258922aade7SSzymon Olewniczak $msg = $this->getLang($error); 259922aade7SSzymon Olewniczak if (!$msg) $msg = $error; 260922aade7SSzymon Olewniczak msg($error, -1); 261922aade7SSzymon Olewniczak } 262a1f4c7baSSzymon Olewniczak } 263a1f4c7baSSzymon Olewniczak} 264