<?php 
/** 
 * XOOPS notification 
 * 
 * You may not change or alter any portion of this comment or credits 
 * of supporting developers from this source code or any supporting source code 
 * which is considered copyrighted (c) material of the original comment or credit authors. 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 * 
 * @copyright       (c) 2000-2016 XOOPS Project (www.xoops.org) 
 * @license             GNU GPL 2 (http://www.gnu.org/licenses/gpl-2.0.html) 
 * @package             core 
 * @since               2.0.0 
 */ 
 
$xoopsOption['pagetype'] = 'notification'; 
include __DIR__ . '/mainfile.php'; 
 
if (!is_object($xoopsUser)) { 
    redirect_header('index.php', 3, _NOT_NOACCESS); 
} 
 
$uid = $xoopsUser->getVar('uid'); 
 
$op = 'list'; 
if (isset($_POST['op'])) { 
    $op = trim($_POST['op']); 
} elseif (isset($_GET['op'])) { 
    $op = trim($_GET['op']); 
} 
if (isset($_POST['delete'])) { 
    $op = 'delete'; 
} elseif (isset($_GET['delete'])) { 
    $op = 'delete'; 
} 
if (isset($_POST['delete_ok'])) { 
    $op = 'delete_ok'; 
} 
if (isset($_POST['delete_cancel'])) { 
    $op = 'cancel'; 
} 
 
