summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrewslater <drewslater@users.sourceforge.net>2005-10-12 20:11:32 +0000
committerdrewslater <drewslater@users.sourceforge.net>2005-10-12 20:11:32 +0000
commit6aaea44c126ba997101e7e738dbf6668e9e1e48c (patch)
tree08ea843950b3bf033915248c4867ceabce4b83cf
parent48c7ee37f318167687d06718de97b288fc74cbcd (diff)
downloadmessages-6aaea44c126ba997101e7e738dbf6668e9e1e48c.tar.gz
messages-6aaea44c126ba997101e7e738dbf6668e9e1e48c.tar.bz2
messages-6aaea44c126ba997101e7e738dbf6668e9e1e48c.zip
extensions for broadcast messaging
-rw-r--r--admin/schema_inc.php13
-rw-r--r--broadcast.php97
-rw-r--r--message_box.php6
-rw-r--r--messu_lib.php204
-rw-r--r--templates/messu_broadcast.tpl11
5 files changed, 232 insertions, 99 deletions
diff --git a/admin/schema_inc.php b/admin/schema_inc.php
index a487165..aabf2f5 100644
--- a/admin/schema_inc.php
+++ b/admin/schema_inc.php
@@ -16,8 +16,21 @@ $tables = array(
is_read C(1),
is_replied C(1),
is_flagged C(1),
+ group_id I4
priority I4
+",
+
+'messu_system_message_map' => "
+ msg_id I4
+ to_user_id I4 NOTNULL,
+ is_read C(1),
+ is_flagged C(1),
+ is_replied C(1),
+ priority I4,
+ is_hidden C(1)
+ CONSTRAINTS ', CONSTRAINT `tiki_messu_system_message_ref` FOREIGN KEY (`msg_id`) REFERENCES `".BIT_DB_PREFIX."messu_messages` (`msg_id`)'
"
+
// CONSTRAINT ', CONSTRAINT tiki_messu_to_user_ref FOREIGN KEY (to_user_id) REFERENCES `".BIT_DB_PREFIX."users_users` (user_id)
// , CONSTRAINT tiki_messu_from_user_ref FOREIGN KEY (from_user_id) REFERENCES `".BIT_DB_PREFIX."users_users` (user_id)'
diff --git a/broadcast.php b/broadcast.php
index 1818be8..e421095 100644
--- a/broadcast.php
+++ b/broadcast.php
@@ -3,7 +3,7 @@
* message package modules
*
* @author
-* @version $Header: /cvsroot/bitweaver/_bit_messages/broadcast.php,v 1.4 2005/08/07 17:41:17 squareing Exp $
+* @version $Header: /cvsroot/bitweaver/_bit_messages/broadcast.php,v 1.5 2005/10/12 20:11:32 drewslater Exp $
* @package messages
* @subpackage functions
*/
@@ -19,26 +19,15 @@ require_once( '../bit_setup_inc.php' );
include_once( MESSU_PKG_PATH.'messu_lib.php' );
-if (!$user) {
+if (!$gBitUser->isRegistered()) {
$gBitSmarty->assign('msg', tra("You are not logged in"));
$gBitSystem->display( 'error.tpl' );
die;
}
-if ($feature_messages != 'y') {
- $gBitSmarty->assign('msg', tra("This feature is disabled").": feature_messages");
-
- $gBitSystem->display( 'error.tpl' );
- die;
-}
-
-if ($bit_p_broadcast != 'y') {
- $gBitSmarty->assign('msg', tra("Permission denied"));
-
- $gBitSystem->display( 'error.tpl' );
- die;
-}
+$gBitSystem->isPackageActive( 'messu', TRUE );
+$gBitSystem->verifyPermission( 'bit_p_broeadcast_messages' );
if (!isset($_REQUEST['to']))
$_REQUEST['to'] = '';
@@ -65,7 +54,7 @@ $gBitSmarty->assign('subject', $_REQUEST['subject']);
$gBitSmarty->assign('body', $_REQUEST['body']);
$gBitSmarty->assign('priority', $_REQUEST['priority']);
-$gBitSystem->display( 'bitpackage:messu/messu_broadcast.tpl');
+
$gBitSmarty->assign('sent', 0);
@@ -73,75 +62,41 @@ if (isset($_REQUEST['reply']) || isset($_REQUEST['replyall'])) {
$messulib->flag_message($user, $_REQUEST['msg_id'], 'is_replied', 'y');
}
-if (isset($_REQUEST['group'])) {
- if ($_REQUEST['group'] == 'all') {
- $a_all_users = $userlib->get_users(0, -1, 'login_desc', '');
-
- $all_users = array();
-
- foreach ($a_all_users['data'] as $a_user) {
- $all_users[] = $a_user['user'];
- }
- } else {
- $all_users = $userlib->get_group_users($_REQUEST['group']);
- }
-}
if (isset($_REQUEST['send'])) {
-
- $gBitSmarty->assign('sent', 1);
+ $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'])) {
- $gBitSmarty->assign('message', tra('ERROR: Either the subject or body must be non-empty'));
-
- die;
+ $errors[] = tra("Subject or body must not be empty");
}
-
- // Remove invalid users from the to, cc and bcc fields
- $users = array();
-
- foreach ($all_users as $a_user) {
- if (!empty($a_user)) {
- if ($messulib->user_exists($a_user)) {
- if ($messulib->getPreference('allowMsgs', 'y',$a_user )) {
- $users[] = $a_user;
- } else {
- // TODO: needs translation as soon as there is a solution for strings with embedded variables
- $message .= "User $a_user can not receive messages<br/>";
- }
- } else {
- $message .= tra("Invalid user"). "$a_user<br/>";
- }
- }
- }
-
- $users = array_unique($users);
-
- // Validation: either to, cc or bcc must have a valid user
- if (count($users) > 0) {
- $message .= tra("Message will be sent to: <ul><li>"). implode('<li> ', $users). "</ul><br/>";
- } else {
- $message = tra('ERROR: No valid users to send the message');
-
- $gBitSmarty->assign('message', $message);
- die;
+ if (empty($_REQUEST['group'])) {
+ $errors[] = tra("You must select a group to broadcast this message to");
}
-
- // Insert the message in the inboxes of each user
- foreach ($users as $a_user) {
- $messulib->post_message($a_user, $user, $a_user, '', $_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['priority']);
+
+ if (!count($errors)) {
+ $messulib->post_system_message($_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['group']);
+ $message = "Message successfully broadcast";
}
-
$gBitSmarty->assign('message', $message);
+ $gBitSmarty->assign('errors', $errors);
}
-$groups = $userlib->get_groups(0, -1, 'group_name_asc', '');
-$gBitSmarty->assign_by_ref('groups', $groups["data"]);
+if ($gBitUser->isAdmin()) {
+ $pListHash = array();
+ $groups = $gBitUser->getAllGroups($pListHash);
+} else {
+ $gBitUser->loadGroups();
+ $groups = &$gBitUser->mGroups;
+
+}
+
+$gBitSmarty->assign('groups', $groups["data"]);
$section = 'user_messages';
+$gBitSystem->display( 'bitpackage:messu/messu_broadcast.tpl');
?>
diff --git a/message_box.php b/message_box.php
index 1ead1a2..7f0b35b 100644
--- a/message_box.php
+++ b/message_box.php
@@ -2,8 +2,8 @@
/**
* message package modules
*
-* @author
-* @version $Header: /cvsroot/bitweaver/_bit_messages/message_box.php,v 1.4 2005/10/12 15:13:53 spiderr Exp $
+* @author
+* @version $Header: /cvsroot/bitweaver/_bit_messages/message_box.php,v 1.5 2005/10/12 20:11:32 drewslater Exp $
* @package messages
* @subpackage functions
*/
@@ -39,7 +39,7 @@ if (isset($_REQUEST["mark"]) && isset($_REQUEST["msg"])) {
// Delete messages if the delete button was pressed
if (isset($_REQUEST["delete"]) && isset($_REQUEST["msg"])) {
-
+
foreach (array_keys($_REQUEST["msg"])as $msg) {
$messulib->delete_message( $gBitUser->mUserId, $msg );
}
diff --git a/messu_lib.php b/messu_lib.php
index ab3e64b..c00aff1 100644
--- a/messu_lib.php
+++ b/messu_lib.php
@@ -3,7 +3,7 @@
* message package modules
*
* @author
-* @version $Revision: 1.6 $
+* @version $Revision: 1.7 $
* @package messages
*/
@@ -19,7 +19,7 @@ class Messu extends BitBase {
BitBase::BitBase();
}
- function post_message( $pToLogin, $to, $cc, $bcc, $subject, $body, $priority) {
+ function post_message( $pToLogin, $to, $cc, $bcc, $subject, $body, $priority, $group_id = NULL) {
global $gBitSmarty, $gBitUser, $gBitSystem;
$userInfo = $gBitUser->getUserInfo( array('login' => $pToLogin) );
@@ -42,9 +42,9 @@ class Messu extends BitBase {
$now = $gBitSystem->getUTCTime();
$query = "INSERT INTO `".BIT_DB_PREFIX."messu_messages`
- (`to_user_id`, `from_user_id`, `msg_to`, `msg_cc`, `msg_bcc`, `subject`, `body`, `date`, `is_read`, `is_replied`, `is_flagged`, `priority`, `hash` )
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
- $this->mDb->query( $query, array( $userInfo['user_id'], $gBitUser->mUserId, $to, $cc, $bcc, $subject, $body,(int) $now,'n','n','n',(int) $priority,$hash ) );
+ (`to_user_id`, `from_user_id`, `msg_to`, `msg_cc`, `msg_bcc`, `subject`, `body`, `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"]);
@@ -77,8 +77,41 @@ class Messu extends BitBase {
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."messu_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."messu_system_message_map` WHERE msg_id = ?";
+ $rs = $this->mDb->query($sql, array($pMessageID));
+
+ $sql = "DELETE FROM `".BIT_DB_PREFIX."messu_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."messu_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, $maxRecords, $sort_mode, $find, $flag = '', $flagval = '', $prio = '' ) {
+
+ // Load all normal messages (user to user)
$bindvars = array($pUserId);
$mid="";
if ($prio) {
@@ -104,7 +137,7 @@ class Messu extends BitBase {
$query_cant = "select count(*) from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? $mid";
$result = $this->mDb->query($query,$bindvars,$maxRecords,$offset);
$cant = $this->mDb->getOne($query_cant,$bindvars);
- $ret = array();
+ $normalMessages = array();
while ($res = $result->fetchRow()) {
$res["len"] = strlen($res["body"]);
@@ -112,27 +145,144 @@ class Messu extends BitBase {
if (empty($res['subject']))
$res['subject'] = tra('NONE');
- $ret[] = $res;
+ $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 `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.`date`, msm.*
+ FROM `".BIT_DB_PREFIX."messu_messages` mm
+ INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (mm.`from_user_id` = uu.`user_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."messu_system_message_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.*)
+ FROM `".BIT_DB_PREFIX."messu_messages` mm
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."messu_system_message_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;
+ $retval["cant"] = $cant + $cant2;
return $retval;
}
function flag_message( $pUserId, $msg_id, $flag, $val ) {
if (!$msg_id)
return false;
- $query = "update `".BIT_DB_PREFIX."messu_messages` set `$flag`=? where `to_user_id`=? and `msg_id`=?";
- $this->mDb->query($query,array($val,$pUserId,(int)$msg_id));
+ if ($this->is_system_message($msg_id)) {
+ $query = "SELECT COUNT(*) FROM `".BIT_DB_PREFIX."messu_system_message_map` WHERE `to_user_id` = ? AND `msg_id` = ?";
+ $rowExists = $this->mDb->getOne($query, array($pUserId, $msg_id));
+ if ($rowExists) {
+ $query = "UPDATE `".BIT_DB_PREFIX."messu_system_message_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."messu_system_message_map` (`msg_id`, `to_user_id`, `$flag`) VALUES (?,?,?)";
+ $this->mDb->query($query, array((int)$msg_id, $pUserId, $val));
+ }
+
+ } else {
+ $query = "update `".BIT_DB_PREFIX."messu_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;
- $query = "delete from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `msg_id`=?";
- $this->mDb->query($query,array($pUserId,(int)$msg_id));
+ if ($this->is_system_message($msg_id)) {
+ // We just mark this user's messu_system_message_map row is_hidden = 'y'
+ $query = "UPDATE `".BIT_DB_PREFIX."messu_system_message_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."messu_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) {
@@ -200,13 +350,26 @@ class Messu extends BitBase {
}
function get_message( $pUserId, $msg_id ) {
- $bindvars = array( $pUserId, (int)$msg_id );
- $query = "select * from `".BIT_DB_PREFIX."messu_messages` WHERE `to_user_id`=? and `msg_id`=?";
- $result = $this->mDb->query($query,$bindvars);
- $res = $result->fetchRow();
+ if (!$this->is_system_message($msg_id)) {
+ $bindvars = array( $pUserId, (int)$msg_id );
+ $query = "select * from `".BIT_DB_PREFIX."messu_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.`date`
+ FROM `".BIT_DB_PREFIX."messu_messages` mm
+ INNER JOIN `".BIT_DB_PREFIX."users_groups` ug ON (ug.`group_id` = mm.`group_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."messu_system_message_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();
$res['parsed'] = $content->parseData( $res['body'], PLUGIN_GUID_TIKIWIKI );
-
+
if (empty($res['subject']))
$res['subject'] = tra('NONE');
@@ -215,7 +378,10 @@ class Messu extends BitBase {
/*shared*/
function user_unread_messages( $pUserId ) {
- return $this->mDb->getOne( "select count( * ) from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `is_read`=?",array( $pUserId,'n' ) );
+ $normalCount = $this->mDb->getOne( "select count( * ) from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `is_read`=?",array( $pUserId,'n' ) );
+ $broadcastCount = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messu_messages` mm INNER JOIN `".BIT_DB_PREFIX."messu_system_message_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` = ?", array($pUserId, ROOT_USER_ID));
+ $broadcastCount2 = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messu_messages` mm WHERE mm.`to_user_id` = ? AND NOT EXISTS ( SELECT msm.`msg_id` FROM `".BIT_DB_PREFIX."messu_system_message_map` msm WHERE msm.`msg_id` = mm.`msg_id` AND msm.`to_user_id` = ?)", array(ROOT_USER_ID, $pUserId));
+ return $normalCount + $broadcastCount + $broadcastCount2;
}
}
diff --git a/templates/messu_broadcast.tpl b/templates/messu_broadcast.tpl
index 7068d82..2a584fc 100644
--- a/templates/messu_broadcast.tpl
+++ b/templates/messu_broadcast.tpl
@@ -5,10 +5,9 @@
</div>
{include file="bitpackage:users/my_bitweaver_bar.tpl"}
-{include file="bitpackage:messu/messu_nav.tpl"}
<div class="body">
-
+{formfeedback error=$errors success=$message}
{if $sent}
{$message}
{else}
@@ -18,11 +17,11 @@
<td><label for="broadcast-group">{tr}Group{/tr}:</label></td>
<td>
<select name="group" id="broadcast-group">
- {if $bit_p_broadcast_all eq 'y'}
- <option value="all" selected="selected">{tr}All users{/tr}</option>
- {/if}
+
{section name=ix loop=$groups}
- <option value="{$groups[ix].group_name|escape}">{$groups[ix].group_name}</option>
+ {if $groups[ix].group_id && $groups[ix].group_name}
+ <option value="{$groups[ix].group_id}">{$groups[ix].group_name}</option>
+ {/if}
{/section}
</select>
</td>