*/ // must be run within Dokuwiki if (!defined('DOKU_INC')) { die(); } class admin_plugin_structnotification extends DokuWiki_Admin_Plugin { protected $headers = ['schema', 'field', 'operator', 'value', 'users_and_groups', 'message']; protected $operators = ['before', 'after', 'at']; /** * @return int sort number in admin menu */ public function getMenuSort() { return 499; } /** * @return bool true if only access for superuser, false is for superusers and moderators */ public function forAdminOnly() { return false; } /** * Should carry out any processing required by the plugin. */ public function handle() { global $INPUT; global $ID; try { /** @var \helper_plugin_structnotification_db$db_helper */ $db_helper = plugin_load('helper', 'structnotification_db'); $sqlite = $db_helper->getDB(); } catch (Exception $e) { msg($e->getMessage(), -1); return; } if ($INPUT->str('action') && $INPUT->arr('predicate') && checkSecurityToken()) { $predicate = $INPUT->arr('predicate'); if ($INPUT->str('action') === 'add') { $errors = $this->validate($predicate); if ($errors) { $this->display_errors($errors); return; } $ok = $sqlite->storeEntry('predicate', $predicate); if(!$ok) msg('failed to add predicate', -1); } elseif($INPUT->str('action') === 'delete') { $ok = $sqlite->query('DELETE FROM predicate WHERE id=?', $predicate['id']); if(!$ok) msg('failed to delete predicate', -1); } elseif($INPUT->str('action') === 'update') { $errors = $this->validate($predicate); if ($errors) { $this->display_errors($errors); return; } $set = implode(',', array_map(function ($header) { return "$header=?"; }, $this->headers)); $predicate['id'] = $INPUT->str('edit'); $ok = $sqlite->query("UPDATE predicate SET $set WHERE id=?", $predicate); if(!$ok) msg('failed to update predicate', -1); } if ($ok) send_redirect(wl($ID, array('do' => 'admin', 'page' => 'structnotification'), true, '&')); } } /** * Render HTML output, e.g. helpful text and a form */ public function html() { global $INPUT; global $ID; try { /** @var \helper_plugin_structnotification_db$db_helper */ $db_helper = plugin_load('helper', 'structnotification_db'); $sqlite = $db_helper->getDB(); } catch (Exception $e) { msg($e->getMessage(), -1); return; } ptln('

' . $this->getLang('menu') . '

'); ptln(''); ptln(''); foreach ($this->headers as $header) { ptln(''); } //extra field for buttons ptln(''); ptln(''); $q = 'SELECT * FROM predicate'; $res = $sqlite->query($q); $predicates = $sqlite->res2arr($res); foreach ($predicates as $predicate) { if ($INPUT->str('edit') == $predicate['id']) { if (!$INPUT->has('predicate')) { $INPUT->set('predicate', $predicate); } ptln($this->form('update')); continue; } ptln(''); foreach ($this->headers as $header) { $value = $predicate[$header]; if ($header == 'message') { $html = p_render('xhtml',p_get_instructions($value), $info); ptln(''); } else { ptln(''); } } ptln(''); ptln(''); } if (!$INPUT->has('edit')) { ptln($this->form()); } ptln('
' . $this->getLang('admin header '. $header) . '
' . $html . '' . $value . ''); $link = wl( $ID, array( 'do' => 'admin', 'page' => 'structnotification', 'edit' => $predicate['id'] ) ); ptln(''.$this->getLang('edit').' | '); $link = wl( $ID, array( 'do' => 'admin', 'page' => 'structnotification', 'action' => 'delete', 'sectok' => getSecurityToken(), 'predicate[id]' => $predicate['id'] ) ); ptln(''.$this->getLang('delete').''); ptln('
'); } protected function form($action='add') { global $ID; $form = new dokuwiki\Form\Form(); $form->addTagOpen('tr'); $form->addTagOpen('td'); $form->addTextInput('predicate[schema]')->attr('style', 'width: 8em'); $form->addTagClose('td'); $form->addTagOpen('td'); $form->addTextInput('predicate[field]')->attr('style', 'width: 8em'); $form->addTagClose('td'); $form->addTagOpen('td'); $form->addDropdown('predicate[operator]', $this->operators); $form->addTagClose('td'); $form->addTagOpen('td'); $form->addTextInput('predicate[value]')->attr('style', 'width: 12em'); $form->addTagClose('td'); $form->addTagOpen('td'); $form->addTextInput('predicate[users_and_groups]')->attr('style', 'width: 12em'); $form->addTagClose('td'); $form->addTagOpen('td'); $form->addHTML('
'); $form->setHiddenField('id', $ID); //for linkwiz $form->addTextarea('predicate[message]') ->id('wiki__text') ->attr('style', 'width: 100%; height: 10em;'); $form->addTagClose('td'); $form->addTagOpen('td'); $form->addButton('action', $this->getLang($action))->val($action); $link = wl( $ID, [ 'do' => 'admin', 'page' => 'structnotification', ] ); $cancel_link = '' . $this->getLang('cancel') . ''; $form->addHTML($cancel_link); $form->addTagClose('td'); $form->addTagClose('tr'); return $form->toHTML(); } protected function validate($predicate) { $errors = []; if (blank($predicate['schema'])) { $errors[] = 'val schema blank'; } if (blank($predicate['field'])) { $errors[] = 'val field blank'; } if (blank($predicate['operator'])) { $errors[] = 'val operator blank'; } if (blank($predicate['value'])) { $errors[] = 'val value blank'; } if (blank($predicate['users_and_groups'])) { $errors[] = 'val users_and_groups blank'; } if (blank($predicate['message'])) { $errors[] = 'val message blank'; } return $errors; } protected function display_errors($errors) { foreach ($errors as $error) { $msg = $this->getLang($error); if (!$msg) $msg = $error; msg($error, -1); } } }