View source
<?php
function notifications_forum_theme() {
return array(
'notifications_forum_user_subscriptions_form' => array(
'arguments' => array(
'form' => NULL,
),
),
);
}
function notifications_forum_link($type, $node = NULL, $teaser = FALSE) {
global $user;
$links = array();
if ($type == 'node' && !$teaser && $node->type == 'forum' && notifications_access_subscribe($user)) {
notifications_include('object.inc');
if ($subscriptions = notifications_object_user_subscriptions($type, $node, $user)) {
foreach ($subscriptions as $index => $subscription) {
if ($node->type == 'forum') {
if ($subscription->type == 'thread') {
$subscription->name = t('This thread');
}
elseif ($subscription->type == 'taxonomy') {
$subscription->name = t('This forum');
}
}
if ($link = $subscription
->build_link()) {
$links['notifications_' . $index] = $link;
}
}
}
}
return $links;
}
function notifications_forum_menu() {
$items = array();
$items['user/%user/notifications/forum'] = array(
'type' => MENU_LOCAL_TASK,
'access callback' => '_notifications_forum_user_forum_access',
'access arguments' => array(
1,
),
'title' => t('Forums'),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'notifications_forum_user_forum_form',
1,
),
'weight' => 10,
);
return $items;
}
function notifications_forum_user_tab_access($type, $account) {
if (notifications_access_user($account) && notifications_subscription_type_enabled($type)) {
$access = notifications_subscription_types($type, 'access');
return $access ? user_access($access, $account) : TRUE;
}
}
function _notifications_forum_subscribe_to_forum($account, $tid, $opts) {
$subscription = array(
'type' => 'taxonomy',
'uid' => $account->uid,
'fields' => array(
'tid' => $tid,
),
'send_method' => $opts['send_method'],
'send_interval' => $opts['send_interval'],
'event_type' => 'node',
);
if (!empty($opts['sid'])) {
$subscription['sid'] = $opts['sid'];
}
$subscription = notifications_build_subscription($subscription);
$ret = notifications_save_subscription($subscription);
}
function notifications_forum_user($op, &$edit, &$account, $category = NULL) {
switch ($op) {
case 'register':
$forums = array();
foreach (forum_get_forums() as $forum) {
$forums[$forum->tid] = $forum->name;
}
if (empty($forums)) {
return;
}
$form['notifications_forum'] = array(
'#type' => 'fieldset',
'#title' => t('Notifications'),
'#tree' => TRUE,
);
$form['notifications_forum']['forums'] = array(
'#type' => 'checkboxes',
'#title' => t('Forums'),
'#options' => $forums,
'#description' => t('The forums you would like to subscribe to.'),
);
$form['notifications_forum']['send_method'] = array(
'#parents' => array(
'messaging_default',
),
'#type' => 'select',
'#title' => t('Default send method'),
'#options' => messaging_method_list(),
'#default' => messaging_method_default(),
);
$form['notifications_forum']['send_interval'] = array(
'#parents' => array(
'notifications_send_interval',
),
'#type' => 'select',
'#title' => t('Default send interval'),
'#options' => notifications_send_intervals(),
'#default' => variable_get('notifications_default_send_interval', 0),
);
return $form;
case 'insert':
$forums = $edit['notifications_forum']['forums'];
unset($edit['notifications_forum']);
foreach ($forums as $tid) {
if ($tid > 0) {
_notifications_forum_subscribe_to_forum($account, $tid, array(
'send_method' => $edit['messaging_default'],
'send_interval' => $edit['notifications_send_interval'],
));
}
}
break;
}
}
function _notifications_forum_user_forum_access($account) {
global $user;
return ($user->uid == $account->uid || $user->uid == 1) && notifications_access_user($account) && user_access('subscribe to taxonomy terms', $account);
}
function notifications_forum_user_forum_form(&$form_state, $account) {
$form = array();
$account = messaging_user_object($account);
$form['account'] = array(
'#type' => 'value',
'#value' => $account,
);
$send_methods = notifications_send_methods($account);
$send_intervals = notifications_send_intervals($account);
$subs = array();
foreach (notifications_get_subscriptions(array(
'type' => 'taxonomy',
'uid' => $account->uid,
)) as $sub) {
$subs[$sub->fields['tid']] = $sub;
}
$form['info'] = array(
'#value' => '<p>' . t('Your forum subscriptions:') . '</p>',
);
$form['subscriptions'] = array(
'#theme' => 'notifications_forum_user_subscriptions_form',
'#tree' => TRUE,
);
foreach (forum_get_forums() as $forum) {
$sub = !empty($subs[$forum->tid]) ? $subs[$forum->tid] : NULL;
$wrapper = array();
$wrapper['subscribe'] = array(
'#type' => 'checkbox',
'#title' => l($forum->name, "forum/{$forum->tid}"),
'#default_value' => !is_null($sub),
);
$wrapper['tid'] = array(
'#type' => 'value',
'#value' => $forum->tid,
);
if (!is_null($sub)) {
$wrapper['sid'] = array(
'#type' => 'value',
'#value' => $sub->sid,
);
}
$wrapper['description'] = array(
'#type' => 'item',
'#title' => t('Description'),
'#value' => $forum->description,
);
$wrapper['send_method'] = array(
'#type' => 'select',
'#title' => t('Send method'),
'#options' => $send_methods,
'#default_value' => is_null($sub) ? notifications_user_setting('send_method', $account) : $sub->send_method,
);
$wrapper['send_interval'] = array(
'#type' => 'select',
'#title' => t('Send interval'),
'#options' => $send_intervals,
'#default_value' => is_null($sub) ? notifications_user_setting('send_interval', $account) : $sub->send_interval,
);
$form['subscriptions'][] = $wrapper;
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
function notifications_forum_user_forum_form_submit($form, &$form_state) {
$account = (object) $form_state['values']['account'];
foreach ($form_state['values']['subscriptions'] as $value) {
if ($value['subscribe']) {
_notifications_forum_subscribe_to_forum($account, $value['tid'], $value);
}
elseif (!empty($value['sid'])) {
notifications_subscription_delete($value['sid']);
}
}
drupal_set_message(t('Your forum subscriptions have been updated.'));
}
function theme_notifications_forum_user_subscriptions_form($form) {
$header = array(
t('Forum'),
t('Method'),
t('Interval'),
);
$rows = array();
foreach (element_children($form) as $key) {
$element = $form[$key];
$row = array();
$row[] = drupal_render($element['subscribe']);
foreach (array(
'send_method',
'send_interval',
) as $name) {
unset($element[$name]['#title']);
$row[] = drupal_render($element[$name]);
}
$rows[] = $row;
}
return theme('table', $header, $rows);
}
function _notifications_forum_toggle_subscription_url($tid) {
global $user;
$original = NULL;
if ($subscriptions = notifications_get_subscriptions(array(
'type' => 'taxonomy',
'uid' => $user->uid,
'event_type' => 'node',
), array(
'tid' => $tid,
), TRUE)) {
$original = array_shift($subscriptions);
}
$type = is_null($original) ? 'subscribe' : 'unsubscribe';
$url = notifications_build_link($type, array(
'type' => 'taxonomy',
'uid' => $user->uid,
'fields' => array(
'tid' => $tid,
),
'event_type' => 'node',
'destination' => TRUE,
), 'subscription', $original, 'url');
return array(
$type,
$url,
);
}
function notifications_forum_preprocess_forum_list(&$vars) {
if (user_access('subscribe to taxonomy terms')) {
foreach ($vars['forums'] as $forum_id => &$forum) {
list($type, $url) = _notifications_forum_toggle_subscription_url($forum_id);
$link = t($type == 'subscribe' ? '<a href="!url">Subscribe</a> to this forum' : '<a href="!url">Unsubscribe</a> from this forum', array(
'!url' => $url,
));
$forum->description .= "<div class='forum-subscribe'>{$link}</div>";
}
}
}