<?php
/**
* @package Dotclear
* @subpackage Backend
*
* @copyright Olivier Meunier & Association Dotclear
* @copyright GPL-2.0-only
*/
if (!defined('DC_RC_PATH')) {
return;
}
/**
* dcNotices -- Backend notices handling facilities
*/
class dcNotices
{
/** @var dcCore dotclear core instance */
protected $core;
protected $table_name = 'notice';
protected $table;
/**
* Class constructor
*
* @param mixed $core dotclear core
*
* @access public
*
* @return mixed Value.
*/
public function __construct($core)
{
$this->core = &$core;
$this->table = $core->prefix . $this->table_name;
}
public function getTable()
{
return $this->table_name;
}
/* Get notices */
public function getNotices($params = [], $count_only = false)
{
$sql = new dcSelectStatement($this->core, 'dcNoticesGetNotices');
$sql
->from($this->table);
// Return a recordset of notices
if ($count_only) {
$sql->column($sql->count('notice_id'));
} else {
$sql->columns([
'notice_id',
'ses_id',
'notice_type',
'notice_ts',
'notice_msg',
'notice_format',
'notice_options',
]);
}
$session_id = isset($params['ses_id']) && $params['ses_id'] !== '' ? (string) $params['ses_id'] : (string) session_id();
$sql->where('ses_id = ' . $sql->quote($session_id));
if (isset($params['notice_id']) && $params['notice_id'] !== '') {
if (is_array($params['notice_id'])) {
array_walk($params['notice_id'], function (&$v, $k) { if ($v !== null) {$v = (int) $v;}});
} else {
$params['notice_id'] = [(int) $params['notice_id']];
}
$sql->and('notice_id' . $sql->in($params['notice_id']));
}
if (!empty($params['notice_type'])) {
$sql->and('notice_type' . $sql->in($params['notice_type']));
}
if (!empty($params['notice_format'])) {
$sql->and('notice_format' . $sql->in($params['notice_format']));
}
if (!empty($params['sql'])) {
$sql->sql($params['sql']);
}
if (!$count_only) {
if (!empty($params['order'])) {
$sql->order($sql->escape($params['order']));
} else {
$sql->order('notice_ts DESC');
}
}
if (!empty($params['limit'])) {
$sql->limit($params['limit']);
}
$rs = $sql->select();
return $rs;
}
public function addNotice($cur)
{
$this->core->con->writeLock($this->table);
try {
# Get ID
$sql = new dcSelectStatement($this->core, 'dcNoticesAddNotice');
$sql
->column($sql->max('notice_id'))
->from($this->table);
$rs = $sql->select();
$cur->notice_id = (int) $rs->f(0) + 1;
$cur->ses_id = (string) session_id();
$this->getNoticeCursor($cur, $cur->notice_id);
# --BEHAVIOR-- coreBeforeNoticeCreate
$this->core->callBehavior('coreBeforeNoticeCreate', $this, $cur);
$cur->insert();
$this->core->con->unlock();
} catch (Exception $e) {
$this->core->con->unlock();
throw $e;
}
# --BEHAVIOR-- coreAfterNoticeCreate
$this->core->callBehavior('coreAfterNoticeCreate', $this, $cur);
return $cur->notice_id;
}
public function delNotices($id, $all = false)
{
$sql = new dcDeleteStatement($this->core, 'dcNoticesDelNotices');
$sql
->from($this->table);
if ($all) {
$sql->where('ses_id = ' . $sql->quote((string) session_id()));
} else {
$sql->where('notice_id' . $sql->in($id));
}
$sql->delete();
}
private function getNoticeCursor($cur, $notice_id = null)
{
if ($cur->notice_msg === '') {
throw new Exception(__('No notice message'));
}
if ($cur->notice_ts === '' || $cur->notice_ts === null) {
$cur->notice_ts = date('Y-m-d H:i:s');
}
if ($cur->notice_format === '' || $cur->notice_format === null) {
$cur->notice_format = 'text';
}
$notice_id = is_int($notice_id) ? $notice_id : $cur->notice_id;
}
}