You are here

notifications_forum.module in Forum notifications 6

Same filename and directory in other branches
  1. 7 notifications_forum.module

File

notifications_forum.module
View source
<?php

/**
 * Implements hook_theme().
 */
function notifications_forum_theme() {
  return array(
    'notifications_forum_user_subscriptions_form' => array(
      'arguments' => array(
        'form' => NULL,
      ),
    ),
  );
}

/**
 * Implements hook_link().
 */
function notifications_forum_link($type, $node = NULL, $teaser = FALSE) {
  global $user;
  $links = array();

  // TODO: we should probably do the notifications per-content to remove the $node->type == 'forum' check
  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') {

            // rename 'This post' to 'This thread'
            $subscription->name = t('This thread');
          }
          elseif ($subscription->type == 'taxonomy') {

            // rename from long tag name to just 'This forum'
            $subscription->name = t('This forum');
          }
        }
        if ($link = $subscription
          ->build_link()) {
          $links['notifications_' . $index] = $link;
        }
      }
    }
  }
  return $links;
}

/**
 * Implements hook_menu().
 */
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;
}

/**
 * Access callback for the user forum notifications page.
 */
function notifications_forum_user_tab_access($type, $account) {

  // Global user permissions
  if (notifications_access_user($account) && notifications_subscription_type_enabled($type)) {

    // Check specifics for this subscription type
    $access = notifications_subscription_types($type, 'access');
    return $access ? user_access($access, $account) : TRUE;
  }
}

// Helper function to subscribe a user to a forum
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);
}

/**
 * Implements hook_user().
 */
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']);

      // subscribe to the forums
      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);
}

/**
 * User forum notifications form.
 */
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);

  // lookup existing subscriptions and index by 'tid'
  $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;
}

/**
 * Submit function for the user forum notifactions 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.'));
}

/**
 * Theme the user forum notifications form.
 */
function theme_notifications_forum_user_subscriptions_form($form) {
  $header = array(
    t('Forum'),
    /*
    array(
      'data' => t('Description'),
      'width' => '100%',
    ),
    */
    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,
  );
}

/**
 * Preprocess function for theme_forum_list().
 *
 * Adds a subscribe/unsubscribe link under each forum on the forum list.
 */
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>";
    }
  }
}