diff options
| author | Max Kremmel <xing@synapse.plus.com> | 2006-12-20 20:50:17 +0000 |
|---|---|---|
| committer | Max Kremmel <xing@synapse.plus.com> | 2006-12-20 20:50:17 +0000 |
| commit | 869cc91bfaa459a50fb2825349f1575f0fa80cd3 (patch) | |
| tree | 25eb1e738cc4d45e1687113349565dafb179d7f1 | |
| parent | 87ea0a1c3d8c8de9f949b7a50434eda84897d11b (diff) | |
| download | messages-869cc91bfaa459a50fb2825349f1575f0fa80cd3.tar.gz messages-869cc91bfaa459a50fb2825349f1575f0fa80cd3.tar.bz2 messages-869cc91bfaa459a50fb2825349f1575f0fa80cd3.zip | |
massive messages cleanup, rename files to closer match bitweaver standard. create messages class only when needed and don't crete global class on evey page load. still some work needed with broadcast messages
| -rw-r--r-- | Messages.php | 475 | ||||
| -rw-r--r-- | bit_setup_inc.php | 5 | ||||
| -rw-r--r-- | broadcast.php | 84 | ||||
| -rw-r--r-- | compose.php | 16 | ||||
| -rw-r--r-- | contact.php | 7 | ||||
| -rw-r--r-- | message_box.php | 63 | ||||
| -rw-r--r-- | messages_lib.php | 397 | ||||
| -rw-r--r-- | read.php | 21 | ||||
| -rw-r--r-- | templates/broadcast.tpl | 74 | ||||
| -rw-r--r-- | templates/compose.tpl (renamed from templates/messages_compose.tpl) | 1 | ||||
| -rw-r--r-- | templates/mailbox.tpl (renamed from templates/messages_mailbox.tpl) | 37 | ||||
| -rw-r--r-- | templates/message_notification.tpl (renamed from templates/messages_message_notification.tpl) | 8 | ||||
| -rw-r--r-- | templates/messages_broadcast.tpl | 55 | ||||
| -rw-r--r-- | templates/preferences_inc.tpl (renamed from templates/messages_preferences_inc.tpl) | 0 | ||||
| -rw-r--r-- | templates/read.tpl (renamed from templates/messages_read.tpl) | 1 |
15 files changed, 638 insertions, 606 deletions
diff --git a/Messages.php b/Messages.php new file mode 100644 index 0000000..7cf03d1 --- /dev/null +++ b/Messages.php @@ -0,0 +1,475 @@ +<?php +/** +* message package modules +* +* @author +* @version $Revision: 1.1 $ +* @package messages +*/ + +/** +* Messages base class +* +* @package messages +* @subpackage Messages +*/ +class Messages extends BitBase { + function Messages() { + BitBase::BitBase(); + } + + /** + * postMessage + * + * @param array $pParamHash + * @access public + * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure + */ + function postMessage( $pParamHash ) { + global $gBitSmarty, $gBitUser, $gBitSystem; + + if( $this->verifyMessage( $pParamHash ) ) { + $this->mDb->associateInsert( BIT_DB_PREFIX."messages", $pParamHash['message_store'] ); + // Now check if the user should be notified by email + if( $gBitUser->getPreference( 'messages_min_priority', 3 ) <= $priority && FALSE) { + if( !empty( $pParamHash['userInfo']['email'] ) ) { + $gBitSmarty->assign( 'msgHash', $pParamHash['message_store'] ); + $gBitSmarty->assign( 'from', stripslashes( $gBitUser->getDisplayName() ) ); + + @mail( + $pParamHash['userInfo']['email'], + tra( 'New message arrived from ' ).$gBitSystem->getConfig( 'kernel_server_name', $_SERVER["SERVER_NAME"] ), + $gBitSmarty->fetch( 'bitpackage:messages/message_notification.tpl' ), + "From: ".$gBitSystem->getConfig( 'site_sender_email' )."\r\nContent-type: text/plain;charset=utf-8\r\n" + ); + } + } + } + + return( count( $this->mErrors ) == 0 ); + } + + /** + * verifyMessage + * + * @param array $pParamHash + * @access public + * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure + */ + function verifyMessage( &$pParamHash ) { + global $gBitSystem, $gBitUser; + + if( !empty( $pParamHash['to_login'] ) ) { + $pParamHash['userInfo'] = $userInfo = $gBitUser->getUserInfo( array( 'login' => $pParamHash['to_login'] ) ); + + // if that didn't work, we'll see if we were passed a user_id + if( empty( $userInfo ) && @BitBase::verifyId( $pParamHash['to_login'] ) ) { + $userInfo = $gBitUser->getUserInfo( array('user_id' => $pParamHash['to_login'] ) ); + } + } else { + $this->mErrors['to_login'] = tra( 'No message recipient was specified' ); + } + + if( empty( $userInfo ) ) { + $this->mErrors['compose'] = tra( 'Unknown user' ).": ".$pParamHash['to_login']; + } elseif( empty( $this->mErrors ) && $gBitUser->getPreference( 'messages_allow_messages', 'y', $userInfo['user_id'] ) ) { + // neither subject nor body may contain html - users can use tikiwiki syntax for styling + if( !empty( $pParamHash['subject'] ) ) { + $pParamHash['message_store']['subject'] = strip_tags( $pParamHash['subject'] ); + } else { + $this->mErrors['subject'] = tra( "The message requires a subject" ); + } + + if( !empty( $pParamHash['body'] ) ) { + $pParamHash['message_store']['body'] = strip_tags( $pParamHash['body'] ); + } else { + $this->mErrors['body'] = tra( "The message requires a body" ); + } + + $pParamHash['message_store']['to_user_id'] = $userInfo['user_id']; + $pParamHash['message_store']['from_user_id'] = $gBitUser->mUserId; + $pParamHash['message_store']['msg_date'] = $gBitSystem->mServerTimestamp->getUTCTime(); + $pParamHash['message_store']['msg_to'] = !empty( $pParamHash['msg_to'] ) ? $pParamHash['msg_to'] : ''; + $pParamHash['message_store']['msg_cc'] = !empty( $pParamHash['msg_cc'] ) ? $pParamHash['msg_cc'] : NULL; + $pParamHash['message_store']['msg_bcc'] = !empty( $pParamHash['msg_bcc'] ) ? $pParamHash['msg_bcc'] : NULL; + $pParamHash['message_store']['is_read'] = !empty( $pParamHash['is_read'] ) ? $pParamHash['is_read'] : 'n'; + $pParamHash['message_store']['is_replied'] = !empty( $pParamHash['is_replied'] ) ? $pParamHash['is_replied'] : 'n'; + $pParamHash['message_store']['is_flagged'] = !empty( $pParamHash['is_flagged'] ) ? $pParamHash['is_flagged'] : 'n'; + $pParamHash['message_store']['priority'] = !empty( $pParamHash['priority'] ) ? $pParamHash['priority'] : '3'; + $pParamHash['message_store']['group_id'] = !empty( $pParamHash['group_id'] ) ? $pParamHash['group_id'] : NULL; + + if( empty( $this->mErrors ) ) { + $pParamHash['message_store']['hash'] = md5( $pParamHash['subject'].$pParamHash['body'] ); + $query = " + SELECT COUNT(*) + FROM `".BIT_DB_PREFIX."messages` + WHERE `to_user_id`=? AND `from_user_id`=? AND `hash`=? + "; + $bindVars[] = $userInfo['user_id']; + $bindVars[] = $gBitUser->mUserId; + $bindVars[] = $pParamHash['message_store']['hash']; + + if( $this->mDb->getOne( $query, $bindVars ) ) { + $this->mErrors['compose'] = $pParamHash['to_login'].' '.tra( 'has already received this message' ); + } + } + } else { + $this->mErrors['allow_messages'] = tra( "This user doesn't want to recieve messages" ); + } + + return( count( $this->mErrors ) == 0 ); + } + + function getList( &$pListHash ) { + global $gBitUser; + + // ====================== Private Messages ====================== + if( empty( $pListHash['sort_mode'] ) ) { + $pListHash['sort_mode'] = 'msg_date_desc'; + } + + LibertyContent::prepGetList( $pListHash ); + + $ret = $bindVars = array(); + $whereSql = ''; + $bindVars[] = $gBitUser->mUserId; + + if( !empty( $pListHash['priority'] ) ) { + $whereSql .= " AND mm.`priority`=? "; + $bindVars[] = $pListHash['priority']; + } + + if( !empty( $pListHash['flag'] ) && !empty( $pListHash['flagval'] ) ) { + $whereSql .= " AND mm.`{$pListHash['flag']}`=? "; + $bindVars[] = $pListHash['flagval']; + } + + if( !empty( $pListHash['find'] ) ) { + $whereSql .= " AND( UPPER( mm.`subject` ) LIKE ? OR UPPER( mm.`body` ) LIKE ? ) "; + $bindVars[] = '%'.strtoupper( $pListHash['find'] ).'%'; + $bindVars[] = '%'.strtoupper( $pListHash['find'] ).'%'; + } + + $query = " + SELECT + uu.`login`, uu.`real_name`, uu.`user_id`, + mm.* + FROM `".BIT_DB_PREFIX."messages` mm + INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON( mm.`from_user_id`=uu.`user_id` ) + WHERE mm.`to_user_id`=? $whereSql + ORDER BY ".$this->mDb->convert_sortmode( $pListHash['sort_mode'] ); + $normalMessages = $this->mDb->getAll( $query, $bindVars ); + + // Get the total count of private messages + $query = "SELECT COUNT(*) FROM `".BIT_DB_PREFIX."messages` mm WHERE mm.`to_user_id`=? $whereSql"; + $cant = $this->mDb->getOne( $query, $bindVars ); + + + + + // ====================== Broadcast Messages ====================== + //array_unshift( $bindVars, $gBitUser->mUserId, ROOT_USER_ID, $gBitUser->mUserId ); + $bindVars = array( $gBitUser->mUserId, ROOT_USER_ID, $gBitUser->mUserId ); + + $whereSql = ''; + + if( !empty( $pListHash['priority'] ) ) { + $whereSql .= " AND mm.`priority`=? "; + $bindVars[] = $pListHash['priority']; + } + + if( !empty( $pListHash['flag'] ) && !empty( $pListHash['flagval'] ) ) { + $whereSql .= " AND msm.`{$pListHash['flag']}`=? "; + $bindVars[] = $pListHash['flagval']; + } + + if( !empty( $pListHash['find'] ) ) { + $whereSql .= " AND( UPPER( mm.`subject` ) LIKE ? OR UPPER( mm.`body` ) LIKE ? ) "; + $bindVars[] = '%'.strtoupper( $pListHash['find'] ).'%'; + $bindVars[] = '%'.strtoupper( $pListHash['find'] ).'%'; + } + + $query = " + SELECT + uu.`login`, uu.`real_name`, uu.`user_id`, mm.`msg_id` as `msg_id_foo`, + msm.*, + mm.`msg_to`, mm.`msg_cc`, mm.`msg_bcc`, mm.`subject`, mm.`body`, mm.`hash`, mm.`msg_date`, mm.`priority` + FROM `".BIT_DB_PREFIX."messages` mm + INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (mm.`from_user_id` = uu.`user_id`) + LEFT OUTER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) + WHERE mm.`to_user_id`=? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) $whereSql + ORDER BY ".$this->mDb->convert_sortmode( $pListHash['sort_mode'] ); + $result = $this->mDb->query( $query, $bindVars ); + + $systemMessages = array(); + while( $aux = $result->fetchRow() ) { + $aux['is_broadcast_message'] = TRUE; + $aux['msg_id'] = $aux['msg_id_foo']; // Due to the left outer join this madness is neccessary + unset( $aux['msg_id_foo'] ); + if( $aux['is_hidden'] != 'y' ) { + $systemMessages[] = $aux; + } + } + + $query = " + SELECT COUNT(mm.`msg_id`) + FROM `".BIT_DB_PREFIX."messages` mm + LEFT OUTER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) + WHERE mm.`to_user_id`=? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) $whereSql"; + $cant2 = $this->mDb->getOne($query, $bindVars); + + + + + // ====================== insane message mergin and sorting ====================== + $sort_mode = $pListHash['sort_mode']; + $ret = array(); + $normalMessageCount = count($normalMessages); + $systemMessageCount = count($systemMessages); + $normalMsg = $systemMsg = NULL; + if (strpos($sort_mode, '_asc') !== FALSE) { + $sortType = '_asc'; + $sortKey = substr($sort_mode, 0, strlen($sort_mode)-4); + } else { + $sortType = '_desc'; + $sortKey = substr($sort_mode, 0, strlen($sort_mode)-5); + } + + while ($normalMessageCount > 0 || $systemMessageCount > 0) { + if (!$normalMsg && $normalMessageCount > 0) { + $normalMsg = array_shift($normalMessages); + } + if (!$systemMsg && $systemMessageCount > 0) { + $systemMsg = array_shift($systemMessages); + } + if ($normalMessageCount == 0) { + $ret[] = $systemMsg; + $systemMsg = NULL; + $systemMessageCount--; + } elseif ($systemMessageCount == 0) { + $ret[] = $normalMsg; + $normalMsg = NULL; + $normalMessageCount--; + }elseif ($sortType == '_asc') { + if ($normalMsg[$sortKey] < $systemMsg[$sortKey]) { + $ret[] = $normalMsg; + $normalMsg = NULL; + $normalMessageCount--; + } else { + $ret[] = $systemMsg; + $systemMsg = NULL; + $systemMessageCount--; + } + } else { + if ($normalMsg[$sortKey] > $systemMsg[$sortKey]) { + $ret[] = $normalMsg; + $normalMsg = NULL; + $normalMessageCount--; + } else { + $ret[] = $systemMsg; + $systemMsg = NULL; + $systemMessageCount--; + } + } + } + + // set some default values + foreach( $ret as $key => $msg ) { + $msg['len'] = strlen( $msg['body'] ); + if( empty( $msg['is_read'] ) ) { + $msg['is_read'] = 'n'; + } + if( empty( $msg['subject'] ) ) { + $msg['subject'] = tra( 'none' ); + } + $ret[$key] = $msg; + } + + + $pListHash["cant"] = $cant + $cant2; + LibertyContent::postGetList( $pListHash ); + return $ret; + } + + function flagMessage( $pUserId, $msg_id, $flag, $val ) { + if (!$msg_id) + return false; + if ($this->isSystemMessage($msg_id)) { + $query = "SELECT COUNT(*) FROM `".BIT_DB_PREFIX."messages_system_map` WHERE `to_user_id` = ? AND `msg_id` = ?"; + $rowExists = $this->mDb->getOne($query, array($pUserId, $msg_id)); + if ($rowExists) { + $query = "UPDATE `".BIT_DB_PREFIX."messages_system_map` SET `$flag`=? WHERE `to_user_id` = ? AND `msg_id` = ?"; + $this->mDb->query($query, array($val, $pUserId, (int)$msg_id)); + } else { + $query = "INSERT INTO `".BIT_DB_PREFIX."messages_system_map` (`msg_id`, `to_user_id`, `$flag`) VALUES (?,?,?)"; + $this->mDb->query($query, array((int)$msg_id, $pUserId, $val)); + } + + } else { + $query = "UPDATE `".BIT_DB_PREFIX."messages` SET `$flag`=? where `to_user_id`=? and `msg_id`=?"; + $this->mDb->query($query,array($val,$pUserId,(int)$msg_id)); + } + } + + function expunge($pUserId, $msg_id) { + if (!$msg_id) + return false; + if ($this->isSystemMessage($msg_id)) { + // We just mark this user's messages_system_map row is_hidden = 'y' + $query = "UPDATE `".BIT_DB_PREFIX."messages_system_map` SET `is_hidden` = 'y' WHERE `to_user_id` = ? AND `msg_id` = ?"; + $this->mDb->query($query, array($pUserId, $msg_id)); + } else { + $query = "delete from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `msg_id`=?"; + $this->mDb->query($query,array($pUserId,(int)$msg_id)); + } + } + + function getNextMessage($pUserId, $msg_id, $sort_mode, $find, $flag, $flagval, $prio) { + if (!$msg_id) + return 0; + + $mid = ""; + $bindvars = array($pUserId,(int)$msg_id); + if ($prio) { + $mid.= " and priority=? "; + $bindvars[] = $prio; + } + + if ($flag) { + // Process the flags + $mid.= " and `$flag`=? "; + $bindvars[] = $flagval; + } + if ($find) { + $findesc = '%'.strtoupper( $find ).'%'; + $mid.= " and (UPPER(`subject`) like ? or UPPER(`body`) like ?)"; + $bindvars[] = $findesc; + $bindvars[] = $findesc; + } + + $query = "select min(`msg_id`) as `nextmsg` from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `msg_id` > ? $mid "; + $result = $this->mDb->query($query,$bindvars,1,0); + $res = $result->fetchRow(); + + if (!$res) + return false; + return $res['nextmsg']; + } + + function getPrevMessage($pUserId, $msg_id, $sort_mode, $find, $flag, $flagval, $prio) { + if (!$msg_id) + return 0; + + $bindvars = array( $pUserId, (int)$msg_id ); + $mid=""; + if ($prio) { + $mid.= " AND priority=? "; + $bindvars[] = $prio; + } + + if ($flag) { + // Process the flags + $mid.= " AND `$flag`=? "; + $bindvars[] = $flagval; + } + if ($find) { + $findesc = '%'.strtoupper( $find ).'%'; + $mid.= " and (UPPER(`subject`) like ? or UPPER(`body`) like ?)"; + $bindvars[] = $findesc; + $bindvars[] = $findesc; + } + $query = "select max(`msg_id`) as `prevmsg` from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `msg_id` < ? $mid"; + $result = $this->mDb->query( $query, $bindvars, 1, 0 ); + $res = $result->fetchRow(); + + if (!$res) + return false; + + return $res['prevmsg']; + } + + function getMessage( $pUserId, $msg_id ) { + if (!$this->isSystemMessage($msg_id)) { + $bindvars = array( $pUserId, (int)$msg_id ); + $query = "select * from `".BIT_DB_PREFIX."messages` WHERE `to_user_id`=? and `msg_id`=?"; + $result = $this->mDb->query($query,$bindvars); + $res = $result->fetchRow(); + } else { + $bindvars = array($pUserId, (int)$msg_id); + $query = "SELECT msm.*, ug.`group_name`, mm.`from_user_id`, mm.`msg_id` as `msg_id_foo`, mm.`msg_to`, mm.`msg_cc`, mm.`msg_bcc`, mm.`subject`, mm.`body`, mm.`hash`, mm.`msg_date` + FROM `".BIT_DB_PREFIX."messages` mm + INNER JOIN `".BIT_DB_PREFIX."users_groups` ug ON (ug.`group_id` = mm.`group_id`) + LEFT OUTER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) + WHERE mm.`msg_id` = ?"; + $result = $this->mDb->query($query, $bindvars); + $res = $result->fetchRow(); + $res['is_broadcast_message'] = TRUE; + } + + $content = new LibertyContent(); + global $gBitSystem; + $res['parsed'] = $content->parseData( $res['body'], $gBitSystem->getConfig( 'default_format')); + + if (empty($res['subject'])) + $res['subject'] = tra('NONE'); + + return $res; + } + + /*shared*/ + function unreadMessages( $pUserId ) { + // Standard user to user messages + $normalCount = $this->mDb->getOne( "select count( * ) from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `is_read`=?",array( $pUserId,'n' ) ); + // Broadcast messages where they have a messages_system_map row but is_read is not yet set + $broadcastCount = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messages` mm INNER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`is_read` <> 'y' AND `is_hidden` <> 'y' AND msm.`to_user_id`= ?) WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id`= ?) ", array($pUserId, ROOT_USER_ID, $pUserId)); + // Broadcast messages where they do not yet have a messages_system_map row + $broadcastCount2 = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messages` mm WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) AND NOT EXISTS ( SELECT msm.`msg_id` FROM `".BIT_DB_PREFIX."messages_system_map` msm WHERE msm.`msg_id` = mm.`msg_id` AND msm.`to_user_id` = ?)", array(ROOT_USER_ID, $pUserId, $pUserId)); + return $normalCount + $broadcastCount + $broadcastCount2; + } + + + + // ==================== system messages ==================== + function postSystemMessage( $pParamHash ) { + $pParamHash['to_login'] = ROOT_USER_ID; + $pParamHash['to'] = ROOT_USER_ID; + + if( @BitBase::verifyId( $pParamHash['group_id'] ) ) { + return $this->postMessage( $pParamHash ); + } else { + $this->mErrors['group_id'] = tra( "You need to specify a group id to broadcast the message to." ); + return FALSE; + } + } + + function getSystemMessageList() { + $sql = " + SELECT * + FROM `".BIT_DB_PREFIX."messages` + WHERE `from_user_id` = ? AND `group_id` IS NOT NULL + "; + $res = $this->mDb->query( $sql, array( ROOT_USER_ID ) ); + return $res->getRows(); + } + + function expungeSystemMessage( $pMessageId = NULL ) { + if( @BitBase::verifyId( $pMessageId ) ) { + $tables = array( "messages_system_map", "messages" ); + foreach( $tables as $table ) { + $sql = "DELETE FROM `".BIT_DB_PREFIX.$table."` WHERE msg_id = ?"; + $rs = $this->mDb->query( $sql, array( $pMessageId ) ); + } + } + } + + function isSystemMessage( $pMessageId = NULL ) { + $ret = FALSE; + if( @BitBase::verifyId( $pMessageId ) ) { + $query = "SELECT COUNT(msg_id) FROM `".BIT_DB_PREFIX."messages` WHERE `to_user_id` = ? AND `msg_id` = ?"; + $ret = $this->mDb->getOne( $query, array( ROOT_USER_ID, $pMessageId ) ); + } + return $ret; + } + +} +?> diff --git a/bit_setup_inc.php b/bit_setup_inc.php index 9921d7e..c226d46 100644 --- a/bit_setup_inc.php +++ b/bit_setup_inc.php @@ -8,8 +8,9 @@ $registerHash = array( $gBitSystem->registerPackage( $registerHash ); if( $gBitSystem->isPackageActive( 'messages' ) && $gBitUser->hasPermission( 'p_messages_send' ) ) { - require_once( MESSAGES_PKG_PATH.'messages_lib.php' ); - $unreadMsgs = $messageslib->user_unread_messages( $gBitUser->mUserId ); + require_once( MESSAGES_PKG_PATH.'Messages.php' ); + $messages = new Messages(); + $unreadMsgs = $messages->unreadMessages( $gBitUser->mUserId ); $gBitSmarty->assign_by_ref( 'unreadMsgs', $unreadMsgs ); } ?> diff --git a/broadcast.php b/broadcast.php index 994cc2a..68d8940 100644 --- a/broadcast.php +++ b/broadcast.php @@ -3,97 +3,51 @@ * message package modules * * @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/broadcast.php,v 1.10 2006/04/11 17:52:10 squareing Exp $ +* @version $Header: /cvsroot/bitweaver/_bit_messages/broadcast.php,v 1.11 2006/12/20 20:50:17 squareing Exp $ * @package messages * @subpackage functions */ -// Copyright (c) 2002-2003, Luis Argerich, Garland Foster, Eduardo Polidor, et. al. -// All Rights Reserved. See copyright.txt for details and a complete list of authors. -// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. - /** * required setup */ require_once( '../bit_setup_inc.php' ); -include_once( MESSAGES_PKG_PATH.'messages_lib.php' ); - -if (!$gBitUser->isRegistered()) { - $gBitSmarty->assign('msg', tra("You are not logged in")); +include_once( MESSAGES_PKG_PATH.'Messages.php' ); - $gBitSystem->display( 'error.tpl' ); - die; +if( !$gBitUser->isRegistered() ) { + $gBitSmarty->fatalError( tra( "You are not logged in" ) ); } $gBitSystem->isPackageActive( 'messages', TRUE ); $gBitSystem->verifyPermission( 'p_messages_broadcast' ); -if (!isset($_REQUEST['to'])) - $_REQUEST['to'] = ''; - -if (!isset($_REQUEST['cc'])) - $_REQUEST['cc'] = ''; - -if (!isset($_REQUEST['bcc'])) - $_REQUEST['bcc'] = ''; - -if (!isset($_REQUEST['subject'])) - $_REQUEST['subject'] = ''; - -if (!isset($_REQUEST['body'])) - $_REQUEST['body'] = ''; - -if (!isset($_REQUEST['priority'])) - $_REQUEST['priority'] = 3; - -$gBitSmarty->assign('to', $_REQUEST['to']); -$gBitSmarty->assign('cc', $_REQUEST['cc']); -$gBitSmarty->assign('bcc', $_REQUEST['bcc']); -$gBitSmarty->assign('subject', $_REQUEST['subject']); -$gBitSmarty->assign('body', $_REQUEST['body']); -$gBitSmarty->assign('priority', $_REQUEST['priority']); +$messages = new Messages(); - - -$gBitSmarty->assign('sent', 0); - -if (isset($_REQUEST['reply']) || isset($_REQUEST['replyall'])) { - $messageslib->flag_message($user, $_REQUEST['msg_id'], 'is_replied', 'y'); +// Configure quicktags list +if( $gBitSystem->getConfig( 'package_quicktags','n' ) == 'y' ) { + include_once( QUICKTAGS_PKG_PATH.'quicktags_inc.php' ); } +$feedback = array(); -if (isset($_REQUEST['send'])) { - $gBitSmarty->assign('sent', 1); - $message = ''; - $errors = array(); - // Validation: - // must have a subject or body non-empty (or both) - if (empty($_REQUEST['subject']) && empty($_REQUEST['body'])) { - $errors[] = tra("Subject or body must not be empty"); - } - if (empty($_REQUEST['group'])) { - $errors[] = tra("You must select a group to broadcast this message to"); - } - - if (!count($errors)) { - $messageslib->post_system_message($_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['group']); - $message = "Message successfully broadcast"; +if( isset( $_REQUEST['send'] ) ) { + if( $messages->postSystemMessage( $_REQUEST ) ) { + $feedback['success'] = "Message successfully broadcast"; + } else { + $feedback['error'] = $messages->mErrors; } - $gBitSmarty->assign('message', $message); - $gBitSmarty->assign('errors', $errors); } - -if ($gBitUser->isAdmin()) { +if( $gBitUser->isAdmin() ) { $pListHash = array('sort_mode' => 'group_id_asc'); - $groups = $gBitUser->getAllGroups($pListHash); + $groups = $gBitUser->getAllGroups( $pListHash ); } else { $gBitUser->loadGroups(); $groups = &$gBitUser->mGroups; } +$gBitSmarty->assign( 'groups', $groups["data"] ); +$gBitSmarty->assign( 'feedback', $feedback ); -$gBitSmarty->assign('groups', $groups["data"]); - -$gBitSystem->display( 'bitpackage:messages/messages_broadcast.tpl'); +$gBitSystem->display( 'bitpackage:messages/broadcast.tpl'); ?> diff --git a/compose.php b/compose.php index 3ef05f7..823cf00 100644 --- a/compose.php +++ b/compose.php @@ -3,7 +3,7 @@ * message package modules * * @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/compose.php,v 1.8 2006/04/11 13:05:55 squareing Exp $ +* @version $Header: /cvsroot/bitweaver/_bit_messages/compose.php,v 1.9 2006/12/20 20:50:17 squareing Exp $ * @package messages * @subpackage functions */ @@ -16,8 +16,7 @@ * required setup */ require_once( '../bit_setup_inc.php' ); -require_once( MESSAGES_PKG_PATH.'messages_lib.php' ); -require_once( USERS_PKG_PATH.'BitUser.php' ); +require_once( MESSAGES_PKG_PATH.'Messages.php' ); if( !$gBitUser->isRegistered() ) { $gBitSmarty->assign('msg', tra("You are not logged in")); @@ -28,6 +27,8 @@ if( !$gBitUser->isRegistered() ) { $gBitSystem->isPackageActive( 'messages', TRUE ); $gBitSystem->verifyPermission( 'p_messages_send' ); +$messages = new Messages(); + // Configure quicktags list if ($gBitSystem->getConfig('package_quicktags','n') == 'y') { include_once( QUICKTAGS_PKG_PATH.'quicktags_inc.php' ); @@ -77,7 +78,7 @@ $feedback = array(); $gBitSmarty->assign_by_ref( 'feedback', $feedback ); if (isset($_REQUEST['replyto']) || isset($_REQUEST['replyallto'])) { - $messageslib->flag_message( $gBitUser->mUserId, $_REQUEST['msg_id'], 'is_replied', 'y' ); + $messages->flagMessage( $gBitUser->mUserId, $_REQUEST['msg_id'], 'is_replied', 'y' ); } if (isset($_REQUEST['send'])) { @@ -96,10 +97,11 @@ if (isset($_REQUEST['send'])) { // Insert the message in the inboxes of each user foreach ($toUsers as $toUser) { if( !empty( $toUser ) ) { - if( $messageslib->post_message( $toUser, $_REQUEST['to'], $_REQUEST['cc'], $_REQUEST['bcc'], $_REQUEST['subject'], $_REQUEST['body'],$_REQUEST['priority'] ) ) { + $_REQUEST['to_login'] = $toUser; + if( $messages->postMessage( $_REQUEST ) ) { $feedback['success'][] = tra( "Message will be sent to: " ).' '.$toUser; } else { - $feedback['error'][] = $messageslib->mErrors['compose']; + $feedback['error'][] = $messages->mErrors['compose']; } } } @@ -112,5 +114,5 @@ if (isset($_REQUEST['send'])) { } } -$gBitSystem->display( 'bitpackage:messages/messages_compose.tpl', 'Compose Message' ); +$gBitSystem->display( 'bitpackage:messages/compose.tpl', 'Compose Message' ); ?> diff --git a/contact.php b/contact.php index 1a887de..9a4a6c1 100644 --- a/contact.php +++ b/contact.php @@ -3,7 +3,7 @@ * message package modules * * @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/contact.php,v 1.9 2006/04/14 20:25:52 squareing Exp $ +* @version $Header: /cvsroot/bitweaver/_bit_messages/contact.php,v 1.10 2006/12/20 20:50:17 squareing Exp $ * @package messages * @subpackage functions */ @@ -21,7 +21,8 @@ if( !$gBitSystem->isFeatureActive( 'messages_site_contact' ) ) { $gBitSystem->fatalError( "The Contact feature is disabled." ); } -include_once( MESSAGES_PKG_PATH.'messages_lib.php' ); +include_once( MESSAGES_PKG_PATH.'Messages.php' ); +$messages = new Messages(); $userInfo = $gBitUser->getUserInfo( array( 'login' => $gBitSystem->getConfig( 'messages_contact_user' ) ) ); $email = $userInfo['email']; @@ -39,7 +40,7 @@ if (!empty($_REQUEST['send'])) { if( empty( $_REQUEST['subject'] ) && empty( $_REQUEST['body'] ) ) { $gBitSystem->fatalError( "Either a subject or a message body is required." ); } - $messageslib->post_message( $userInfo['login'], $gBitUser->mUsername, $_REQUEST['to'], '', $_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['priority']); + $messages->postMessage( $userInfo['login'], $gBitUser->mUsername, $_REQUEST['to'], '', $_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['priority']); $feedback['success'] = tra( 'Your message was sent to' ).': '.( !empty( $userInfo['real_name'] ) ? $userInfo['real_name'] : $userInfo['login'] ); $gBitSmarty->assign( 'feedback', $feedback ); } diff --git a/message_box.php b/message_box.php index 8460740..ce932f9 100644 --- a/message_box.php +++ b/message_box.php @@ -3,7 +3,7 @@ * message package modules * * @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/message_box.php,v 1.13 2006/04/11 13:05:55 squareing Exp $ +* @version $Header: /cvsroot/bitweaver/_bit_messages/message_box.php,v 1.14 2006/12/20 20:50:17 squareing Exp $ * @package messages * @subpackage functions */ @@ -16,7 +16,7 @@ * required setup */ require_once( '../bit_setup_inc.php' ); -require_once( MESSAGES_PKG_PATH.'messages_lib.php' ); +require_once( MESSAGES_PKG_PATH.'Messages.php' ); if( !$gBitUser->isRegistered() ) { $gBitSmarty->assign('msg', tra("You are not logged in")); @@ -27,25 +27,27 @@ if( !$gBitUser->isRegistered() ) { $gBitSystem->isPackageActive( 'messages', TRUE ); $gBitSystem->verifyPermission( 'p_messages_send' ); +$messages = new Messages(); + $max_records = $gBitSystem->getConfig( 'max_records', 20 ); // Mark messages if the mark button was pressed if (isset($_REQUEST["mark"]) && isset($_REQUEST["msg"])) { foreach (array_keys($_REQUEST["msg"])as $msg) { $parts = explode('_', $_REQUEST['action']); - $messageslib->flag_message($gBitUser->mUserId, $msg, $parts[0].'_'.$parts[1], $parts[2]); + $messages->flagMessage($gBitUser->mUserId, $msg, $parts[0].'_'.$parts[1], $parts[2]); } } // Delete messages if the delete button was pressed -if (isset($_REQUEST["delete"]) && isset($_REQUEST["msg"])) { - foreach (array_keys($_REQUEST["msg"])as $msg) { - $messageslib->delete_message( $gBitUser->mUserId, $msg ); +if( !empty( $_REQUEST["delete"] ) && !empty( $_REQUEST["msg"] ) ) { + foreach( array_keys( $_REQUEST["msg"] ) as $msg ) { + $messages->expunge( $gBitUser->mUserId, $msg ); } } -if (isset($_REQUEST['filter'])) { - if ($_REQUEST['flags'] != '') { +if( !empty( $_REQUEST['filter'] ) ) { + if( $_REQUEST['flags'] != '' ) { $parts = explode('_', $_REQUEST['flags']); $_REQUEST['flag'] = substr( $_REQUEST['flags'], 0, strrpos( $_REQUEST['flags'], '_' ) ); @@ -53,60 +55,29 @@ if (isset($_REQUEST['filter'])) { } } -if (!isset($_REQUEST["priority"])) - $_REQUEST["priority"] = ''; - -if (!isset($_REQUEST["flag"])) - $_REQUEST["flag"] = ''; - -if (!isset($_REQUEST["flagval"])) - $_REQUEST["flagval"] = ''; - if ( empty( $_REQUEST["sort_mode"] ) ) { $sort_mode = 'msg_date_desc'; } else { $sort_mode = $_REQUEST["sort_mode"]; } -if (!isset($_REQUEST["offset"])) { - $offset = 0; -} else { - $offset = $_REQUEST["offset"]; -} - if (isset($_REQUEST["find"])) { $find = $_REQUEST["find"]; } else { $find = ''; } -$gBitSmarty->assign_by_ref('flag', $_REQUEST['flag']); -$gBitSmarty->assign_by_ref('priority', $_REQUEST['priority']); $gBitSmarty->assign_by_ref('flagval', $_REQUEST['flagval']); -$gBitSmarty->assign_by_ref('offset', $offset); $gBitSmarty->assign_by_ref('sort_mode', $sort_mode); $gBitSmarty->assign('find', $find); // What are we paginating: items -$items = $messageslib->list_messages( $gBitUser->mUserId, $offset, $max_records, $sort_mode, - $find, $_REQUEST["flag"], $_REQUEST["flagval"], $_REQUEST['priority']); - -$cant_pages = ceil($items["cant"] / $max_records); -$gBitSmarty->assign_by_ref('cant_pages', $cant_pages); -$gBitSmarty->assign('actual_page', 1 + ($offset / $max_records)); - -if ($items["cant"] > ($offset + $max_records)) { - $gBitSmarty->assign('next_offset', $offset + $max_records); -} else { - $gBitSmarty->assign('next_offset', -1); -} - -if ($offset > 0) { - $gBitSmarty->assign('prev_offset', $offset - $max_records); -} else { - $gBitSmarty->assign('prev_offset', -1); -} +//$items = $messages->list_messages( $gBitUser->mUserId, $offset, $max_records, $sort_mode, +// $find, $_REQUEST["flag"], $_REQUEST["flagval"], $_REQUEST['priority']); -$gBitSmarty->assign_by_ref('items', $items["data"]); +$listHash = $_REQUEST; +$items = $messages->getList( $listHash ); +$gBitSmarty->assign( 'items', $items ); +$gBitSmarty->assign( 'listInfo', $listHash['listInfo'] ); -$gBitSystem->display( 'bitpackage:messages/messages_mailbox.tpl', 'Message box' ); +$gBitSystem->display( 'bitpackage:messages/mailbox.tpl', 'Message box' ); ?> diff --git a/messages_lib.php b/messages_lib.php deleted file mode 100644 index 020e85d..0000000 --- a/messages_lib.php +++ /dev/null @@ -1,397 +0,0 @@ -<?php -/** -* message package modules -* -* @author -* @version $Revision: 1.13 $ -* @package messages -*/ - -/** -* Messages base class -* -* @package messages -* @subpackage Messages -*/ -class Messages extends BitBase { - - function Messages() { - BitBase::BitBase(); - } - - function post_message( $pToLogin, $to, $cc, $bcc, $subject, $body, $priority, $group_id = NULL) { - global $gBitSmarty, $gBitUser, $gBitSystem; - - $userInfo = $gBitUser->getUserInfo( array('login' => $pToLogin) ); - if (!$userInfo) { - if (is_numeric($pToLogin)) { - $userInfo = $gBitUser->getUserInfo( array('user_id' => $pToLogin) ); - } - } - - if( $userInfo ) { - if ($gBitUser->getPreference('messages_allow_messages', 'y', $userInfo['user_id'] )) { - $subject = strip_tags($subject); - $body = strip_tags($body, '<a><b><img><i>'); - // Prevent duplicates - $hash = md5($subject . $body); - - if ($this->mDb->getOne("select count(*) from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `from_user_id`=? and `hash`=?", array( $userInfo['user_id'], $gBitUser->mUserId, $hash ) ) ) { - $this->mErrors['compose'] = $pToLogin.' '.tra( 'has already received this message' ); - } else { -// $bitDate = $gBitSystem->get_date_converter(); - include_once( KERNEL_PKG_PATH.'BitDate.php' ); - $bitDate = new BitDate(0); - $now = $bitDate->getUTCTime(); - $query = "INSERT INTO `".BIT_DB_PREFIX."messages` - (`to_user_id`, `from_user_id`, `msg_to`, `msg_cc`, `msg_bcc`, `subject`, `body`, `msg_date`, `is_read`, `is_replied`, `is_flagged`, `priority`, `hash`, `group_id` ) - VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; - $this->mDb->query( $query, array( $userInfo['user_id'], $gBitUser->mUserId, $to, $cc, $bcc, $subject, $body,(int) $now,'n','n','n',(int) $priority,$hash, $group_id ) ); - - // Now check if the user should be notified by email - $foo = parse_url($_SERVER["REQUEST_URI"]); - $machine = httpPrefix(). $foo["path"]; - - if ($gBitUser->getPreference( 'messages_min_priority', 3 ) <= $priority && FALSE) { - $mailSite = $gBitSystem->getConfig( 'kernel_server_name', $_SERVER["SERVER_NAME"] ); - $gBitSmarty->assign( 'mail_site', $mailSite ); - $gBitSmarty->assign( 'mail_machine', $machine); - $gBitSmarty->assign( 'mail_date', $now); - $gBitSmarty->assign( 'mail_user', stripslashes( $userInfo['login'] ) ); - $gBitSmarty->assign( 'mail_from', stripslashes( $gBitUser->getDisplayName() ) ); - $gBitSmarty->assign( 'mail_subject', stripslashes($subject)); - $gBitSmarty->assign( 'mail_body', stripslashes($body)); - $mail_data = $gBitSmarty->fetch('bitpackage:messages/messages_message_notification.tpl'); - - if( !empty( $userInfo['email'] ) ) { - @mail($userInfo['email'], tra('New message arrived from '). $mailSite, $mail_data, - "From: ".$gBitSystem->getConfig( 'site_sender_email' )."\r\nContent-type: text/plain;charset=utf-8\r\n"); - } - } - } - } else { - // TODO: needs translation as soon as there is a solution for strings with embedded variables - $this->mErrors['compose'] = $pToLogin.' '.tra( 'can not receive messages' ); - } - } else { - $this->mErrors['compose'] = tra( 'Unknown user' ).": $pToLogin"; - } - - return( count( $this->mErrors ) == 0 ); - } - - function post_system_message($subject, $body, $group_id) { - return $this->post_message(ROOT_USER_ID, ROOT_USER_ID,NULL,NULL,$subject, $body, 1, $group_id); - } - - function list_system_messages() { - $sql = "SELECT mm.* FROM `".BIT_DB_PREFIX."messages` mm WHERE mm.`from_user_id` = ?"; - $rs = $this->mDb->query($sql, array(ROOT_USER_ID)); - - return $rs->getRows(); - } - - function remove_system_message($pMessageID = NULL) { - if ($pMessageID) { - $sql = "DELETE FROM `".BIT_DB_PREFIX."messages_system_map` WHERE msg_id = ?"; - $rs = $this->mDb->query($sql, array($pMessageID)); - - $sql = "DELETE FROM `".BIT_DB_PREFIX."messages` WHERE msg_id = ?"; - $rs = $this->mDb->query($sql, array($pMessageID)); - } - - } - - function is_system_message($pMessageID = NULL) { - $ret = FALSE; - if ($pMessageID) { - $query = "SELECT COUNT(msg_id) FROM `".BIT_DB_PREFIX."messages` WHERE `to_user_id` = ? AND `msg_id` = ?"; - $ret = $this->mDb->getOne($query, array(ROOT_USER_ID, $pMessageID)); - } - return $ret; - } - - function list_messages( $pUserId, $offset, $max_records, $sort_mode, $find, $flag = '', $flagval = '', $prio = '' ) { - - // Load all normal messages (user to user) - $bindvars = array($pUserId); - $mid=""; - if ($prio) { - $mid = " and priority=? "; - $bindvars[] = $prio; - } - - if ($flag) { - // Process the flags - $mid.= " and `$flag`=? "; - $bindvars[] = $flagval; - } - if ($find) { - $findesc = '%'.strtoupper( $find ).'%'; - $mid.= " and (UPPER(`subject`) like ? or UPPER(`body`) like ?)"; - $bindvars[] = $findesc; - $bindvars[] = $findesc; - } - - $query = "SELECT uu.`login`, uu.`real_name`, uu.`user_id`, mm.* from `".BIT_DB_PREFIX."messages` mm INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON( mm.`from_user_id`=uu.`user_id` ) - WHERE `to_user_id`=? $mid - ORDER BY ".$this->mDb->convert_sortmode($sort_mode).",".$this->mDb->convert_sortmode("msg_id_desc"); - $query_cant = "select count(*) from `".BIT_DB_PREFIX."messages` where `to_user_id`=? $mid"; - $result = $this->mDb->query($query,$bindvars,$max_records,$offset); - $cant = $this->mDb->getOne($query_cant,$bindvars); - $normalMessages = array(); - - while ($res = $result->fetchRow()) { - $res["len"] = strlen($res["body"]); - - if (empty($res['subject'])) - $res['subject'] = tra('NONE'); - - $normalMessages[] = $res; - } - - // Load system messages (i.e. broadcast messages) - $bindvars = array($pUserId, ROOT_USER_ID, $pUserId); - $mid=""; - if ($prio) { - $mid = " and mm.priority=? "; - $bindvars[] = $prio; - } - - if ($flag) { - // Process the flags - $mid.= " and mm.`$flag`=? "; - $bindvars[] = $flagval; - } - if ($find) { - $findesc = '%'.strtoupper( $find ).'%'; - $mid.= " and (UPPER(mm.`subject`) like ? or UPPER(mm.`body`) like ?)"; - $bindvars[] = $findesc; - $bindvars[] = $findesc; - } - - $query = "SELECT uu.`login` AS `creator_user`, uu.`real_name`, uu.`user_id`, mm.`msg_id` as `msg_id_foo`, mm.`msg_to`, mm.`msg_cc`, mm.`msg_bcc`, mm.`subject`, mm.`body`, mm.`hash`, mm.`msg_date`, msm.* - FROM `".BIT_DB_PREFIX."messages` mm - INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (mm.`from_user_id` = uu.`user_id`) - LEFT OUTER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) - WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) $mid - ORDER BY ".$this->mDb->convert_sortmode($sort_mode).",".$this->mDb->convert_sortmode("mm.msg_id_desc"); - - $query_cant = "SELECT COUNT(mm.`msg_id`) - FROM `".BIT_DB_PREFIX."messages` mm - LEFT OUTER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) - WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) $mid"; - $result2 = $this->mDb->query($query, $bindvars); - $cant2 = $this->mDb->getOne($query_cant, $bindvars); - $systemMessages = array(); - while ($res = $result2->fetchRow()) { - $res['len'] = strlen($res['body']); - $res['is_broadcast_message'] = TRUE; - if (empty($res['subject'])) { - $res['subject'] = tra('NONE'); - } - $res['msg_id'] = $res['msg_id_foo']; // Due to the left outer join this madness is neccessary - unset($res['msg_id_foo']); - if ($res['is_hidden'] != 'y') { - $systemMessages[] = $res; - } - } - - // Now we merge normalMessages and systemMessages and put them in order - $ret = array(); - $normalMessageCount = count($normalMessages); - $systemMessageCount = count($systemMessages); - $normalMsg = $systemMsg = NULL; - if (strpos($sort_mode, '_asc') !== FALSE) { - $sortType = '_asc'; - $sortKey = substr($sort_mode, 0, strlen($sort_mode)-4); - } else { - $sortType = '_desc'; - $sortKey = substr($sort_mode, 0, strlen($sort_mode)-5); - } - - while ($normalMessageCount > 0 || $systemMessageCount > 0) { - if (!$normalMsg && $normalMessageCount > 0) { - $normalMsg = array_shift($normalMessages); - } - if (!$systemMsg && $systemMessageCount > 0) { - $systemMsg = array_shift($systemMessages); - } - if ($normalMessageCount == 0) { - $ret[] = $systemMsg; - $systemMsg = NULL; - $systemMessageCount--; - } elseif ($systemMessageCount == 0) { - $ret[] = $normalMsg; - $normalMsg = NULL; - $normalMessageCount--; - }elseif ($sortType == '_asc') { - if ($normalMsg[$sortKey] < $systemMsg[$sortKey]) { - $ret[] = $normalMsg; - $normalMsg = NULL; - $normalMessageCount--; - } else { - $ret[] = $systemMsg; - $systemMsg = NULL; - $systemMessageCount--; - } - } else { - if ($normalMsg[$sortKey] > $systemMsg[$sortKey]) { - $ret[] = $normalMsg; - $normalMsg = NULL; - $normalMessageCount--; - } else { - $ret[] = $systemMsg; - $systemMsg = NULL; - $systemMessageCount--; - } - } - } - - $retval = array(); - $retval["data"] = $ret; - $retval["cant"] = $cant + $cant2; - return $retval; - } - - function flag_message( $pUserId, $msg_id, $flag, $val ) { - if (!$msg_id) - return false; - if ($this->is_system_message($msg_id)) { - $query = "SELECT COUNT(*) FROM `".BIT_DB_PREFIX."messages_system_map` WHERE `to_user_id` = ? AND `msg_id` = ?"; - $rowExists = $this->mDb->getOne($query, array($pUserId, $msg_id)); - if ($rowExists) { - $query = "UPDATE `".BIT_DB_PREFIX."messages_system_map` SET `$flag`=? WHERE `to_user_id` = ? AND `msg_id` = ?"; - $this->mDb->query($query, array($val, $pUserId, (int)$msg_id)); - } else { - $query = "INSERT INTO `".BIT_DB_PREFIX."messages_system_map` (`msg_id`, `to_user_id`, `$flag`) VALUES (?,?,?)"; - $this->mDb->query($query, array((int)$msg_id, $pUserId, $val)); - } - - } else { - $query = "UPDATE `".BIT_DB_PREFIX."messages` SET `$flag`=? where `to_user_id`=? and `msg_id`=?"; - $this->mDb->query($query,array($val,$pUserId,(int)$msg_id)); - } - } - - function delete_message($pUserId, $msg_id) { - if (!$msg_id) - return false; - if ($this->is_system_message($msg_id)) { - // We just mark this user's messages_system_map row is_hidden = 'y' - $query = "UPDATE `".BIT_DB_PREFIX."messages_system_map` SET `is_hidden` = 'y' WHERE `to_user_id` = ? AND `msg_id` = ?"; - $this->mDb->query($query, array($pUserId, $msg_id)); - } else { - $query = "delete from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `msg_id`=?"; - $this->mDb->query($query,array($pUserId,(int)$msg_id)); - } - } - - function get_next_message($pUserId, $msg_id, $sort_mode, $find, $flag, $flagval, $prio) { - if (!$msg_id) - return 0; - - $mid = ""; - $bindvars = array($pUserId,(int)$msg_id); - if ($prio) { - $mid.= " and priority=? "; - $bindvars[] = $prio; - } - - if ($flag) { - // Process the flags - $mid.= " and `$flag`=? "; - $bindvars[] = $flagval; - } - if ($find) { - $findesc = '%'.strtoupper( $find ).'%'; - $mid.= " and (UPPER(`subject`) like ? or UPPER(`body`) like ?)"; - $bindvars[] = $findesc; - $bindvars[] = $findesc; - } - - $query = "select min(`msg_id`) as `nextmsg` from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `msg_id` > ? $mid "; - $result = $this->mDb->query($query,$bindvars,1,0); - $res = $result->fetchRow(); - - if (!$res) - return false; - return $res['nextmsg']; - } - - function get_prev_message($pUserId, $msg_id, $sort_mode, $find, $flag, $flagval, $prio) { - if (!$msg_id) - return 0; - - $bindvars = array( $pUserId, (int)$msg_id ); - $mid=""; - if ($prio) { - $mid.= " AND priority=? "; - $bindvars[] = $prio; - } - - if ($flag) { - // Process the flags - $mid.= " AND `$flag`=? "; - $bindvars[] = $flagval; - } - if ($find) { - $findesc = '%'.strtoupper( $find ).'%'; - $mid.= " and (UPPER(`subject`) like ? or UPPER(`body`) like ?)"; - $bindvars[] = $findesc; - $bindvars[] = $findesc; - } - $query = "select max(`msg_id`) as `prevmsg` from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `msg_id` < ? $mid"; - $result = $this->mDb->query( $query, $bindvars, 1, 0 ); - $res = $result->fetchRow(); - - if (!$res) - return false; - - return $res['prevmsg']; - } - - function get_message( $pUserId, $msg_id ) { - if (!$this->is_system_message($msg_id)) { - $bindvars = array( $pUserId, (int)$msg_id ); - $query = "select * from `".BIT_DB_PREFIX."messages` WHERE `to_user_id`=? and `msg_id`=?"; - $result = $this->mDb->query($query,$bindvars); - $res = $result->fetchRow(); - } else { - $bindvars = array($pUserId, (int)$msg_id); - $query = "SELECT msm.*, ug.`group_name`, mm.`from_user_id`, mm.`msg_id` as `msg_id_foo`, mm.`msg_to`, mm.`msg_cc`, mm.`msg_bcc`, mm.`subject`, mm.`body`, mm.`hash`, mm.`msg_date` - FROM `".BIT_DB_PREFIX."messages` mm - INNER JOIN `".BIT_DB_PREFIX."users_groups` ug ON (ug.`group_id` = mm.`group_id`) - LEFT OUTER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) - WHERE mm.`msg_id` = ?"; - $result = $this->mDb->query($query, $bindvars); - $res = $result->fetchRow(); - $res['is_broadcast_message'] = TRUE; - } - - $content = new LibertyContent(); - global $gBitSystem; - $res['parsed'] = $content->parseData( $res['body'], $gBitSystem->getConfig( 'default_format')); - - if (empty($res['subject'])) - $res['subject'] = tra('NONE'); - - return $res; - } - - /*shared*/ - function user_unread_messages( $pUserId ) { - // Standard user to user messages - $normalCount = $this->mDb->getOne( "select count( * ) from `".BIT_DB_PREFIX."messages` where `to_user_id`=? and `is_read`=?",array( $pUserId,'n' ) ); - // Broadcast messages where they have a messages_system_map row but is_read is not yet set - $broadcastCount = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messages` mm INNER JOIN `".BIT_DB_PREFIX."messages_system_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`is_read` <> 'y' AND `is_hidden` <> 'y' AND msm.`to_user_id`= ?) WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id`= ?) ", array($pUserId, ROOT_USER_ID, $pUserId)); - // Broadcast messages where they do not yet have a messages_system_map row - $broadcastCount2 = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messages` mm WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) AND NOT EXISTS ( SELECT msm.`msg_id` FROM `".BIT_DB_PREFIX."messages_system_map` msm WHERE msm.`msg_id` = mm.`msg_id` AND msm.`to_user_id` = ?)", array(ROOT_USER_ID, $pUserId, $pUserId)); - return $normalCount + $broadcastCount + $broadcastCount2; - } -} - -global $messageslib; -$messageslib = new Messages(); - -?> @@ -3,7 +3,7 @@ * message package modules * * @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/read.php,v 1.7 2006/04/11 13:05:55 squareing Exp $ +* @version $Header: /cvsroot/bitweaver/_bit_messages/read.php,v 1.8 2006/12/20 20:50:17 squareing Exp $ * @package messages * @subpackage functions */ @@ -16,7 +16,7 @@ * required setup */ require_once( '../bit_setup_inc.php' ); -require_once( MESSAGES_PKG_PATH.'messages_lib.php' ); +require_once( MESSAGES_PKG_PATH.'Messages.php' ); if( !$gBitUser->isRegistered() ) { $gBitSmarty->assign('msg', tra("You are not logged in")); @@ -27,9 +27,10 @@ if( !$gBitUser->isRegistered() ) { $gBitSystem->isPackageActive( 'messages', TRUE ); $gBitSystem->verifyPermission( 'p_messages_send' ); +$messages = new Messages(); + if (isset($_REQUEST["msgdel"])) { - - $messageslib->delete_message($gBitUser->mUserId, $_REQUEST['msgdel']); + $messages->expunge($gBitUser->mUserId, $_REQUEST['msgdel']); } $sort_mode = !empty( $_REQUEST['sort_mode'] ) ? $_REQUEST['sort_mode'] : ''; @@ -54,23 +55,23 @@ if (!isset($_REQUEST['msg_id']) || $_REQUEST['msg_id'] == 0) { } if (isset($_REQUEST['act'])) { - $messageslib->flag_message( $gBitUser->mUserId, $_REQUEST['msg_id'], $_REQUEST['act'], $_REQUEST['actval'] ); + $messages->flagMessage( $gBitUser->mUserId, $_REQUEST['msg_id'], $_REQUEST['act'], $_REQUEST['actval'] ); } // Using the sort_mode, flag, flagval and find get the next and prev messages $gBitSmarty->assign('msg_id', $_REQUEST['msg_id']); -$next = $messageslib->get_next_message( $gBitUser->mUserId, $_REQUEST['msg_id'], $sort_mode, $find, $flag, $flagval, $priority ); -$prev = $messageslib->get_prev_message( $gBitUser->mUserId, $_REQUEST['msg_id'], $sort_mode, $find, $flag, $flagval, $priority ); +$next = $messages->getNextMessage( $gBitUser->mUserId, $_REQUEST['msg_id'], $sort_mode, $find, $flag, $flagval, $priority ); +$prev = $messages->getPrevMessage( $gBitUser->mUserId, $_REQUEST['msg_id'], $sort_mode, $find, $flag, $flagval, $priority ); $gBitSmarty->assign('next', $next); $gBitSmarty->assign('prev', $prev); // Mark the message as read -$messageslib->flag_message( $gBitUser->mUserId, $_REQUEST['msg_id'], 'is_read', 'y'); +$messages->flagMessage( $gBitUser->mUserId, $_REQUEST['msg_id'], 'is_read', 'y'); // Get the message and assign its data to template vars -$msg = $messageslib->get_message( $gBitUser->mUserId, $_REQUEST['msg_id']); +$msg = $messages->getMessage( $gBitUser->mUserId, $_REQUEST['msg_id']); $gBitSmarty->assign('msg', $msg); -$gBitSystem->display( 'bitpackage:messages/messages_read.tpl'); +$gBitSystem->display( 'bitpackage:messages/read.tpl'); ?> diff --git a/templates/broadcast.tpl b/templates/broadcast.tpl new file mode 100644 index 0000000..c54656c --- /dev/null +++ b/templates/broadcast.tpl @@ -0,0 +1,74 @@ +<div class="display messages"> + <div class="header"> + <h1>{tr}Broadcast message{/tr}</h1> + </div> + + {include file="bitpackage:users/my_bitweaver_bar.tpl"} + {include file="bitpackage:messages/messages_nav.tpl"} + + <div class="body"> + {formfeedback hash=$feedback} + + {if !$feedback} + {form legend="Broadcast message"} + <div class="row"> + {formlabel label="Group" for="broadcast-group"} + {forminput} + <select name="group_id" id="broadcast-group"> + {section name=ix loop=$groups} + {if $groups[ix].group_id && $groups[ix].group_name} + <option value="{$groups[ix].group_id}">{$groups[ix].group_name}</option> + {/if} + {/section} + </select> + {formhelp note=""} + {/forminput} + </div> + + <div class="row"> + {formlabel label="Priority" for="broadcast-priority"} + {forminput} + <select name="priority" id="broadcast-priority"> + <option value="1" {if $priority eq 1}selected="selected"{/if}>{tr}1 -Lowest-{/tr}</option> + <option value="2" {if $priority eq 2}selected="selected"{/if}>{tr}2 -Low-{/tr}</option> + <option value="3" {if $priority eq 3}selected="selected"{/if}>{tr}3 -Normal-{/tr}</option> + <option value="4" {if $priority eq 4}selected="selected"{/if}>{tr}4 -High-{/tr}</option> + <option value="5" {if $priority eq 5}selected="selected"{/if}>{tr}5 -Very High-{/tr}</option> + </select> + {formhelp note=""} + {/forminput} + </div> + + <div class="row"> + {formlabel label="Subject" for="broadcast-subject"} + {forminput} + <input type="text" name="subject" id="broadcast-subject" value="{$subject|escape}" size="50" maxlength="255" /> + {formhelp note=""} + {/forminput} + </div> + + {* only display quicktags if tikiwiki quicktags are available *} + {if $gBitSystem->isPackageActive( 'quicktags' ) and $gLibertySystem->mPlugins.tikiwiki.is_active eq 'y'} + {include file="bitpackage:quicktags/quicktags_full.tpl" textarea_id=message_body default_format=tikiwiki} + {/if} + + {* only display quicktags if tikiwiki quicktags are available *} + {if $gBitSystem->isPackageActive( 'smileys' ) and $gLibertySystem->mPlugins.tikiwiki.is_active eq 'y'} + {include file="bitpackage:smileys/smileys_full.tpl" textarea_id=message_body default_format=tikiwiki} + {/if} + + <div class="row"> + {formlabel label="" for=""} + {forminput} + <textarea rows="20" cols="50" name="body" id="message_body">{$body|escape}</textarea> + {formhelp note=""} + {/forminput} + </div> + + <div class="submit"> + <input type="submit" name="send" value="{tr}Send message{/tr}" /> + </div> + {/form} + {/if} + </div><!-- end .body --> +</div><!-- end .messages --> diff --git a/templates/messages_compose.tpl b/templates/compose.tpl index 9fad99f..56a0cad 100644 --- a/templates/messages_compose.tpl +++ b/templates/compose.tpl @@ -6,6 +6,7 @@ </div> {include file="bitpackage:users/my_bitweaver_bar.tpl"} + {include file="bitpackage:messages/messages_nav.tpl"} <div class="body"> {formfeedback hash=$feedback} diff --git a/templates/messages_mailbox.tpl b/templates/mailbox.tpl index 8adb5f5..3582338 100644 --- a/templates/messages_mailbox.tpl +++ b/templates/mailbox.tpl @@ -6,10 +6,10 @@ </div> {include file="bitpackage:users/my_bitweaver_bar.tpl"} + {include file="bitpackage:messages/messages_nav.tpl"} <div class="body"> {form legend="Your Personal Messages"} - <input type="hidden" name="offset" value="{$offset|escape}" /> <input type="hidden" name="find" value="{$find|escape}" /> <input type="hidden" name="sort_mode" value="{$sort_mode|escape}" /> <input type="hidden" name="flag" value="{$flag|escape}" /> @@ -23,10 +23,10 @@ <caption>{tr}Messages{/tr}</caption> <tr> <th style="width:1%"> </th> - <th style="width:1%">{smartlink ititle="Flagged" isort=is_flagged ibiticon="icons/mail-mark-important" find=$find flag=$flag offset=$offset priority=$priority flagval=$flagval}</th> - <th>{smartlink ititle="From" isort=$displayName find=$find flag=$flag offset=$offset priority=$priority flagval=$flagval}</th> - <th>{smartlink ititle="Subject" isort=subject find=$find flag=$flag offset=$offset priority=$priority flagval=$flagval}</th> - <th>{smartlink ititle="Date" isort=msg_date find=$find flag=$flag offset=$offset priority=$priority flagval=$flagval}</th> + <th style="width:1%">{smartlink ititle="Flagged" isort=is_flagged ibiticon="icons/mail-mark-important" find=$find flag=$flag priority=$priority flagval=$flagval}</th> + <th>{smartlink ititle="From" isort=$displayName find=$find flag=$flag priority=$priority flagval=$flagval}</th> + <th>{smartlink ititle="Subject" isort=subject find=$find flag=$flag priority=$priority flagval=$flagval}</th> + <th>{smartlink ititle="Date" isort=msg_date find=$find flag=$flag priority=$priority flagval=$flagval}</th> <th>{tr}Size{/tr}</th> </tr> @@ -35,7 +35,10 @@ <td><input type="checkbox" name="msg[{$items[user].msg_id}]" /></td> <td class="prio{$items[user].priority}">{if $items[user].is_flagged eq 'y'}{biticon ipackage="icons" iname="mail-mark-important" iexplain="Flagged"}{/if}</td> <td>{displayname hash=$items[user]}</td> - <td><a href="{$smarty.const.MESSAGES_PKG_URL}read.php?offset={$offset}&flag={$flag}&priority={$priority}&flagval={$flagval}&sort_mode={$sort_mode}&find={$find}&msg_id={$items[user].msg_id}">{$items[user].subject}</a></td> + <td> + <a href="{$smarty.const.MESSAGES_PKG_URL}read.php?flag={$flag}&priority={$priority}&flagval={$flagval}&sort_mode={$sort_mode}&find={$find}&msg_id={$items[user].msg_id}">{$items[user].subject}</a> + {if $items[user].is_broadcast_message} <small>[{tr}broadcast{/tr}]</small>{/if} + </td> <td style="text-align:right;">{$items[user].msg_date|bit_short_datetime}</td> <td style="text-align:right;">{$items[user].len|kbsize}</td> </tr> @@ -63,11 +66,11 @@ {formlabel label="Messages" for="messages"} {forminput} <select name="flags" id="messages"> - <option value="is_read_y" {if $flag eq 'is_read' and $flagval eq 'y'}selected="selected"{/if}>{tr}Read{/tr}</option> - <option value="is_read_n" {if $flag eq 'is_read' and $flagval eq 'n'}selected="selected"{/if}>{tr}Unread{/tr}</option> - <option value="is_flagged_y" {if $flag eq 'is_flagged' and $flagval eq 'y'}selected="selected"{/if}>{tr}Flagged{/tr}</option> - <option value="is_flagged_y" {if $flag eq 'isflagged' and $flagval eq 'n'}selected="selected"{/if}>{tr}Unflagged{/tr}</option> - <option value="" {if $flag eq ''}selected="selected"{/if}>{tr}All{/tr}</option> + <option value="">{tr}All{/tr}</option> + <option value="is_read_y" {if $smarty.request.flag eq 'is_read' and $smarty.request.flagval eq 'y'}selected="selected"{/if}>{tr}Read{/tr}</option> + <option value="is_read_n" {if $smarty.request.flag eq 'is_read' and $smarty.request.flagval eq 'n'}selected="selected"{/if}>{tr}Unread{/tr}</option> + <option value="is_flagged_y" {if $smarty.request.flag eq 'is_flagged' and $smarty.request.flagval eq 'y'}selected="selected"{/if}>{tr}Flagged{/tr}</option> + <option value="is_flagged_y" {if $smarty.request.flag eq 'isflagged' and $smarty.request.flagval eq 'n'}selected="selected"{/if}>{tr}Unflagged{/tr}</option> </select> {formhelp note=""} {/forminput} @@ -77,12 +80,12 @@ {formlabel label="Priority" for="priority"} {forminput} <select name="priority" id="priority"> - <option value="" {if $priority eq ''}selected="selected"{/if}>{tr}All{/tr}</option> - <option value="1" {if $priority eq 1}selected="selected"{/if}>{tr}1{/tr}</option> - <option value="2" {if $priority eq 2}selected="selected"{/if}>{tr}2{/tr}</option> - <option value="3" {if $priority eq 3}selected="selected"{/if}>{tr}3{/tr}</option> - <option value="4" {if $priority eq 4}selected="selected"{/if}>{tr}4{/tr}</option> - <option value="5" {if $priority eq 5}selected="selected"{/if}>{tr}5{/tr}</option> + <option value="" {if $smarty.request.priority eq ''}selected="selected"{/if}>{tr}All{/tr}</option> + <option value="1" {if $smarty.request.priority eq 1}selected="selected"{/if}>{tr}1{/tr}</option> + <option value="2" {if $smarty.request.priority eq 2}selected="selected"{/if}>{tr}2{/tr}</option> + <option value="3" {if $smarty.request.priority eq 3}selected="selected"{/if}>{tr}3{/tr}</option> + <option value="4" {if $smarty.request.priority eq 4}selected="selected"{/if}>{tr}4{/tr}</option> + <option value="5" {if $smarty.request.priority eq 5}selected="selected"{/if}>{tr}5{/tr}</option> </select> {formhelp note=""} {/forminput} diff --git a/templates/messages_message_notification.tpl b/templates/message_notification.tpl index 2fccab5..56fa855 100644 --- a/templates/messages_message_notification.tpl +++ b/templates/message_notification.tpl @@ -1,8 +1,8 @@ {tr}Hi, A new message was posted to you. To respond, please visit http://{$smarty.server.HTTP_HOST}{$smarty.const.MESSAGES_PKG_URL}message_box.php -From: {$mail_from} -Subject: {$mail_subject} -Date:{/tr} {$mail_date|date_format:"%a %b %Y [%H:%I]"} +From: {$from} +Subject: {$msgHash.subject} +Date:{/tr} {$msgHash.msg_date|bit_long_datetime} -{$mail_body} +{$msgHash.body} diff --git a/templates/messages_broadcast.tpl b/templates/messages_broadcast.tpl deleted file mode 100644 index dc7f318..0000000 --- a/templates/messages_broadcast.tpl +++ /dev/null @@ -1,55 +0,0 @@ -<div class="floaticon">{bithelp}</div> -<div class="contain usermessages"> -<div class="header"> -<h1><a href="{$smarty.const.MESSAGES_PKG_URL}broadcast.php">{tr}Broadcast message{/tr}</a></h1> -</div> - -{include file="bitpackage:users/my_bitweaver_bar.tpl"} -{include file="bitpackage:messages/messages_nav.tpl"} - -<div class="body"> -{formfeedback error=$errors success=$message} -{if $sent} - {$message} -{else} -<form action="{$smarty.const.MESSAGES_PKG_URL}broadcast.php" method="post"> -<table class="panel"> - <tr> - <td><label for="broadcast-group">{tr}Group{/tr}:</label></td> - <td> - <select name="group" id="broadcast-group"> - - {section name=ix loop=$groups} - {if $groups[ix].group_id && $groups[ix].group_name} - <option value="{$groups[ix].group_id}">{$groups[ix].group_name}</option> - {/if} - {/section} - </select> - </td> - </tr> - <tr> - <td><label for="broadcast-priority">{tr}Priority{/tr}:</label></td><td> - <select name="priority" id="broadcast-priority"> - <option value="1" {if $priority eq 1}selected="selected"{/if}>{tr}1 -Lowest-{/tr}</option> - <option value="2" {if $priority eq 2}selected="selected"{/if}>{tr}2 -Low-{/tr}</option> - <option value="3" {if $priority eq 3}selected="selected"{/if}>{tr}3 -Normal-{/tr}</option> - <option value="4" {if $priority eq 4}selected="selected"{/if}>{tr}4 -High-{/tr}</option> - <option value="5" {if $priority eq 5}selected="selected"{/if}>{tr}5 -Very High-{/tr}</option> - </select> - </td> - </tr> - <tr> - <td><label for="broadcast-subject">{tr}Subject{/tr}:</label></td><td><input type="text" name="subject" id="broadcast-subject" value="{$subject|escape}" size="50" maxlength="255"/></td> - </tr> - <tr> - <td><label for="broadcast-body">{tr}Body{/tr}:</label></td><td align="center"><textarea rows="20" cols="50" name="body">{$body|escape}</textarea></td> - </tr> - <tr class="panelsubmitrow"> - <td colspan="2"><input type="submit" name="send" value="{tr}send message{/tr}" /></td> - </tr> -</table> -</form> -{/if} - -</div><!-- end .body --> -</div><!-- end .messages --> diff --git a/templates/messages_preferences_inc.tpl b/templates/preferences_inc.tpl index ff5af53..ff5af53 100644 --- a/templates/messages_preferences_inc.tpl +++ b/templates/preferences_inc.tpl diff --git a/templates/messages_read.tpl b/templates/read.tpl index de0ce25..95fad21 100644 --- a/templates/messages_read.tpl +++ b/templates/read.tpl @@ -5,6 +5,7 @@ </div> {include file="bitpackage:users/my_bitweaver_bar.tpl"} + {include file="bitpackage:messages/messages_nav.tpl"} {if $next} {assign var=read_id value=$next} |