switch ($op) { 
    case 'cancel': 
        // FIXME: does this always go back to correct location?? 
        redirect_header('index.php'); 
        break; 
 
    case 'list': 
        // Do we allow other users to see our notifications?  Nope, but maybe 
        // see who else is monitoring a particular item (or at least how many)? 
        // Well, maybe admin can see all... 
        // TODO: need to span over multiple pages...??? 
        // Get an array of all notifications for the selected user 
        $criteria = new Criteria('not_uid', $uid); 
        $criteria->setSort('not_modid,not_category,not_itemid'); 
        /* @var  XoopsNotificationHandler $notification_handler */ 
        $notification_handler = xoops_getHandler('notification'); 
        $notifications        = $notification_handler->getObjects($criteria); 
 
        // Generate the info for the template 
        /* @var XoopsModuleHandler $module_handler */ 
        $module_handler = xoops_getHandler('module'); 
        include_once $GLOBALS['xoops']->path('include/notification_functions.php'); 
        $modules       = array(); 
        $prev_modid    = -1; 
        $prev_category = -1; 
        $prev_item     = -1; 
        foreach ($notifications as $n) { 
            $modid = $n->getVar('not_modid'); 
            if ($modid != $prev_modid) { 
                $prev_modid      = $modid; 
                $prev_category   = -1; 
                $prev_item       = -1; 
                $module          = $module_handler->get($modid); 
                $modules[$modid] = array( 
                    'id'         => $modid, 
                    'name'       => $module->getVar('name'), 
                    'categories' => array()); 
                // TODO: note, we could auto-generate the url from the id 
                // and category info... (except when category has multiple 
                // subscription scripts defined...) 
                // OR, add one more option to xoops_version 'view_from' 
                // which tells us where to redirect... BUT, e.g. forums, it 
                // still wouldn't give us all the required info... e.g. the 
                // topic ID doesn't give us the ID of the forum which is 
                // a required argument... 
                // Get the lookup function, if exists 
                $not_config  = $module->getInfo('notification'); 
                $lookup_func = ''; 
                if (!empty($not_config['lookup_file'])) { 
                    $lookup_file = $GLOBALS['xoops']->path('modules/' . $module->getVar('dirname') . '/' . $not_config['lookup_file']); 
                    if (file_exists($lookup_file)) { 
                        include_once $lookup_file; 
                        if (!empty($not_config['lookup_func']) && function_exists($not_config['lookup_func'])) { 
                            $lookup_func = $not_config['lookup_func']; 
                        } 
                    } 
                } 
            } 
            $category = $n->getVar('not_category'); 
            if ($category != $prev_category) { 
                $prev_category                            = $category; 
                $prev_item                                = -1; 
                $category_info                            = ¬ificationCategoryInfo($category, $modid); 
                $modules[$modid]['categories'][$category] = array( 
                    'name'  => $category, 
                    'title' => $category_info['title'], 
                    'items' => array()); 
            } 
            $item = $n->getVar('not_itemid'); 
            if ($item != $prev_item) { 
                $prev_item = $item; 
                if (!empty($lookup_func)) { 
                    $item_info = $lookup_func($category, $item); 
                } else { 
                    $item_info = array( 
                        'name' => '[' . _NOT_NAMENOTAVAILABLE . ']', 
                        'url'  => ''); 
                } 
                $modules[$modid]['categories'][$category]['items'][$item] = array( 
                    'id'            => $item, 
                    'name'          => $item_info['name'], 
                    'url'           => $item_info['url'], 
                    'notifications' => array()); 
            } 
            $event_info                                                                  =& notificationEventInfo($category, $n->getVar('not_event'), $n->getVar('not_modid')); 
            $modules[$modid]['categories'][$category]['items'][$item]['notifications'][] = array( 
                'id'             => $n->getVar('not_id'), 
                'module_id'      => $n->getVar('not_modid'), 
                'category'       => $n->getVar('not_category'), 
                'category_title' => $category_info['title'], 
                'item_id'        => $n->getVar('not_itemid'), 
                'event'          => $n->getVar('not_event'), 
                'event_title'    => $event_info['title'], 
                'user_id'        => $n->getVar('not_uid')); 
        } 
        $GLOBALS['xoopsOption']['template_main'] = 'system_notification_list.tpl'; 
        include $GLOBALS['xoops']->path('header.php'); 
        $xoopsTpl->assign('modules', $modules); 
        $user_info = array('uid' => $xoopsUser->getVar('uid')); 
        $xoopsTpl->assign('user', $user_info); 
        $xoopsTpl->assign('lang_cancel', _CANCEL); 
        $xoopsTpl->assign('lang_clear', _NOT_CLEAR); 
        $xoopsTpl->assign('lang_delete', _DELETE); 
        $xoopsTpl->assign('lang_checkall', _NOT_CHECKALL); 
        $xoopsTpl->assign('lang_module', _NOT_MODULE); 
        $xoopsTpl->assign('lang_event', _NOT_EVENT); 
        $xoopsTpl->assign('lang_events', _NOT_EVENTS); 
        $xoopsTpl->assign('lang_category', _NOT_CATEGORY); 
        $xoopsTpl->assign('lang_itemid', _NOT_ITEMID); 
        $xoopsTpl->assign('lang_itemname', _NOT_ITEMNAME); 
        $xoopsTpl->assign('lang_activenotifications', _NOT_ACTIVENOTIFICATIONS); 
        $xoopsTpl->assign('notification_token', $GLOBALS['xoopsSecurity']->createToken()); 
        include $GLOBALS['xoops']->path('footer.php'); 
 
        // TODO: another display mode... instead of one notification per line, 
        // show one line per item_id, with checkboxes for the available options... 
        // and an update button to change them...  And still have the delete box 
        // to delete all notification for that item 
        // How about one line per ID, showing category, name, id, and list of 
        // events... 
        // TODO: it would also be useful to provide links to other available 
        // options so we can say switch from new_message to 'bookmark' if we 
        // are receiving too many emails.  OR, if we click on 'change options' 
        // we get a form for that page... 
        // TODO: option to specify one-time??? or other modes?? 
        break; 
 
    case 'delete_ok': 
        if (empty($_POST['del_not'])) { 
            redirect_header('notifications.php', 2, _NOT_NOTHINGTODELETE); 
        } 
        include $GLOBALS['xoops']->path('header.php'); 
        $hidden_vars = array( 
            'uid'       => $uid, 
            'delete_ok' => 1, 
            'del_not'   => $_POST['del_not']); 
        echo '<h4>' . _NOT_DELETINGNOTIFICATIONS . '</h4>'; 
        xoops_confirm($hidden_vars, xoops_getenv('PHP_SELF'), _NOT_RUSUREDEL); 
        include $GLOBALS['xoops']->path('footer.php'); 
        // FIXME: There is a problem here... in xoops_confirm it treats arrays as 
        // optional radio arguments on the confirmation page... change this or 
        // write new function... 
        break; 
 
    case 'delete': 
        if (!$GLOBALS['xoopsSecurity']->check()) { 
            redirect_header('notifications.php', 2, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors())); 
        } 
        if (empty($_POST['del_not'])) { 
            redirect_header('notifications.php', 2, _NOT_NOTHINGTODELETE); 
        } 
        $notification_handler = xoops_getHandler('notification'); 
        foreach ($_POST['del_not'] as $n_array) { 
            foreach ($n_array as $n) { 
                $notification = $notification_handler->get($n); 
                if ($notification->getVar('not_uid') == $uid) { 
                    $notification_handler->delete($notification); 
                } 
            } 
        } 
        redirect_header('notifications.php', 2, _NOT_DELETESUCCESS); 
        break; 
    default: 
        break; 
} 
 
 |