*/
include_once dirname(dirname(__DIR__)) . '/mainfile.php';
$xoops = Xoops::getInstance();
if (!$xoops->isUser()) {
$xoops->redirect(\XoopsBaseConfig::get('url'), 3, XoopsLocale::E_NO_ACCESS_PERMISSION);
}
$xoops->disableModuleCache(); //disable caching since the URL will be the same, but content different from one user to another
$xoops->header('module:pm/pm_viewpmsg.tpl');
$validOpRequests = array('out', 'save', 'in');
$op = Request::getCmd('op', 'in');
$op = in_array($op, $validOpRequests) ? $op : 'in';
$start = empty($_REQUEST["start"]) ? 0 : (int)($_REQUEST["start"]);
/* @var $pm_handler PmMessageHandler */
$pm_handler = $xoops->getModuleHandler('message');
if (isset($_POST['delete_messages']) && (isset($_POST['msg_id']) || isset($_POST['msg_ids']))) {
if (!$xoops->security()->check()) {
$xoops->tpl()->assign('errormsg', implode('
', $xoops->security()->getErrors()));
} else {
if (empty($_REQUEST['ok'])) {
echo $xoops->confirm(array(
'ok' => 1, 'delete_messages' => 1, 'op' => $op,
'msg_ids' => json_encode(array_values(array_map('intval', (array) ($_POST['msg_id'] ?? []))))
), $_SERVER['REQUEST_URI'], XoopsLocale::Q_ARE_YOU_SURE_YOU_WANT_TO_DELETE_THIS_MESSAGES);
$xoops->footer();
} else {
$clean_msg_id = json_decode((string) ($_POST['msg_ids'] ?? ''), true, 2);
$msg = is_array($clean_msg_id) ? array_values(array_map('intval', $clean_msg_id)) : [];
$size = count($msg);
for ($i = 0; $i < $size; ++$i) {
$pm = $pm_handler->get($msg[$i]);
if (is_object($pm)) {
$pm_handler->deleteFromFolder($pm, $xoops->user->getVar('uid'), $op);
}
unset($pm);
}
$xoops->tpl()->assign('msg', XoopsLocale::S_YOUR_MESSAGES_DELETED);
}
}
}
if (isset($_POST['move_messages']) && isset($_POST['msg_id'])) {
if (!$xoops->security()->check()) {
$xoops->tpl()->assign('errormsg', implode('
', $xoops->security()->getErrors()));
} else {
$msg = array_values(array_map('intval', (array) $_POST['msg_id']));
$size = count($msg);
$uid = $xoops->user->getVar('uid');
if ($_POST['op'] === 'save') {
for ($i = 0; $i < $size; ++$i) {
$pm = $pm_handler->get($msg[$i]);
if (!is_object($pm)) {
continue;
}
// a message to yourself can be saved on both sides
if ($pm->getVar('to_userid') == $uid) {
$pm_handler->setTosave($pm, 0);
}
if ($pm->getVar('from_userid') == $uid) {
$pm_handler->setFromsave($pm, 0);
}
unset($pm);
}
} else {
if (!$xoops->user->isAdmin()) {
$total_save = $pm_handler->getSavecount();
$size = min($size, $xoops->getModuleConfig('max_save') - $total_save);
}
for ($i = 0; $i < $size; ++$i) {
$pm = $pm_handler->get($msg[$i]);
if (!is_object($pm)) {
continue;
}
if ($_POST['op'] === 'in' && $pm->getVar('to_userid') == $uid) {
$pm_handler->setTosave($pm);
} elseif ($_POST['op'] === 'out' && $pm->getVar('from_userid') == $uid) {
$pm_handler->setFromsave($pm);
}
unset($pm);
}
}
if ($_POST['op'] === 'save') {
$xoops->tpl()->assign('msg', _PM_UNSAVED);
} else {
if (isset($total_save) && !$xoops->user->isAdmin()) {
$xoops->tpl()->assign('msg', sprintf(_PM_SAVED_PART, $xoops->getModuleConfig('max_save'), $i));
} else {
$xoops->tpl()->assign('msg', _PM_SAVED_ALL);
}
}
}
}
if (isset($_REQUEST['empty_messages'])) {
if (!$xoops->security()->check()) {
$xoops->tpl()->assign('errormsg', implode('
', $xoops->security()->getErrors()));
} else {
if (empty($_REQUEST['ok'])) {
echo $xoops->confirm(array(
'ok' => 1, 'empty_messages' => 1, 'op' => $op
), $_SERVER['REQUEST_URI'], _PM_RUSUREEMPTY);
$xoops->footer();
} else {
if ($_POST['op'] === 'save') {
$crit_to = new CriteriaCompo(new Criteria('to_delete', 0));
$crit_to->add(new Criteria('to_save', 1));
$crit_to->add(new Criteria('to_userid', $xoops->user->getVar('uid')));
$crit_from = new CriteriaCompo(new Criteria('from_delete', 0));
$crit_from->add(new Criteria('from_save', 1));
$crit_from->add(new Criteria('from_userid', $xoops->user->getVar('uid')));
$criteria = new CriteriaCompo($crit_to);
$criteria->add($crit_from, "OR");
} else {
if ($_POST['op'] === 'out') {
$criteria = new CriteriaCompo(new Criteria('from_delete', 0));
$criteria->add(new Criteria('from_userid', $xoops->user->getVar('uid')));
$criteria->add(new Criteria('from_save', 0));
} else {
$criteria = new CriteriaCompo(new Criteria('to_delete', 0));
$criteria->add(new Criteria('to_userid', $xoops->user->getVar('uid')));
$criteria->add(new Criteria('to_save', 0));
}
}
/*
* The following method has critical scalability problem !
* deleteAll method should be used instead
*/
$pms = $pm_handler->getObjects($criteria);
unset($criteria);
if (count($pms) > 0) {
foreach (array_keys($pms) as $i) {
if ($pms[$i]->getVar('to_userid') == $xoops->user->getVar('uid')) {
if ($_POST['op'] === 'save') {
$pm_handler->setTosave($pms[$i], 0);
} else {
if ($_POST['op'] === 'in') {
$pm_handler->setTodelete($pms[$i]);
}
}
}
if ($pms[$i]->getVar('from_userid') == $xoops->user->getVar('uid')) {
if ($_POST['op'] === 'save') {
$pm_handler->setFromsave($pms[$i], 0);
} else {
if ($_POST['op'] === 'out') {
$pm_handler->setFromdelete($pms[$i]);
}
}
}
}
}
$xoops->tpl()->assign('msg', _PM_EMPTIED);
}
}
}
if ($op === "out") {
$criteria = new CriteriaCompo(new Criteria('from_delete', 0));
$criteria->add(new Criteria('from_userid', $xoops->user->getVar('uid')));
$criteria->add(new Criteria('from_save', 0));
} else {
if ($op === "save") {
$crit_to = new CriteriaCompo(new Criteria('to_delete', 0));
$crit_to->add(new Criteria('to_save', 1));
$crit_to->add(new Criteria('to_userid', $xoops->user->getVar('uid')));
$crit_from = new CriteriaCompo(new Criteria('from_delete', 0));
$crit_from->add(new Criteria('from_save', 1));
$crit_from->add(new Criteria('from_userid', $xoops->user->getVar('uid')));
$criteria = new CriteriaCompo($crit_to);
$criteria->add($crit_from, "OR");
} else {
$criteria = new CriteriaCompo(new Criteria('to_delete', 0));
$criteria->add(new Criteria('to_userid', $xoops->user->getVar('uid')));
$criteria->add(new Criteria('to_save', 0));
}
}
$total_messages = $pm_handler->getCount($criteria);
$criteria->setStart($start);
$criteria->setLimit($xoops->getModuleConfig('perpage'));
$criteria->setSort("msg_time");
$criteria->setOrder("DESC");
$pm_arr = $pm_handler->getAll($criteria, null, false, false);
unset($criteria);
$xoops->tpl()->assign('total_messages', $total_messages);
$xoops->tpl()->assign('op', $op);
if ($total_messages > $xoops->getModuleConfig('perpage')) {
$nav = new XoopsPageNav($total_messages, $xoops->getModuleConfig('perpage'), $start, "start", 'op=' . $op);
$xoops->tpl()->assign('pagenav', $nav->renderNav(4));
}
$xoops->tpl()->assign('display', $total_messages > 0);
$xoops->tpl()->assign('anonymous', $xoops->getConfig('anonymous'));
if (count($pm_arr) > 0) {
foreach (array_keys($pm_arr) as $i) {
if ($op === 'out') {
$uids[] = $pm_arr[$i]['to_userid'];
} else {
$uids[] = $pm_arr[$i]['from_userid'];
}
}
$member_handler = $xoops->getHandlerMember();
$senders = $member_handler->getUserList(new Criteria('uid', "(" . implode(", ", array_unique($uids)) . ")", "IN"));
foreach (array_keys($pm_arr) as $i) {
$message = $pm_arr[$i];
//$message['msg_time'] = XoopsLocale::formatTimestamp($message["msg_time"], 'e');
if ($op === "out") {
$message['postername'] = $senders[$pm_arr[$i]['to_userid']];
$message['posteruid'] = $pm_arr[$i]['to_userid'];
} else {
$message['postername'] = $senders[$pm_arr[$i]['from_userid']];
$message['posteruid'] = $pm_arr[$i]['from_userid'];
}
$message['msg_no'] = $i;
$xoops->tpl()->append('messages', $message);
}
}
$send_button = new Xoops\Form\Button('', 'send', XoopsLocale::A_SEND);
$send_button->set(
'onclick',
'openWithSelfMain("' . $xoops->url('modules/pm/pmlite.php?send=1') . '" , "pmlite", 740,640);'
);
$delete_button = new Xoops\Form\Button('', 'delete_messages', XoopsLocale::A_DELETE, 'submit');
$move_button = new Xoops\Form\Button('', 'move_messages', ($op === 'save') ? _PM_UNSAVE
: _PM_TOSAVE, 'submit');
$empty_button = new Xoops\Form\Button('', 'empty_messages', _PM_EMPTY, 'submit');
$pmform = new Xoops\Form\ThemeForm('', 'pmform', 'viewpmsg.php', 'post', true);
$pmform->addElement($send_button);
$pmform->addElement($move_button);
$pmform->addElement($delete_button);
$pmform->addElement($empty_button);
$pmform->addElement(new Xoops\Form\Hidden('op', $op));
$pmform->assign($xoops->tpl());
$bcMenu = new ItemList();
if ($op === 'out') {
$bcMenu->addItem(new Link(['caption' => _PM_OUTBOX, 'icon' => 'glyphicon glyphicon-share']));
} elseif ($op === 'save') {
$bcMenu->addItem(new Link(['caption' => _PM_SAVEBOX, 'icon' => 'glyphicon glyphicon-save']));
} else {
$bcMenu->addItem(new Link(['caption' => XoopsLocale::INBOX, 'icon' => 'glyphicon glyphicon-inbox']));
}
$breadCrumb = new BreadCrumb();
$xoops->tpl()->assign('breadcrumbs', $breadCrumb->render($bcMenu));
$menu = new ItemList(['caption' => 'Folders', 'icon' => 'glyphicon glyphicon-folder-open']);
$menu->addItem(new Link(['caption' => XoopsLocale::INBOX, 'link' => 'viewpmsg.php?op=in', 'icon' => 'glyphicon glyphicon-inbox']));
$menu->addItem(new Link(['caption' => _PM_OUTBOX, 'link' => 'viewpmsg.php?op=out', 'icon' => 'glyphicon glyphicon-share']));
$menu->addItem(new Link(['caption' => _PM_SAVEBOX, 'link' => 'viewpmsg.php?op=save', 'icon' => 'glyphicon glyphicon-save']));
$folderMenu = new \Xoops\Html\Menu\Render\DropDownButton();
$xoops->tpl()->assign('folders', $folderMenu->render($menu));
$xoops->footer();