*/
class admin_plugin_structnotification extends AdminPlugin
{
protected $headers = ['schema', 'field', 'operator', 'value', 'filters', '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->displayErrors($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->displayErrors($errors);
return;
}
$set = implode(',', array_map(static fn($header) => "$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, ['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;
}
echo '
' . $this->getLang('menu') . '
';
echo '';
echo $this->locale_xhtml('intro');
echo '';
foreach ($this->headers as $header) {
echo '' . $this->getLang('admin header ' . $header) . ' | ';
}
echo ' | ';
echo '
';
$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);
}
echo $this->form('update');
continue;
}
echo '';
foreach ($this->headers as $header) {
$value = $predicate[$header];
if ($header == 'message') {
$html = p_render('xhtml', p_get_instructions($value), $info);
echo '' . $html . ' | ';
} else {
echo '' . $value . ' | ';
}
}
echo '';
$link = wl(
$ID,
['do' => 'admin', 'page' => 'structnotification', 'edit' => $predicate['id']]
);
echo '' . $this->getLang('edit') . ' | ';
$link = wl(
$ID,
[
'do' => 'admin',
'page' => 'structnotification',
'action' => 'delete',
'sectok' => getSecurityToken(),
'predicate[id]' => $predicate['id']
]
);
echo '' .
$this->getLang('delete') . '';
echo ' | ';
echo '
';
}
if (!$INPUT->has('edit')) {
echo $this->form();
}
echo '
';
}
protected function form($action = 'add')
{
global $ID;
$form = new Form();
$form->addTagOpen('tr');
$form->addTagOpen('td');
$form->addTextInput('predicate[schema]')->attr('size', 10);
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addTextInput('predicate[field]')->attr('size', 10);
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addDropdown('predicate[operator]', $this->operators);
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addTextInput('predicate[value]')->attr('size', 10);
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addTextarea('predicate[filters]')
->attrs([
'cols' => '12',
'rows' => '5'
]);
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addTextInput('predicate[users_and_groups]')->attr('size', 10);
$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 displayErrors($errors)
{
foreach ($errors as $error) {
$msg = $this->getLang($error);
if (!$msg) $msg = $error;
msg($error, -1);
}
}
}