[xoops-cvslog 2017] CVS update: xoops2jp/html/kernel

Back to archive index

NobuNobu nobun****@users*****
2006年 1月 30日 (月) 21:13:34 JST


Index: xoops2jp/html/kernel/notification.php
diff -u xoops2jp/html/kernel/notification.php:1.2 xoops2jp/html/kernel/notification.php:1.2.8.1
--- xoops2jp/html/kernel/notification.php:1.2	Fri Mar 18 21:52:14 2005
+++ xoops2jp/html/kernel/notification.php	Mon Jan 30 21:13:33 2006
@@ -1,813 +1,851 @@
-<?php
-// $Id: notification.php,v 1.2 2005/03/18 12:52:14 onokazu Exp $
-//  ------------------------------------------------------------------------ //
-//                XOOPS - PHP Content Management System                      //
-//                    Copyright (c) 2000 XOOPS.org                           //
-//                       <http://www.xoops.org/>                             //
-//  ------------------------------------------------------------------------ //
-//  This program is free software; you can redistribute it and/or modify     //
-//  it under the terms of the GNU General Public License as published by     //
-//  the Free Software Foundation; either version 2 of the License, or        //
-//  (at your option) any later version.                                      //
-//                                                                           //
-//  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.  See the            //
-//  GNU General Public License for more details.                             //
-//                                                                           //
-//  You should have received a copy of the GNU General Public License        //
-//  along with this program; if not, write to the Free Software              //
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
-//  ------------------------------------------------------------------------ //
-// Author: Kazumi Ono (AKA onokazu)                                          //
-// URL: http://www.xoops.org/ http://jp.xoops.org/  http://www.myweb.ne.jp/  //
-// Project: The XOOPS Project (http://www.xoops.org/)                        //
-// ------------------------------------------------------------------------- //
-
-if (!defined('XOOPS_ROOT_PATH')) {
-	exit();
-}
-// RMV-NOTIFY
-include_once XOOPS_ROOT_PATH . '/include/notification_constants.php';
-include_once XOOPS_ROOT_PATH . '/include/notification_functions.php';
-
-/**
- *
- *
- * @package     kernel
- * @subpackage  notification
- *
- * @author	    Michael van Dam	<mvand****@calte*****>
- * @copyright	copyright (c) 2000-2003 XOOPS.org
- */
-
-/**
- * A Notification
- *
- * @package     kernel
- * @subpackage  notification
- *
- * @author	    Michael van Dam	<mvand****@calte*****>
- * @copyright	copyright (c) 2000-2003 XOOPS.org
- */
-class XoopsNotification extends XoopsObject
-{
-
-    /**
-     * Constructor
-     **/
-    function XoopsNotification()
-    {
-        $this->XoopsObject();
-		$this->initVar('not_id', XOBJ_DTYPE_INT, NULL, false);
-		$this->initVar('not_modid', XOBJ_DTYPE_INT, NULL, false);
-		$this->initVar('not_category', XOBJ_DTYPE_TXTBOX, null, false, 30);
-		$this->initVar('not_itemid', XOBJ_DTYPE_INT, 0, false);
-		$this->initVar('not_event', XOBJ_DTYPE_TXTBOX, null, false, 30);
-		$this->initVar('not_uid', XOBJ_DTYPE_INT, 0, true);
-		$this->initVar('not_mode', XOBJ_DTYPE_INT, 0, false);
-    }
-
-// FIXME:???
-// To send email to multiple users simultaneously, we would need to move
-// the notify functionality to the handler class.  BUT, some of the tags
-// are user-dependent, so every email msg will be unique.  (Unless maybe use
-// smarty for email templates in the future.)  Also we would have to keep
-// track if each user wanted email or PM.
-
-	/**
-	 * Send a notification message to the user
-	 *
-	 * @param  string  $template_dir  Template directory
-	 * @param  string  $template      Template name
-     * @param  string  $subject       Subject line for notification message
-     * @param  array   $tags Array of substitutions for template variables
-	 *
-	 * @return  bool	true if success, false if error
-	 **/
-	function notifyUser($template_dir, $template, $subject, $tags)
-	{
-		// Check the user's notification preference.
-
-		$member_handler =& xoops_gethandler('member');
-		$user =& $member_handler->getUser($this->getVar('not_uid'));
-		if (!is_object($user)) {
-			return true;
-		}
-		$method = $user->getVar('notify_method');
-
-		$xoopsMailer =& getMailer();
-		include_once XOOPS_ROOT_PATH . '/include/notification_constants.php';
-		switch($method) {
-		case XOOPS_NOTIFICATION_METHOD_PM:
-			$xoopsMailer->usePM();
-			$config_handler =& xoops_gethandler('config');
-			$xoopsMailerConfig =& $config_handler->getConfigsByCat(XOOPS_CONF_MAILER);
-			$xoopsMailer->setFromUser($member_handler->getUser($xoopsMailerConfig['fromuid']));
-			foreach ($tags as $k=>$v) {
-				$xoopsMailer->assign($k, $v);
-			}
-			break;
-		case XOOPS_NOTIFICATION_METHOD_EMAIL:
-			$xoopsMailer->useMail();
-			foreach ($tags as $k=>$v) {
-				$xoopsMailer->assign($k, preg_replace("/&amp;/i", '&', $v));
-			}
-			break;
-		default:
-			return true; // report error in user's profile??
-			break;
-		}
-
-		// Set up the mailer
-		$xoopsMailer->setTemplateDir($template_dir);
-		$xoopsMailer->setTemplate($template);
-		$xoopsMailer->setToUsers($user);
-		//global $xoopsConfig;
-		//$xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
-		//$xoopsMailer->setFromName($xoopsConfig['sitename']);
-		$xoopsMailer->setSubject($subject);
-		$success = $xoopsMailer->send();
-
-		// If send-once-then-delete, delete notification
-		// If send-once-then-wait, disable notification
-
-		include_once XOOPS_ROOT_PATH . '/include/notification_constants.php';
-		$notification_handler =& xoops_gethandler('notification');
-
-		if ($this->getVar('not_mode') == XOOPS_NOTIFICATION_MODE_SENDONCETHENDELETE) {
-			$notification_handler->delete($this);
-			return $success;
-		}
-
-		if ($this->getVar('not_mode') == XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT) {
-			$this->setVar('not_mode', XOOPS_NOTIFICATION_MODE_WAITFORLOGIN);
-			$notification_handler->insert($this);
-		}
-		return $success;
-
-	}
-
-}
-
-/**
- * XOOPS notification handler class.
- *
- * This class is responsible for providing data access mechanisms to the data source
- * of XOOPS notification class objects.
- *
- *
- * @package     kernel
- * @subpackage  notification
- *
- * @author	    Michael van Dam <mvand****@calte*****>
- * @copyright	copyright (c) 2000-2003 XOOPS.org
- */
-class XoopsNotificationHandler extends XoopsObjectHandler
-{
-
-    /**
-     * Create a {@link XoopsNotification}
-     *
-     * @param	bool    $isNew  Flag the object as "new"?
-     *
-     * @return	object
-     */
-    function &create($isNew = true)
-    {
-        $notification = new XoopsNotification();
-        if ($isNew) {
-            $notification->setNew();
-        }
-        return $notification;
-    }
-
-
-    /**
-     * Retrieve a {@link XoopsNotification}
-     *
-     * @param   int $id ID
-     *
-     * @return  object  {@link XoopsNotification}, FALSE on fail
-     **/
-    function &get($id)
-    {
-        $id = intval($id);
-        if ($id > 0) {
-            $sql = 'SELECT * FROM '.$this->db->prefix('xoopsnotifications').' WHERE not_id='.$id;
-            if (!$result = $this->db->query($sql)) {
-                return false;
-            }
-            $numrows = $this->db->getRowsNum($result);
-            if ($numrows == 1) {
-                $notification = new XoopsNotification();
-                $notification->assignVars($this->db->fetchArray($result));
-                return $notification;
-            }
-        }
-        return false;
-    }
-
-
-    /**
-     * Write a notification(subscription) to database
-     *
-     * @param   object  &$notification
-     *
-     * @return  bool
-     **/
-    function insert(&$notification)
-    {
-        if (strtolower(get_class($notification)) != 'xoopsnotification') {
-            return false;
-        }
-        if (!$notification->isDirty()) {
-            return true;
-        }
-        if (!$notification->cleanVars()) {
-            return false;
-        }
-        foreach ($notification->cleanVars as $k => $v) {
-            ${$k} = $v;
-        }
-        if ($notification->isNew()) {
-            $not_id = $this->db->genId('xoopsnotifications_not_id_seq');
-	    $sql = sprintf("INSERT INTO %s (not_id, not_modid, not_itemid, not_category, not_uid, not_event, not_mode) VALUES (%u, %u, %u, %s, %u, %s, %u)", $this->db->prefix('xoopsnotifications'), $not_id, $not_modid, $not_itemid, $this->db->quoteString($not_category), $not_uid, $this->db->quoteString($not_event), $not_mode);
-        } else {
-	    $sql = sprintf("UPDATE %s SET not_modid = %u, not_itemid = %u, not_category = %s, not_uid = %u, not_event = %s, not_mode = %u WHERE not_id = %u", $this->db->prefix('xoopsnotifications'), $not_modid, $not_itemid, $this->db->quoteString($not_category), $not_uid, $this->db->quoteString($not_event), $not_mode, $not_id);
-        }
-        if (!$result = $this->db->query($sql)) {
-            return false;
-        }
-        if (empty($not_id)) {
-            $not_id = $this->db->getInsertId();
-        }
-        $notification->assignVar('not_id', $not_id);
-        return true;
-    }
-
-    /**
-     * Delete a {@link XoopsNotification} from the database
-     *
-     * @param   object  &$notification
-     *
-     * @return  bool
-     **/
-    function delete(&$notification)
-    {
-        if (strtolower(get_class($notification)) != 'xoopsnotification') {
-            return false;
-        }
-        $sql = sprintf("DELETE FROM %s WHERE not_id = %u", $this->db->prefix('xoopsnotifications'), $notification->getVar('not_id'));
-        if (!$result = $this->db->query($sql)) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Get some {@link XoopsNotification}s
-     *
-     * @param   object  $criteria
-     * @param   bool    $id_as_key  Use IDs as keys into the array?
-     *
-     * @return  array   Array of {@link XoopsNotification} objects
-     **/
-    function &getObjects($criteria = null, $id_as_key = false)
-    {
-        $ret = array();
-        $limit = $start = 0;
-        $sql = 'SELECT * FROM '.$this->db->prefix('xoopsnotifications');
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
-            $sql .= ' '.$criteria->renderWhere();
-            $sort = ($criteria->getSort() != '') ? $criteria->getSort() : 'not_id';
-            $sql .= ' ORDER BY '.$sort.' '.$criteria->getOrder();
-            $limit = $criteria->getLimit();
-            $start = $criteria->getStart();
-        }
-        $result = $this->db->query($sql, $limit, $start);
-        if (!$result) {
-            return $ret;
-        }
-        while ($myrow = $this->db->fetchArray($result)) {
-            $notification = new XoopsNotification();
-            $notification->assignVars($myrow);
-            if (!$id_as_key) {
-                $ret[] =& $notification;
-            } else {
-                $ret[$myrow['not_id']] =& $notification;
-            }
-            unset($notification);
-        }
-        return $ret;
-    }
-
-// TODO: Need this??
-    /**
-     * Count Notifications
-     *
-     * @param   object  $criteria   {@link CriteriaElement}
-     *
-     * @return  int     Count
-     **/
-    function getCount($criteria = null)
-    {
-        $sql = 'SELECT COUNT(*) FROM '.$this->db->prefix('xoopsnotifications');
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
-            $sql .= ' '.$criteria->renderWhere();
-        }
-        if (!$result =& $this->db->query($sql)) {
-            return 0;
-        }
-        list($count) = $this->db->fetchRow($result);
-        return $count;
-    }
-
-    /**
-     * Delete multiple notifications
-     *
-     * @param   object  $criteria   {@link CriteriaElement}
-     *
-     * @return  bool
-     **/
-    function deleteAll($criteria = null)
-    {
-        $sql = 'DELETE FROM '.$this->db->prefix('xoopsnotifications');
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
-            $sql .= ' '.$criteria->renderWhere();
-        }
-        if (!$result = $this->db->query($sql)) {
-            return false;
-        }
-        return true;
-    }
-
-// Need this??
-    /**
-     * Change a value in multiple notifications
-     *
-     * @param   string  $fieldname  Name of the field
-     * @param   string  $fieldvalue Value to write
-     * @param   object  $criteria   {@link CriteriaElement}
-     *
-     * @return  bool
-     **/
-/*
-    function updateAll($fieldname, $fieldvalue, $criteria = null)
-    {
-        $set_clause = is_numeric($fieldvalue) ? $filedname.' = '.$fieldvalue : $filedname." = '".$fieldvalue."'";
-        $sql = 'UPDATE '.$this->db->prefix('xoopsnotifications').' SET '.$set_clause;
-        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
-            $sql .= ' '.$criteria->renderWhere();
-        }
-        if (!$result = $this->db->query($sql)) {
-            return false;
-        }
-        return true;
-    }
-*/
-
-	// TODO: rename this...
-	// Also, should we have get by module, get by category, etc...??
-
-	function &getNotification ($module_id, $category, $item_id, $event, $user_id)
-	{
-		$criteria = new CriteriaCompo();
-		$criteria->add(new Criteria('not_modid', intval($module_id)));
-		$criteria->add(new Criteria('not_category', $category));
-		$criteria->add(new Criteria('not_itemid', intval($item_id)));
-		$criteria->add(new Criteria('not_event', $event));
-		$criteria->add(new Criteria('not_uid', intval($user_id)));
-		$objects = $this->getObjects($criteria);
-		if (count($objects) == 1) {
-			return $objects[0];
-		}
-		return false;
-	}
-
-	/**
-	 * Determine if a user is subscribed to a particular event in
-	 * a particular module.
-	 *
-	 * @param  string  $category  Category of notification event
-	 * @param  int     $item_id   Item ID of notification event
-	 * @param  string  $event     Event
-     * @param  int     $module_id ID of module (default current module)
-	 * @param  int     $user_id   ID of user (default current user)
-	 * return int  0 if not subscribe; non-zero if subscribed
-	 */
-
-	function isSubscribed ($category, $item_id, $event, $module_id, $user_id)
-	{
-		$criteria = new CriteriaCompo();
-		$criteria->add(new Criteria('not_modid', intval($module_id)));
-		$criteria->add(new Criteria('not_category', $category));
-		$criteria->add(new Criteria('not_itemid', intval($item_id)));
-		$criteria->add(new Criteria('not_event', $event));
-		$criteria->add(new Criteria('not_uid', intval($user_id)));
-		return $this->getCount($criteria);
-		
-	}
-
-
-	// TODO: how about a function to subscribe a whole group of users???
-	// e.g. if we want to add all moderators to be notified of subscription
-	// of new threads...
-
-    /**
-     * Subscribe for notification for an event(s)
-     *
-     * @param  string $category    category of notification
-     * @param  int    $item_id     ID of the item
-     * @param  mixed  $events      event string or array of events
-     * @param  int    $mode        force a particular notification mode
-     *                             (e.g. once_only) (default to current user preference)
-     * @param  int    $module_id   ID of the module (default to current module)
-     * @param  int    $user_id     ID of the user (default to current user)
-     **/
-    function subscribe ($category, $item_id, $events, $mode=null, $module_id=null, $user_id=null)
-    {
-        if (!isset($user_id)) {
-            global $xoopsUser;
-            if (empty($xoopsUser)) {
-                return false;  // anonymous cannot subscribe
-            } else {
-                $user_id = $xoopsUser->getVar('uid');
-            }
-        }
-
-        if (!isset($module_id)) {
-            global $xoopsModule;
-            $module_id = $xoopsModule->getVar('mid');
-        }
-
-        if (!isset($mode)) {
-            $user = new XoopsUser($user_id);
-            $mode = $user->getVar('notify_mode');
-        }
-
-        if (!is_array($events)) $events = array($events);
-        foreach ($events as $event) {
-            if ($notification =& $this->getNotification($module_id, $category, $item_id, $event, $user_id)) {
-                if ($notification->getVar('not_mode') != $mode) {
-                    $this->updateByField($notification, 'not_mode', $mode);
-            	}
-            } else {
-                $notification =& $this->create();
-                $notification->setVar('not_modid', $module_id);
-                $notification->setVar('not_category', $category);
-                $notification->setVar('not_itemid', $item_id);
-                $notification->setVar('not_uid', $user_id);
-                $notification->setVar('not_event', $event);
-                $notification->setVar('not_mode', $mode);
-                $this->insert($notification);
-            }
-        }
-    }
-
-
-// TODO: this will be to provide a list of everything a particular
-// user has subscribed to... e.g. for on the 'Profile' page, similar
-// to how we see the various posts etc. that the user has made.
-// We may also want to have a function where we can specify module id
-    /**
-     * Get a list of notifications by user ID
-     *
-     * @param  int  $user_id  ID of the user
-     *
-     * @return array  Array of {@link XoopsNotification} objects
-     **/
-    function &getByUser ($user_id)
-    {
-        $criteria = new Criteria ('not_uid', $user_id);
-        return $this->getObjects($criteria, true);
-    }
-
-	// TODO: rename this??
-    /**
-     * Get a list of notification events for the current item/mod/user
-     *
-     **/
-	function &getSubscribedEvents ($category, $item_id, $module_id, $user_id)
-    {
-        $criteria = new CriteriaCompo();
-        $criteria->add (new Criteria('not_modid', $module_id));
-        $criteria->add (new Criteria('not_category', $category));
-        if ($item_id) {
-            $criteria->add (new Criteria('not_itemid', $item_id));
-        }
-        $criteria->add (new Criteria('not_uid', $user_id));
-        $results = $this->getObjects($criteria, true);
-        $ret = array();
-        foreach (array_keys($results) as $i) {
-            $ret[] = $results[$i]->getVar('not_event');
-        }
-        return $ret;
-    }
-
-// TODO: is this a useful function?? (Copied from comment_handler)
-    /**
-     * Retrieve items by their ID
-     *
-     * @param   int     $module_id  Module ID
-     * @param   int     $item_id    Item ID
-     * @param   string  $order      Sort order
-     *
-     * @return  array   Array of {@link XoopsNotification} objects
-     **/
-    function &getByItemId($module_id, $item_id, $order = null, $status = null)
-    {
-        $criteria = new CriteriaCompo(new Criteria('com_modid', intval($module_id)));
-        $criteria->add(new Criteria('com_itemid', intval($item_id)));
-        if (isset($status)) {
-            $criteria->add(new Criteria('com_status', intval($status)));
-        }
-        if (isset($order)) {
-            $criteria->setOrder($order);
-        }
-        return $this->getObjects($criteria);
-    }
-
-
-    /**
-     * Send notifications to users
-     *
-     * @param  string $category   notification category
-     * @param  int $item_id    ID of the item
-     * @param  string  $event  notification event
-     * @param  array  $extra_tags array of substitutions for template to be
-     *                             merged with the one from function..
-	 * @param  array  $user_list  only notify the selected users
-     * @param  int $module_id  ID of the module
-     * @param  int $omit_user_id    ID of the user to omit from notifications. (default to current user).  set to 0 for all users to receive notification.
-     **/
-    // TODO:(?) - pass in an event LIST.  This will help to avoid
-    // problem of sending people multiple emails for similar events.
-    // BUT, then we need an array of mail templates, etc...  Unless
-    // mail templates can include logic in the future, then we can
-    // tailor the mail so it makes sense for any of the possible
-    // (or combination of) events.
-
-    function triggerEvents ($category, $item_id, $events, $extra_tags=array(), $user_list=array(), $module_id=null, $omit_user_id=null)
-    {
-        if (!is_array($events)) {
-            $events = array($events);
-        }
-        foreach ($events as $event) {
-            $this->triggerEvent($category, $item_id, $event, $extra_tags, $user_list, $module_id, $omit_user_id);
-        }
-    }
-
-    function triggerEvent ($category, $item_id, $event, $extra_tags=array(), $user_list=array(), $module_id=null, $omit_user_id=null)
-    {
-
-        if (!isset($module_id)) {
-            global $xoopsModule;
-            $module =& $xoopsModule;
-            $module_id = !empty($xoopsModule) ? $xoopsModule->getVar('mid') : 0;
-        } else {
-            $module_handler =& xoops_gethandler('module');
-            $module =& $module_handler->get($module_id);
-        }
-
-		// Check if event is enabled
-		$config_handler =& xoops_gethandler('config');
-		$mod_config =& $config_handler->getConfigsByCat(0,$module->getVar('mid'));
-		if (empty($mod_config['notification_enabled'])) {
-			return false;
-		}
-		$category_info =& notificationCategoryInfo ($category, $module_id);
-		$event_info =& notificationEventInfo ($category, $event, $module_id);
-		if (!in_array(notificationGenerateConfig($category_info,$event_info,'option_name'),$mod_config['notification_events']) && empty($event_info['invisible'])) {
-			return false;
-		}
-
-        if (!isset($omit_user_id)) {
-            global $xoopsUser;
-            if (!empty($xoopsUser)) {
-                $omit_user_id = $xoopsUser->getVar('uid');
-            } else {
-                $omit_user_id = 0;
-            }
-        }
-        $criteria = new CriteriaCompo();
-        $criteria->add(new Criteria('not_modid', intval($module_id)));
-        $criteria->add(new Criteria('not_category', $category));
-        $criteria->add(new Criteria('not_itemid', intval($item_id)));
-        $criteria->add(new Criteria('not_event', $event));
-        $mode_criteria = new CriteriaCompo();
-        $mode_criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_SENDALWAYS), 'OR');
-        $mode_criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_SENDONCETHENDELETE), 'OR');
-        $mode_criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT), 'OR');
-        $criteria->add($mode_criteria);
-		if (!empty($user_list)) {
-			$user_criteria = new CriteriaCompo();
-			foreach ($user_list as $user) {
-				$user_criteria->add (new Criteria('not_uid', $user), 'OR');
-			}
-			$criteria->add($user_criteria);
-		}
-        $notifications =& $this->getObjects($criteria);
-        if (empty($notifications)) {
-            return;
-        }
-
-        // Add some tag substitutions here
-
-        $not_config = $module->getInfo('notification');
-        $tags = array();
-        if (!empty($not_config)) {
-            if (!empty($not_config['tags_file'])) {
-                $tags_file = XOOPS_ROOT_PATH . '/modules/' . $module->getVar('dirname') . '/' . $not_config['tags_file'];
-                if (file_exists($tags_file)) {
-                    include_once $tags_file;
-                    if (!empty($not_config['tags_func'])) {
-                        $tags_func = $not_config['tags_func'];
-                        if (function_exists($tags_func)) {
-                            $tags = $tags_func($category, intval($item_id), $event);
-                        }
-                    }
-                }
-            }
-			// RMV-NEW
-			if (!empty($not_config['lookup_file'])) {
-				$lookup_file = XOOPS_ROOT_PATH . '/modules/' . $module->getVar('dirname') . '/' . $not_config['lookup_file'];
-				if (file_exists($lookup_file)) {
-					include_once $lookup_file;
-					if (!empty($not_config['lookup_func'])) {
-						$lookup_func = $not_config['lookup_func'];
-						if (function_exists($lookup_func)) {
-							$item_info = $lookup_func($category, intval($item_id));
-						}
-					}
-				}
-			}
-        }
-		$tags['X_ITEM_NAME'] = !empty($item_info['name']) ? $item_info['name'] : '[' . _NOT_ITEMNAMENOTAVAILABLE . ']';
-		$tags['X_ITEM_URL']  = !empty($item_info['url']) ? $item_info['url'] : '[' . _NOT_ITEMURLNOTAVAILABLE . ']';
-		$tags['X_ITEM_TYPE'] = !empty($category_info['item_name']) ? $category_info['title'] : '[' . _NOT_ITEMTYPENOTAVAILABLE . ']';
-        $tags['X_MODULE'] = $module->getVar('name');
-        $tags['X_MODULE_URL'] = XOOPS_URL . '/modules/' . $module->getVar('dirname') . '/';
-        $tags['X_NOTIFY_CATEGORY'] = $category;
-        $tags['X_NOTIFY_EVENT'] = $event;
-
-        $template_dir = $event_info['mail_template_dir'];
-        $template = $event_info['mail_template'] . '.tpl';
-        $subject = $event_info['mail_subject'];
-
-		foreach ($notifications as $notification) {
-			if (empty($omit_user_id) || $notification->getVar('not_uid') != $omit_user_id) {
-				// user-specific tags
-				//$tags['X_UNSUBSCRIBE_URL'] = 'TODO';
-				// TODO: don't show unsubscribe link if it is 'one-time' ??
-				$tags['X_UNSUBSCRIBE_URL'] = XOOPS_URL . '/notifications.php';
-        		$tags = array_merge ($tags, $extra_tags);
-
-				$notification->notifyUser($template_dir, $template, $subject, $tags);
-			}
-		}
-	}
-
-
-    /**
-     * Delete all notifications for one user
-     *
-     * @param   int $user_id  ID of the user
-     * @return  bool
-     **/
-    function unsubscribeByUser ($user_id)
-    {
-        $criteria = new Criteria('not_uid', intval($user_id));
-        return $this->deleteAll($criteria);
-    }
-
-
-// TODO: allow these to use current module, etc...
-
-    /**
-     * Unsubscribe notifications for an event(s).
-     *
-     * @param  string  $category    category of the events
-     * @param  int     $item_id     ID of the item
-     * @param  mixed   $events      event string or array of events
-     * @param  int     $module_id   ID of the module (default current module)
-     * @param  int     $user_id     UID of the user (default current user)
-     *
-     * @return bool
-     **/
-
-    function unsubscribe ($category, $item_id, $events, $module_id=null, $user_id=null)
-    {
-        if (!isset($user_id)) {
-            global $xoopsUser;
-            if (empty($xoopsUser)) {
-                return false;  // anonymous cannot subscribe
-            } else {
-                $user_id = $xoopsUser->getVar('uid');
-            }
-        }
-
-        if (!isset($module_id)) {
-            global $xoopsModule;
-            $module_id = $xoopsModule->getVar('mid');
-        }
-
-        $criteria = new CriteriaCompo();
-        $criteria->add (new Criteria('not_modid', intval($module_id)));
-        $criteria->add (new Criteria('not_category', $category));
-        $criteria->add (new Criteria('not_itemid', intval($item_id)));
-        $criteria->add (new Criteria('not_uid', intval($user_id)));
-        if (!is_array($events)) {
-            $events = array($events);
-        }
-        $event_criteria = new CriteriaCompo();
-        foreach ($events as $event) {
-            $event_criteria->add (new Criteria('not_event', $event), 'OR');
-        }
-        $criteria->add($event_criteria);
-        return $this->deleteAll($criteria);
-    }
-
-
-    // TODO: When 'update' a module, may need to switch around some
-    //  notification classes/IDs...  or delete the ones that no longer
-    //  exist.
-
-    /**
-     * Delete all notifications for a particular module
-     *
-     * @param   int $module_id  ID of the module
-     * @return  bool
-     **/
-    function unsubscribeByModule ($module_id)
-    {
-        $criteria = new Criteria('not_modid', intval($module_id));
-        return $this->deleteAll($criteria);
-    }
-
-
-    /**
-     * Delete all subscriptions for a particular item.
-     *
-     * @param  int    $module_id  ID of the module to which item belongs
-     * @param  string $category   Notification category of the item
-     * @param  int    $item_id    ID of the item
-     *
-     * @return bool
-     **/
-    function unsubscribeByItem ($module_id, $category, $item_id)
-	{
-        $criteria = new CriteriaCompo();
-        $criteria->add (new Criteria('not_modid', intval($module_id)));
-        $criteria->add (new Criteria('not_category', $category));
-        $criteria->add (new Criteria('not_itemid', intval($item_id)));
-        return $this->deleteAll($criteria);
-    }
-
-
-    /**
-     * Perform notification maintenance activites at login time.
-     * In particular, any notifications for the newly logged-in
-     * user with mode XOOPS_NOTIFICATION_MODE_WAITFORLOGIN are
-     * switched to mode XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT.
-     *
-     * @param  int  $user_id  ID of the user being logged in
-     **/
-    function doLoginMaintenance ($user_id)
-    {
-        $criteria = new CriteriaCompo();
-        $criteria->add (new Criteria('not_uid', intval($user_id)));
-        $criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_WAITFORLOGIN));
-
-        $notifications = $this->getObjects($criteria, true);
-        foreach ($notifications as $n) {
-            $n->setVar('not_mode', XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT);
-            $this->insert($n);
-        }
-    }
-
-
-    /**
-     * Update
-     *
-     * @param   object  &$notification  {@link XoopsNotification} object
-     * @param   string  $field_name     Name of the field
-     * @param   mixed   $field_value    Value to write
-     *
-     * @return  bool
-     **/
-    function updateByField(&$notification, $field_name, $field_value)
-    {
-        $notification->unsetNew();
-        $notification->setVar($field_name, $field_value);
-        return $this->insert($notification);
-    }
-
-
-}
-?>
+<?php
+// $Id: notification.php,v 1.2.8.1 2006/01/30 12:13:33 nobunobu Exp $
+//  ------------------------------------------------------------------------ //
+//                XOOPS - PHP Content Management System                      //
+//                    Copyright (c) 2000 XOOPS.org                           //
+//                       <http://www.xoops.org/>                             //
+//  ------------------------------------------------------------------------ //
+//  This program is free software; you can redistribute it and/or modify     //
+//  it under the terms of the GNU General Public License as published by     //
+//  the Free Software Foundation; either version 2 of the License, or        //
+//  (at your option) any later version.                                      //
+//                                                                           //
+//  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.  See the            //
+//  GNU General Public License for more details.                             //
+//                                                                           //
+//  You should have received a copy of the GNU General Public License        //
+//  along with this program; if not, write to the Free Software              //
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
+//  ------------------------------------------------------------------------ //
+// Author: Kazumi Ono (AKA onokazu)                                          //
+// URL: http://www.xoops.org/ http://jp.xoops.org/  http://www.myweb.ne.jp/  //
+// Project: The XOOPS Project (http://www.xoops.org/)                        //
+// ------------------------------------------------------------------------- //
+
+if (!defined('XOOPS_ROOT_PATH')) {
+	exit();
+}
+// RMV-NOTIFY
+include_once XOOPS_ROOT_PATH . '/include/notification_constants.php';
+include_once XOOPS_ROOT_PATH . '/include/notification_functions.php';
+
+/**
+ *
+ *
+ * @package     kernel
+ * @subpackage  notification
+ *
+ * @author	    Michael van Dam	<mvand****@calte*****>
+ * @copyright	copyright (c) 2000-2003 XOOPS.org
+ */
+
+/**
+ * A Notification
+ *
+ * @package     kernel
+ * @subpackage  notification
+ *
+ * @author	    Michael van Dam	<mvand****@calte*****>
+ * @copyright	copyright (c) 2000-2003 XOOPS.org
+ */
+class XoopsNotification extends XoopsObject
+{
+
+    /**
+     * Constructor
+     **/
+    function XoopsNotification()
+    {
+        $this->XoopsObject();
+		$this->initVar('not_id', XOBJ_DTYPE_INT, NULL, false);
+		$this->initVar('not_modid', XOBJ_DTYPE_INT, NULL, false);
+		$this->initVar('not_category', XOBJ_DTYPE_TXTBOX, null, false, 30);
+		$this->initVar('not_itemid', XOBJ_DTYPE_INT, 0, false);
+		$this->initVar('not_event', XOBJ_DTYPE_TXTBOX, null, false, 30);
+		$this->initVar('not_uid', XOBJ_DTYPE_INT, 0, true);
+		$this->initVar('not_mode', XOBJ_DTYPE_INT, 0, false);
+    }
+
+// FIXME:???
+// To send email to multiple users simultaneously, we would need to move
+// the notify functionality to the handler class.  BUT, some of the tags
+// are user-dependent, so every email msg will be unique.  (Unless maybe use
+// smarty for email templates in the future.)  Also we would have to keep
+// track if each user wanted email or PM.
+
+	/**
+	 * Send a notification message to the user
+	 *
+	 * @param  string  $template_dir  Template directory
+	 * @param  string  $template      Template name
+     * @param  string  $subject       Subject line for notification message
+     * @param  array   $tags Array of substitutions for template variables
+	 *
+	 * @return  bool	true if success, false if error
+	 **/
+	function notifyUser($template_dir, $template, $subject, $tags)
+	{
+		// Check the user's notification preference.
+
+		$member_handler =& xoops_gethandler('member');
+		$user =& $member_handler->getUser($this->getVar('not_uid'));
+		if (!is_object($user)) {
+			return true;
+		}
+		$method = $user->getVar('notify_method');
+
+		$xoopsMailer =& getMailer();
+		include_once XOOPS_ROOT_PATH . '/include/notification_constants.php';
+		switch($method) {
+		case XOOPS_NOTIFICATION_METHOD_PM:
+			$xoopsMailer->usePM();
+			$config_handler =& xoops_gethandler('config');
+			$xoopsMailerConfig =& $config_handler->getConfigsByCat(XOOPS_CONF_MAILER);
+			$xoopsMailer->setFromUser($member_handler->getUser($xoopsMailerConfig['fromuid']));
+			foreach ($tags as $k=>$v) {
+				$xoopsMailer->assign($k, $v);
+			}
+			break;
+		case XOOPS_NOTIFICATION_METHOD_EMAIL:
+			$xoopsMailer->useMail();
+			foreach ($tags as $k=>$v) {
+				$xoopsMailer->assign($k, preg_replace("/&amp;/i", '&', $v));
+			}
+			break;
+		default:
+			return true; // report error in user's profile??
+			break;
+		}
+
+		// Set up the mailer
+		$xoopsMailer->setTemplateDir($template_dir);
+		$xoopsMailer->setTemplate($template);
+		$xoopsMailer->setToUsers($user);
+		//global $xoopsConfig;
+		//$xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
+		//$xoopsMailer->setFromName($xoopsConfig['sitename']);
+		$xoopsMailer->setSubject($subject);
+		$success = $xoopsMailer->send();
+
+		// If send-once-then-delete, delete notification
+		// If send-once-then-wait, disable notification
+
+		include_once XOOPS_ROOT_PATH . '/include/notification_constants.php';
+		$notification_handler =& xoops_gethandler('notification');
+
+		if ($this->getVar('not_mode') == XOOPS_NOTIFICATION_MODE_SENDONCETHENDELETE) {
+			$notification_handler->delete($this);
+			return $success;
+		}
+
+		if ($this->getVar('not_mode') == XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT) {
+			$this->setVar('not_mode', XOOPS_NOTIFICATION_MODE_WAITFORLOGIN);
+			$notification_handler->insert($this);
+		}
+		return $success;
+
+	}
+
+}
+
+/**
+ * XOOPS notification handler class.
+ *
+ * This class is responsible for providing data access mechanisms to the data source
+ * of XOOPS notification class objects.
+ *
+ *
+ * @package     kernel
+ * @subpackage  notification
+ *
+ * @author	    Michael van Dam <mvand****@calte*****>
+ * @copyright	copyright (c) 2000-2003 XOOPS.org
+ */
+class XoopsNotificationHandler extends XoopsObjectHandler
+{
+
+    /**
+     * Create a {@link XoopsNotification}
+     *
+     * @param	bool    $isNew  Flag the object as "new"?
+     *
+     * @return	object
+     */
+    function &create($isNew = true)
+    {
+        $notification = new XoopsNotification();
+        if ($isNew) {
+            $notification->setNew();
+        }
+        return $notification;
+    }
+
+
+    /**
+     * Retrieve a {@link XoopsNotification}
+     *
+     * @param   int $id ID
+     *
+     * @return  object  {@link XoopsNotification}, FALSE on fail
+     **/
+    function &get($id)
+    {
+        $id = intval($id);
+        if ($id > 0) {
+            $sql = 'SELECT * FROM '.$this->db->prefix('xoopsnotifications').' WHERE not_id='.$id;
+            if (!$result = $this->db->query($sql)) {
+                return false;
+            }
+            $numrows = $this->db->getRowsNum($result);
+            if ($numrows == 1) {
+                $notification = new XoopsNotification();
+                $notification->assignVars($this->db->fetchArray($result));
+                return $notification;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * Write a notification(subscription) to database
+     *
+     * @param   object  &$notification
+     *
+     * @return  bool
+     **/
+    function insert(&$notification)
+    {
+        if (strtolower(get_class($notification)) != 'xoopsnotification') {
+            return false;
+        }
+        if (!$notification->isDirty()) {
+            return true;
+        }
+        if (!$notification->cleanVars()) {
+            return false;
+        }
+        foreach ($notification->cleanVars as $k => $v) {
+            ${$k} = $v;
+        }
+        if ($notification->isNew()) {
+            $not_id = $this->db->genId('xoopsnotifications_not_id_seq');
+	    $sql = sprintf("INSERT INTO %s (not_id, not_modid, not_itemid, not_category, not_uid, not_event, not_mode) VALUES (%u, %u, %u, %s, %u, %s, %u)", $this->db->prefix('xoopsnotifications'), $not_id, $not_modid, $not_itemid, $this->db->quoteString($not_category), $not_uid, $this->db->quoteString($not_event), $not_mode);
+        } else {
+	    $sql = sprintf("UPDATE %s SET not_modid = %u, not_itemid = %u, not_category = %s, not_uid = %u, not_event = %s, not_mode = %u WHERE not_id = %u", $this->db->prefix('xoopsnotifications'), $not_modid, $not_itemid, $this->db->quoteString($not_category), $not_uid, $this->db->quoteString($not_event), $not_mode, $not_id);
+        }
+        if (!$result = $this->db->query($sql)) {
+            return false;
+        }
+        if (empty($not_id)) {
+            $not_id = $this->db->getInsertId();
+        }
+        $notification->assignVar('not_id', $not_id);
+        return true;
+    }
+
+    /**
+     * Delete a {@link XoopsNotification} from the database
+     *
+     * @param   object  &$notification
+     *
+     * @return  bool
+     **/
+    function delete(&$notification)
+    {
+        if (strtolower(get_class($notification)) != 'xoopsnotification') {
+            return false;
+        }
+        $sql = sprintf("DELETE FROM %s WHERE not_id = %u", $this->db->prefix('xoopsnotifications'), $notification->getVar('not_id'));
+        if (!$result = $this->db->query($sql)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Get some {@link XoopsNotification}s
+     *
+     * @param   object  $criteria
+     * @param   bool    $id_as_key  Use IDs as keys into the array?
+     *
+     * @return  array   Array of {@link XoopsNotification} objects
+     **/
+    function &getObjects($criteria = null, $id_as_key = false)
+    {
+        $ret = array();
+        $limit = $start = 0;
+        $sql = 'SELECT * FROM '.$this->db->prefix('xoopsnotifications');
+        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
+            $sql .= ' '.$criteria->renderWhere();
+            $sort = ($criteria->getSort() != '') ? $criteria->getSort() : 'not_id';
+            $sql .= ' ORDER BY '.$sort.' '.$criteria->getOrder();
+            $limit = $criteria->getLimit();
+            $start = $criteria->getStart();
+        }
+        $result = $this->db->query($sql, $limit, $start);
+        if (!$result) {
+            return $ret;
+        }
+        while ($myrow = $this->db->fetchArray($result)) {
+            $notification = new XoopsNotification();
+            $notification->assignVars($myrow);
+            if (!$id_as_key) {
+                $ret[] =& $notification;
+            } else {
+                $ret[$myrow['not_id']] =& $notification;
+            }
+            unset($notification);
+        }
+        return $ret;
+    }
+
+// TODO: Need this??
+    /**
+     * Count Notifications
+     *
+     * @param   object  $criteria   {@link CriteriaElement}
+     *
+     * @return  int     Count
+     **/
+    function getCount($criteria = null)
+    {
+        $sql = 'SELECT COUNT(*) FROM '.$this->db->prefix('xoopsnotifications');
+        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
+            $sql .= ' '.$criteria->renderWhere();
+        }
+        if (!$result =& $this->db->query($sql)) {
+            return 0;
+        }
+        list($count) = $this->db->fetchRow($result);
+        return $count;
+    }
+
+    /**
+     * Delete multiple notifications
+     *
+     * @param   object  $criteria   {@link CriteriaElement}
+     *
+     * @return  bool
+     **/
+    function deleteAll($criteria = null)
+    {
+        $sql = 'DELETE FROM '.$this->db->prefix('xoopsnotifications');
+        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
+            $sql .= ' '.$criteria->renderWhere();
+        }
+        if (!$result = $this->db->query($sql)) {
+            return false;
+        }
+        return true;
+    }
+
+// Need this??
+    /**
+     * Change a value in multiple notifications
+     *
+     * @param   string  $fieldname  Name of the field
+     * @param   string  $fieldvalue Value to write
+     * @param   object  $criteria   {@link CriteriaElement}
+     *
+     * @return  bool
+     **/
+/*
+    function updateAll($fieldname, $fieldvalue, $criteria = null)
+    {
+        $set_clause = is_numeric($fieldvalue) ? $filedname.' = '.$fieldvalue : $filedname." = '".$fieldvalue."'";
+        $sql = 'UPDATE '.$this->db->prefix('xoopsnotifications').' SET '.$set_clause;
+        if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
+            $sql .= ' '.$criteria->renderWhere();
+        }
+        if (!$result = $this->db->query($sql)) {
+            return false;
+        }
+        return true;
+    }
+*/
+
+	// TODO: rename this...
+	// Also, should we have get by module, get by category, etc...??
+
+	function &getNotification ($module_id, $category, $item_id, $event, $user_id)
+	{
+		$criteria = new CriteriaCompo();
+		$criteria->add(new Criteria('not_modid', intval($module_id)));
+		$criteria->add(new Criteria('not_category', $category));
+		$criteria->add(new Criteria('not_itemid', intval($item_id)));
+		$criteria->add(new Criteria('not_event', $event));
+		$criteria->add(new Criteria('not_uid', intval($user_id)));
+		$objects = $this->getObjects($criteria);
+		if (count($objects) == 1) {
+			return $objects[0];
+		}
+		return false;
+	}
+
+	/**
+	 * Determine if a user is subscribed to a particular event in
+	 * a particular module.
+	 *
+	 * @param  string  $category  Category of notification event
+	 * @param  int     $item_id   Item ID of notification event
+	 * @param  string  $event     Event
+     * @param  int     $module_id ID of module (default current module)
+	 * @param  int     $user_id   ID of user (default current user)
+	 * return int  0 if not subscribe; non-zero if subscribed
+	 */
+
+	function isSubscribed ($category, $item_id, $event, $module_id, $user_id)
+	{
+		$criteria = new CriteriaCompo();
+		$criteria->add(new Criteria('not_modid', intval($module_id)));
+		$criteria->add(new Criteria('not_category', $category));
+		$criteria->add(new Criteria('not_itemid', intval($item_id)));
+		$criteria->add(new Criteria('not_event', $event));
+		$criteria->add(new Criteria('not_uid', intval($user_id)));
+		return $this->getCount($criteria);
+		
+	}
+
+
+	// TODO: how about a function to subscribe a whole group of users???
+	// e.g. if we want to add all moderators to be notified of subscription
+	// of new threads...
+
+    /**
+     * Subscribe for notification for an event(s)
+     *
+     * @param  string $category    category of notification
+     * @param  int    $item_id     ID of the item
+     * @param  mixed  $events      event string or array of events
+     * @param  int    $mode        force a particular notification mode
+     *                             (e.g. once_only) (default to current user preference)
+     * @param  int    $module_id   ID of the module (default to current module)
+     * @param  int    $user_id     ID of the user (default to current user)
+     **/
+    function subscribe ($category, $item_id, $events, $mode=null, $module_id=null, $user_id=null)
+    {
+        if (!isset($user_id)) {
+            global $xoopsUser;
+            if (empty($xoopsUser)) {
+                return false;  // anonymous cannot subscribe
+            } else {
+                $user_id = $xoopsUser->getVar('uid');
+            }
+        }
+
+        if (!isset($module_id)) {
+            global $xoopsModule;
+            $module_id = $xoopsModule->getVar('mid');
+        }
+
+        if (!isset($mode)) {
+            $user = new XoopsUser($user_id);
+            $mode = $user->getVar('notify_mode');
+        }
+
+        if (!is_array($events)) $events = array($events);
+        foreach ($events as $event) {
+            if ($notification =& $this->getNotification($module_id, $category, $item_id, $event, $user_id)) {
+                if ($notification->getVar('not_mode') != $mode) {
+                    $this->updateByField($notification, 'not_mode', $mode);
+            	}
+            } else {
+                $notification =& $this->create();
+                $notification->setVar('not_modid', $module_id);
+                $notification->setVar('not_category', $category);
+                $notification->setVar('not_itemid', $item_id);
+                $notification->setVar('not_uid', $user_id);
+                $notification->setVar('not_event', $event);
+                $notification->setVar('not_mode', $mode);
+                $this->insert($notification);
+            }
+        }
+    }
+
+
+// TODO: this will be to provide a list of everything a particular
+// user has subscribed to... e.g. for on the 'Profile' page, similar
+// to how we see the various posts etc. that the user has made.
+// We may also want to have a function where we can specify module id
+    /**
+     * Get a list of notifications by user ID
+     *
+     * @param  int  $user_id  ID of the user
+     *
+     * @return array  Array of {@link XoopsNotification} objects
+     **/
+    function &getByUser ($user_id)
+    {
+        $criteria = new Criteria ('not_uid', $user_id);
+        return $this->getObjects($criteria, true);
+    }
+
+	// TODO: rename this??
+    /**
+     * Get a list of notification events for the current item/mod/user
+     *
+     **/
+	function &getSubscribedEvents ($category, $item_id, $module_id, $user_id)
+    {
+        $criteria = new CriteriaCompo();
+        $criteria->add (new Criteria('not_modid', $module_id));
+        $criteria->add (new Criteria('not_category', $category));
+        if ($item_id) {
+            $criteria->add (new Criteria('not_itemid', $item_id));
+        }
+        $criteria->add (new Criteria('not_uid', $user_id));
+        $results = $this->getObjects($criteria, true);
+        $ret = array();
+        foreach (array_keys($results) as $i) {
+            $ret[] = $results[$i]->getVar('not_event');
+        }
+        return $ret;
+    }
+
+// TODO: is this a useful function?? (Copied from comment_handler)
+    /**
+     * Retrieve items by their ID
+     *
+     * @param   int     $module_id  Module ID
+     * @param   int     $item_id    Item ID
+     * @param   string  $order      Sort order
+     *
+     * @return  array   Array of {@link XoopsNotification} objects
+     **/
+    function &getByItemId($module_id, $item_id, $order = null, $status = null)
+    {
+        $criteria = new CriteriaCompo(new Criteria('com_modid', intval($module_id)));
+        $criteria->add(new Criteria('com_itemid', intval($item_id)));
+        if (isset($status)) {
+            $criteria->add(new Criteria('com_status', intval($status)));
+        }
+        if (isset($order)) {
+            $criteria->setOrder($order);
+        }
+        return $this->getObjects($criteria);
+    }
+
+
+    /**
+     * Send notifications to users
+     *
+     * @param  string $category   notification category
+     * @param  int $item_id    ID of the item
+     * @param  string  $event  notification event
+     * @param  array  $extra_tags array of substitutions for template to be
+     *                             merged with the one from function..
+	 * @param  array  $user_list  only notify the selected users
+     * @param  int $module_id  ID of the module
+     * @param  int $omit_user_id    ID of the user to omit from notifications. (default to current user).  set to 0 for all users to receive notification.
+     **/
+    // TODO:(?) - pass in an event LIST.  This will help to avoid
+    // problem of sending people multiple emails for similar events.
+    // BUT, then we need an array of mail templates, etc...  Unless
+    // mail templates can include logic in the future, then we can
+    // tailor the mail so it makes sense for any of the possible
+    // (or combination of) events.
+
+    function triggerEvents ($category, $item_id, $events, $extra_tags=array(), $user_list=array(), $module_id=null, $omit_user_id=null)
+    {
+        if (!is_array($events)) {
+            $events = array($events);
+        }
+        foreach ($events as $event) {
+            $this->triggerEvent($category, $item_id, $event, $extra_tags, $user_list, $module_id, $omit_user_id);
+        }
+    }
+
+    function triggerEvent ($category, $item_id, $event, $extra_tags=array(), $user_list=array(), $module_id=null, $omit_user_id=null)
+    {
+
+        if (!isset($module_id)) {
+            global $xoopsModule;
+            $module =& $xoopsModule;
+            $module_id = !empty($xoopsModule) ? $xoopsModule->getVar('mid') : 0;
+        } else {
+            $module_handler =& xoops_gethandler('module');
+            $module =& $module_handler->get($module_id);
+        }
+		// Get Config Array form xoops_version.php
+        $not_config = $module->getInfo('notification');
+		// 
+		$event_correct = false;
+		foreach ($not_config['event'] as $event_config) {
+			if (($event_config['name'] == $event)&&($event_config['category'] == $category)) {
+				$event_correct = true;
+				break;
+			}
+		}
+        // RaiseEvent 'Legacy.Notify.Trigger'
+        //  Delegate may hanldle notified event
+		//  varArgs :
+		//      'category'     [I] : Paramater $category of triggerEvent()
+		//      'event'        [I] : Paramater $event of triggerEvent()
+		//      'itemId'       [I] : Paramater $item_id of triggerEvent()
+		//      'extraTags'    [I] : Paramater $extra_tags of triggerEvent()
+		//      'userList'     [I] : Paramater $user_list of triggerEvent()
+		//      'omitUid'      [I] : Paramater $omit_user_id of triggerEvent()
+		//      'module'       [I] : Paramater $module_id of triggerEvent() , or currenr $xoopsModule
+		//      'eventConfig'  [I] : $modversion['notification'] Array , defined in xoops_version.php
+		//      'force_return' [O] : If force return this triggerEvents method, set it True
+        //
+		if ($event_correct) {
+			$varArgs  = array('category' => $category,
+							'event' => $event,
+							'itemId' => $item_id,
+							'extraTags' => $extra_tags,
+							'module' => &$module,
+							'userList' => $user_list,
+							'omitUid' => $omit_user_id,
+							'eventConfig' => $not_config,
+							'force_return' => false,
+						);
+	        if ($result =& XCube_EventUtils::quickRaiseEvent('Legacy.Notify.Trigger', $varArgs )) {
+	        	if ($result['force_return']) return;
+	        }
+			
+		}
+
+		// Check if event is enabled
+		$config_handler =& xoops_gethandler('config');
+		$mod_config =& $config_handler->getConfigsByCat(0,$module->getVar('mid'));
+		if (empty($mod_config['notification_enabled'])) {
+			return false;
+		}
+		$category_info =& notificationCategoryInfo ($category, $module_id);
+		$event_info =& notificationEventInfo ($category, $event, $module_id);
+		if (!in_array(notificationGenerateConfig($category_info,$event_info,'option_name'),$mod_config['notification_events']) && empty($event_info['invisible'])) {
+			return false;
+		}
+
+        if (!isset($omit_user_id)) {
+            global $xoopsUser;
+            if (!empty($xoopsUser)) {
+                $omit_user_id = $xoopsUser->getVar('uid');
+            } else {
+                $omit_user_id = 0;
+            }
+        }
+        $criteria = new CriteriaCompo();
+        $criteria->add(new Criteria('not_modid', intval($module_id)));
+        $criteria->add(new Criteria('not_category', $category));
+        $criteria->add(new Criteria('not_itemid', intval($item_id)));
+        $criteria->add(new Criteria('not_event', $event));
+        $mode_criteria = new CriteriaCompo();
+        $mode_criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_SENDALWAYS), 'OR');
+        $mode_criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_SENDONCETHENDELETE), 'OR');
+        $mode_criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT), 'OR');
+        $criteria->add($mode_criteria);
+		if (!empty($user_list)) {
+			$user_criteria = new CriteriaCompo();
+			foreach ($user_list as $user) {
+				$user_criteria->add (new Criteria('not_uid', $user), 'OR');
+			}
+			$criteria->add($user_criteria);
+		}
+        $notifications =& $this->getObjects($criteria);
+        if (empty($notifications)) {
+            return;
+        }
+
+        // Add some tag substitutions here
+
+        $tags = array();
+        if (!empty($not_config)) {
+            if (!empty($not_config['tags_file'])) {
+                $tags_file = XOOPS_ROOT_PATH . '/modules/' . $module->getVar('dirname') . '/' . $not_config['tags_file'];
+                if (file_exists($tags_file)) {
+                    include_once $tags_file;
+                    if (!empty($not_config['tags_func'])) {
+                        $tags_func = $not_config['tags_func'];
+                        if (function_exists($tags_func)) {
+                            $tags = $tags_func($category, intval($item_id), $event);
+                        }
+                    }
+                }
+            }
+			// RMV-NEW
+			if (!empty($not_config['lookup_file'])) {
+				$lookup_file = XOOPS_ROOT_PATH . '/modules/' . $module->getVar('dirname') . '/' . $not_config['lookup_file'];
+				if (file_exists($lookup_file)) {
+					include_once $lookup_file;
+					if (!empty($not_config['lookup_func'])) {
+						$lookup_func = $not_config['lookup_func'];
+						if (function_exists($lookup_func)) {
+							$item_info = $lookup_func($category, intval($item_id));
+						}
+					}
+				}
+			}
+        }
+		$tags['X_ITEM_NAME'] = !empty($item_info['name']) ? $item_info['name'] : '[' . _NOT_ITEMNAMENOTAVAILABLE . ']';
+		$tags['X_ITEM_URL']  = !empty($item_info['url']) ? $item_info['url'] : '[' . _NOT_ITEMURLNOTAVAILABLE . ']';
+		$tags['X_ITEM_TYPE'] = !empty($category_info['item_name']) ? $category_info['title'] : '[' . _NOT_ITEMTYPENOTAVAILABLE . ']';
+        $tags['X_MODULE'] = $module->getVar('name');
+        $tags['X_MODULE_URL'] = XOOPS_URL . '/modules/' . $module->getVar('dirname') . '/';
+        $tags['X_NOTIFY_CATEGORY'] = $category;
+        $tags['X_NOTIFY_EVENT'] = $event;
+
+        $template_dir = $event_info['mail_template_dir'];
+        $template = $event_info['mail_template'] . '.tpl';
+        $subject = $event_info['mail_subject'];
+
+		foreach ($notifications as $notification) {
+			if (empty($omit_user_id) || $notification->getVar('not_uid') != $omit_user_id) {
+				// user-specific tags
+				//$tags['X_UNSUBSCRIBE_URL'] = 'TODO';
+				// TODO: don't show unsubscribe link if it is 'one-time' ??
+				$tags['X_UNSUBSCRIBE_URL'] = XOOPS_URL . '/notifications.php';
+        		$tags = array_merge ($tags, $extra_tags);
+
+				$notification->notifyUser($template_dir, $template, $subject, $tags);
+			}
+		}
+	}
+
+
+    /**
+     * Delete all notifications for one user
+     *
+     * @param   int $user_id  ID of the user
+     * @return  bool
+     **/
+    function unsubscribeByUser ($user_id)
+    {
+        $criteria = new Criteria('not_uid', intval($user_id));
+        return $this->deleteAll($criteria);
+    }
+
+
+// TODO: allow these to use current module, etc...
+
+    /**
+     * Unsubscribe notifications for an event(s).
+     *
+     * @param  string  $category    category of the events
+     * @param  int     $item_id     ID of the item
+     * @param  mixed   $events      event string or array of events
+     * @param  int     $module_id   ID of the module (default current module)
+     * @param  int     $user_id     UID of the user (default current user)
+     *
+     * @return bool
+     **/
+
+    function unsubscribe ($category, $item_id, $events, $module_id=null, $user_id=null)
+    {
+        if (!isset($user_id)) {
+            global $xoopsUser;
+            if (empty($xoopsUser)) {
+                return false;  // anonymous cannot subscribe
+            } else {
+                $user_id = $xoopsUser->getVar('uid');
+            }
+        }
+
+        if (!isset($module_id)) {
+            global $xoopsModule;
+            $module_id = $xoopsModule->getVar('mid');
+        }
+
+        $criteria = new CriteriaCompo();
+        $criteria->add (new Criteria('not_modid', intval($module_id)));
+        $criteria->add (new Criteria('not_category', $category));
+        $criteria->add (new Criteria('not_itemid', intval($item_id)));
+        $criteria->add (new Criteria('not_uid', intval($user_id)));
+        if (!is_array($events)) {
+            $events = array($events);
+        }
+        $event_criteria = new CriteriaCompo();
+        foreach ($events as $event) {
+            $event_criteria->add (new Criteria('not_event', $event), 'OR');
+        }
+        $criteria->add($event_criteria);
+        return $this->deleteAll($criteria);
+    }
+
+
+    // TODO: When 'update' a module, may need to switch around some
+    //  notification classes/IDs...  or delete the ones that no longer
+    //  exist.
+
+    /**
+     * Delete all notifications for a particular module
+     *
+     * @param   int $module_id  ID of the module
+     * @return  bool
+     **/
+    function unsubscribeByModule ($module_id)
+    {
+        $criteria = new Criteria('not_modid', intval($module_id));
+        return $this->deleteAll($criteria);
+    }
+
+
+    /**
+     * Delete all subscriptions for a particular item.
+     *
+     * @param  int    $module_id  ID of the module to which item belongs
+     * @param  string $category   Notification category of the item
+     * @param  int    $item_id    ID of the item
+     *
+     * @return bool
+     **/
+    function unsubscribeByItem ($module_id, $category, $item_id)
+	{
+        $criteria = new CriteriaCompo();
+        $criteria->add (new Criteria('not_modid', intval($module_id)));
+        $criteria->add (new Criteria('not_category', $category));
+        $criteria->add (new Criteria('not_itemid', intval($item_id)));
+        return $this->deleteAll($criteria);
+    }
+
+
+    /**
+     * Perform notification maintenance activites at login time.
+     * In particular, any notifications for the newly logged-in
+     * user with mode XOOPS_NOTIFICATION_MODE_WAITFORLOGIN are
+     * switched to mode XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT.
+     *
+     * @param  int  $user_id  ID of the user being logged in
+     **/
+    function doLoginMaintenance ($user_id)
+    {
+        $criteria = new CriteriaCompo();
+        $criteria->add (new Criteria('not_uid', intval($user_id)));
+        $criteria->add (new Criteria('not_mode', XOOPS_NOTIFICATION_MODE_WAITFORLOGIN));
+
+        $notifications = $this->getObjects($criteria, true);
+        foreach ($notifications as $n) {
+            $n->setVar('not_mode', XOOPS_NOTIFICATION_MODE_SENDONCETHENWAIT);
+            $this->insert($n);
+        }
+    }
+
+
+    /**
+     * Update
+     *
+     * @param   object  &$notification  {@link XoopsNotification} object
+     * @param   string  $field_name     Name of the field
+     * @param   mixed   $field_value    Value to write
+     *
+     * @return  bool
+     **/
+    function updateByField(&$notification, $field_name, $field_value)
+    {
+        $notification->unsetNew();
+        $notification->setVar($field_name, $field_value);
+        return $this->insert($notification);
+    }
+
+
+}
+?>


xoops-cvslog メーリングリストの案内
Back to archive index