$node->title)));
if (!empty($form_state['post'])) {
drupal_set_message(t('Your message will be sent to all members of this group.'));
}
$form['subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#size' => 70,
'#maxlength' => 250,
'#description' => t('Enter a subject for your message.'),
'#required' => TRUE,
);
$form['body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#rows' => 5,
'#cols' => 90,
'#description' => t('Enter a body for your message.'),
'#required' => TRUE
);
$form['send'] = array('#type' => 'submit', '#value' => t('Send message'));
$form['gid'] = array('#type' => 'value', '#value' => $node->nid);
return $form;
}
function og_broadcast_form_submit($form, &$form_state) {
global $user;
$sql = og_list_users_sql(1);
$result = db_query($sql, $form_state['values']['gid']);
$recipients = array();
while ($row = db_fetch_object($result)) {
$recipients[] = $row->uid;
}
$node = node_load($form_state['values']['gid']);
$variables = array(
'@group' => $node->title,
'@subject' => $form_state['values']['subject'],
'@body' => $form_state['values']['body'],
'@site' => variable_get('site_name', 'drupal'),
'!url_group' => url("node/$node->nid", array('absolute' => TRUE)),
'!url_unsubscribe' => url("og/unsubscribe/$node->nid/$user->uid", array('absolute' => TRUE))
);
$message = array(
'from' => $user,
'subject' => $form_state['values']['subject'],
'body' => _og_mail_text('og_admin_email_body', $variables)
);
// Send notifications to each member; Sending an array of recipients implies
// that this is a bulk message.
module_invoke_all('og', 'user broadcast', $node->nid, $recipients, $message);
drupal_set_message(format_plural(count($recipients), '1 message queued for delivery.', '@count messages queued for delivery.'));
}
function og_manage($group_node) {
global $user;
$bc = og_get_breadcrumb($group_node);
drupal_set_breadcrumb($bc);
return drupal_get_form('og_manage_form', $group_node);
}
function og_manage_form($form_state, $group) {
global $user;
// avoid double messages on form submit
if (!$form_state['post']) {
// group manager can't leave
if ($group->og_selective == OG_CLOSED) {
drupal_set_message(t('You may not leave this group because it is a closed group. You should request removal from a group administrator.'));
}
elseif ($group->uid == $user->uid) {
drupal_set_message(t('You may not leave this group because you are its owner. A site administrator can assign ownership to another user and then you may leave.'));
}
else {
$links[] = l(t('Leave this group'), "og/unsubscribe/$group->nid/$user->uid");
$form['unsubscribe'] = array('#value' => theme('item_list', $links));
}
}
$form['gid'] = array('#type' => 'value', '#value' => $group->nid);
return $form;
}
function og_manage_form_submit($form, &$form_state) {
global $user;
$passed_values = $form_state['values'];
unset($passed_values['gid'], $passed_values['op'], $passed_values['form_id'], $passed_values['form_build_id'], $passed_values['form_token']);
og_save_subscription($form_state['values']['gid'], $user->uid, $passed_values);
drupal_set_message(t('Membership saved.'));
}
/**
* OG create admin form
*/
function og_create_admin_confirm($form_state, $node, $account) {
$form['node'] = array('#type' => 'value', '#value' => $node);
$form['account'] = array('#type' => 'value', '#value' => $account);
return confirm_form($form,
t('Are you sure you want to make !name a group administrator for the group %title?', array('!name' => theme('username', $account), '%title' => $node->title)),
"og/users/$node->nid",
' ',
t('Confirm'),
t('Cancel'));
}
/**
* Confirm og create admin form
*/
function og_create_admin_confirm_submit($form, &$form_state) {
$account = $form_state['values']['account'];
$node = $form_state['values']['node'];
og_save_subscription($node->nid, $account->uid, array('is_admin' => 1));
drupal_set_message(t('%name was promoted to group administrator.', array('%name' => $account->name)));
$variables = array(
'@group' => $node->title,
'!group_url' => url("node/$node->nid", array('absolute' => TRUE)),
'@username' => $account->name
);
$message = array(
'subject' => _og_mail_text('og_new_admin_subject', $variables),
'body' => _og_mail_text('og_new_admin_body', $variables)
);
module_invoke_all('og', 'admin create', $node->nid, $account->uid, $message);
$form_state['#redirect'] = "og/users/$node->nid";
}
/**
* OG remove admin form
*/
function og_remove_admin_confirm($form_state, $node, $account) {
$form['gid'] = array('#type' => 'value', '#value' => $node->nid);
$form['account'] = array('#type' => 'value', '#value' => $account);
return confirm_form($form,
t('Are you sure you want to remove !name as a group administrator for the group %title?', array('!name' => theme('username', $account), '%title' => $node->title)),
"og/users/$node->nid",
' ',
t('Remove'),
t('Cancel')
);
}
/**
* Confirm og remove admin form
*/
function og_remove_admin_confirm_submit($form, &$form_state) {
$account = $form_state['values']['account'];
$gid = $form_state['values']['gid'];
og_save_subscription($gid, $account->uid, array('is_admin' => 0));
drupal_set_message(t('%name is no longer a group administrator.', array('%name' => $account->name)));
$form_state['redirect'] = "og/users/$gid";
}
function og_invite_form($form_state, $node) {
$bc = og_get_breadcrumb($node);
drupal_set_breadcrumb($bc);
$max = variable_get('og_email_max', 10);
$form['mails'] = array(
'#type' => 'textarea',
'#title' => t('Email addresses or usernames'),
'#description' => t('Enter up to %max email addresses or usernames. Separate multiple addresses by commas or new lines. Each person will receive an invitation message from you.', array('%max' => $max))
);
$form['pmessage'] = array(
'#type' => 'textarea',
'#title' => t('Personal message'),
'#description' => t('Optional. Enter a message which will become part of the invitation email.')
);
$form['op'] = array('#type' => 'submit', '#value' => t('Send invitation'));
$form['gid'] = array ('#type' => 'value', '#value' => $node->nid);
return $form;
}
// TODOL Use #element_validate as per http://drupal.org/node/144132#element-validate
function og_invite_form_validate($form, &$form_state) {
global $user;
$max = variable_get('og_email_max', 10);
$mails = $form_state['values']['mails'];
$mails = str_replace("\n", ',', $mails);
$emails = explode(',', $mails);
if (count($emails) > $max) {
form_set_error('mails', t('You may not specify more than %max email addresses or usernames.', array('%max' => $max)));
}
elseif (in_array($user->mail, $emails)) {
form_set_error('mails', t('You may not invite yourself - @self.', array('@self' => $user->mail)));
}
else {
$valid_emails = array();
$bad = array();
foreach ($emails as $email) {
$email = trim($email);
if (empty($email)) {
continue;
}
if (valid_email_address($email)) {
$valid_emails[] = $email;
}
else {
$account = user_load(array('name' => check_plain($email)));
if ($account->mail) {
$valid_emails[] = $account->mail;
}
else {
$bad[] = $email;
}
}
}
if (count($bad)) {
form_set_error('mails', t('Invalid email address or username: @value.', array('@value' => implode(', ', $bad))));
}
else {
// Store valid e-mails so we don't have to go through that looping again on submit
$form_state['valid_emails'] = $valid_emails;
}
}
}
function og_invite_form_submit($form, &$form_state) {
$emails = $form_state['valid_emails'];
$node = node_load($form_state['values']['gid']);
$variables = array(
'@group' => $node->title,
'@description' => $node->og_description,
'@site' => variable_get('site_name', 'drupal'),
'!group_url' => url("og/subscribe/$node->nid", array('absolute' => TRUE)),
'@body' => $form_state['values']['pmessage'],
);
global $user;
$from = $user->mail;
foreach ($emails as $mail) {
drupal_mail('og', 'invite_user', $mail, $GLOBALS['language'], $variables, $from);
}
drupal_set_message(format_plural(count($emails), '1 invitation sent.', '@count invitations sent.'));
}
function og_subscribe($node, $uid = NULL) {
global $user;
if (is_null($uid)) {
if ($user->uid) {
$account = $user;
}
else {
$dest = drupal_get_destination();
if (variable_get('user_register', 1) == 0) {
drupal_set_message(t('In order to join this group, you must login. After you have successfully done so, you will need to request membership again.', array('!login' => url("user/login", array('query' => $dest)))));
}
else {
drupal_set_message(t('In order to join this group, you must login or register a new account. After you have successfully done so, you will need to request membership again.', array('!register' => url("user/register", array('query' => $dest)), '!login' => url("user/login", array('query' => $dest)))));
}
drupal_goto('user');
}
}
else {
$account = user_load(array('uid' => $uid));
}
if ($node->og_selective >= OG_INVITE_ONLY || $node->status == 0 || !og_is_group_type($node->type)) {
drupal_access_denied();
exit();
}
// Only admins can add another member.
if ($account->uid != $user->uid && !og_is_group_admin($node)) {
drupal_access_denied();
exit();
}
// User is already a member of this group, redirect to group homepage.
else if (isset($account->og_groups[$node->nid])) {
drupal_set_message(t('@user is already a member the group @group.', array('@user' => $account->name, '@group' => $node->title)));
drupal_goto('node/'. $node->nid);
}
else {
return drupal_get_form('og_confirm_subscribe', $node->nid, $node, $account);
}
}
/**
* Confirm og membership form
*/
function og_confirm_subscribe($form_state, $gid, $node, $account) {
$form['gid'] = array('#type' => 'value', '#value' => $gid);
$form['account'] = array('#type' => 'value', '#value' => $account);
if ($node->og_selective == OG_MODERATED) {
$form['request'] = array(
'#type' => 'textarea',
'#title' => t('Additional details'),
'#description' => t('Add any detail which will help an administrator decide whether to approve or deny your membership request.')
);
}
else {
$form['request'] = array(
'#type' => 'value',
'#value' => '',
);
}
return confirm_form($form,
t('Are you sure you want to join the group %title?', array('%title' => $node->title)),
'node/'. $node->nid, ' ',
t('Join'), t('Cancel'));
}
/**
* Confirm og membership submit handler
*/
function og_confirm_subscribe_submit($form, &$form_state) {
$return = og_subscribe_user($form_state['values']['gid'], $form_state['values']['account'], $form_state['values']['request']);
if (!empty($return['message'])) {
drupal_set_message($return['message']);
}
$form_state['redirect'] = 'node/'. $form_state['values']['gid'];
}
/**
* Confirm og unsubscription form
*/
function og_confirm_unsubscribe($form_state, $group_node, $account) {
$form['group_node'] = array('#type' => 'value', '#value' => $group_node);
$form['account'] = array('#type' => 'value', '#value' => $account);
return confirm_form($form,
t('Are you sure you want to remove !name from the group %title?', array('!name' => theme('username', $account), '%title' => $group_node->title)),
'og/users/'. $group_node->nid, ' ', t('Remove'), t('Cancel'));
}
/**
* Confirm og unsubscription submit handler
*/
function og_confirm_unsubscribe_submit($form, &$form_state) {
global $user;
$group_node = $form_state['values']['group_node'];
$account = $form_state['values']['account'];
og_delete_subscription($group_node->nid, $account->uid);
// If needed, reload user object to reflect unsubscribed group.
if ($user->uid == $account->uid) {
og_get_subscriptions($account->uid, 1, TRUE); // Clear cache.
$user = user_load(array('uid' => $user->uid));
}
drupal_set_message(t('%user removed from %group.', array('%user' => $account->name, '%group' => $group_node->title)));
// Determine where to go next. GHP if accessible, or else site front page.
$form_state['redirect'] = node_access('view', $group_node) ? "node/". $group_node->nid : '';
}
function og_add_users($form_state, $group_node) {
$form['og_names'] = array(
'#type' => 'textarea',
'#title' => t('List of users'),
'#rows' => 5,
'#cols' => 70,
// No autocomplete b/c user_autocomplete can't handle commas like taxonomy. pls improve core.
// '#autocomplete_path' => 'user/autocomplete',
'#description' => t('Add one or more usernames in order to associate users with this group. Multiple usernames should be separated by a comma.'),
'#element_validate' => array('og_add_users_og_names_validate'),
);
$form['op'] = array('#type' => 'submit', '#value' => t('Add users'));
$form['gid'] = array('#type' => 'value', '#value' => $group_node->nid);
return $form;
}
// An #element_validate handler
function og_add_users_og_names_validate($form, $form_state) {
$names = explode(',', $form_state['values']['og_names']);
foreach ($names as $name) {
$account = user_load(array('name' => trim($name)));
if (isset($account->uid)) {
$accounts[] = $account;
$uids[] = $account->uid;
}
else {
$bad[] = check_plain($name);
$err = TRUE;
}
}
if (isset($err)) {
form_set_error('og_names', format_plural(count($bad), 'Unrecognized name: %bad.', 'Unrecognized names: %bad.', array('%bad' => implode(', ', $bad))));
}
}
function og_add_users_submit($form, &$form_state) {
// Safest option is to do a select, filter existing members, then insert.
$names = explode(',', $form_state['values']['og_names']);
foreach ($names as $name) {
$account = user_load(array('name' => trim($name)));
if ($account->uid) {
$accounts[] = $account;
}
}
foreach ($accounts as $account) {
og_save_subscription($form_state['values']['gid'], $account->uid, array('is_active' => 1));
}
drupal_set_message(format_plural(count($accounts), '1 user added to the group.', '@count users added to the group.'));
}
function og_page_activity() {
$sql = "SELECT oga.group_nid, node_group_nid.title, node_group_nid.uid, u.name, COUNT(*) as ncount, MAX(n.created) as ncreated, SUM(ncs.comment_count) as ccount, MAX(last_comment_timestamp) AS lct FROM {node} n INNER JOIN {og_ancestry} oga ON n.nid = oga.nid LEFT JOIN {node_comment_statistics} ncs ON n.nid = ncs.nid INNER JOIN {node} node_group_nid ON oga.group_nid = node_group_nid.nid INNER JOIN {users} u ON node_group_nid.uid = u.uid WHERE n.status = 1 GROUP BY oga.group_nid, node_group_nid.title, node_group_nid.uid, u.name";
$header = array(
array('data' => t('Title'), 'field' => 'node_group_nid.title'),
array('data' => t('Manager'), 'field' => 'u.name'),
array('data' => t('Posts'), 'field' => 'ncount'),
array('data' => t('Comments'), 'field' => 'ccount'),
array('data' => t('Age'), 'field' => 'ncreated'),
array('data' => t('Last comment'), 'field' => 'lct', 'sort' => 'asc'),
);
$result = db_query($sql. tablesort_sql($header));
while ($row = db_fetch_object($result)) {
$rows[] = array(
l($row->title, "node/$row->group_nid"),
theme('username', $row),
$row->ncount,
$row->ccount,
format_interval(time()-$row->ncreated),
format_interval(time()-$row->lct),
);
}
if (!isset($rows)) {
$rows[] = array(array('data' => t('No groups available.'), 'colspan' => 6));
}
return theme('table', $header, $rows);
}