You are here

og_notifications.module in Organic groups 6

Same filename and directory in other branches
  1. 6.2 modules/og_notifications/og_notifications.module

Provide notifications and messaging support for organic groups.

@author Karthik Kumar / Zen [ http://drupal.org/user/21209 ].

File

modules/og_notifications/og_notifications.module
View source
<?php

/**
 * @file
 * Provide notifications and messaging support for organic groups.
 *
 * @author Karthik Kumar / Zen [ http://drupal.org/user/21209 ].
 */

/**
 * Implementation of hook_help().
 */
function og_notifications_help($path, $arg) {
  global $user;
  switch ($path) {
    case 'user/%/notifications/group':
      return t('Customize notifications for each of your groups along with their frequency and delivery method. If so desired, you can also restrict notifications only for certain content types in each group.');
  }
}

/**
 * Implementation of hook_menu().
 */
function og_notifications_menu() {
  $items = array();
  $items['user/%user/notifications/group'] = array(
    'title' => 'Groups',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'og_notifications_user_page',
      1,
    ),
    'access callback' => 'notifications_content_access',
    'access arguments' => array(
      1,
      'subscribe to content in groups',
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => 10,
  );

  // grouptype redirects to group.
  $items['user/%user/notifications/grouptype'] = array(
    'page callback' => 'og_notifications_grouptype_user_page',
    'page arguments' => array(
      1,
    ),
    'access callback' => 'notifications_content_access',
    'access arguments' => array(
      1,
      'subscribe to content in groups',
    ),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Implementation of hook_perm().
 */
function og_notifications_perm() {
  return array(
    'subscribe to content in groups',
  );
}

/**
 * Implementation of hook_user().
 * Handle uid entry in the og_notifications table.
 */
function og_notifications_user($type, &$edit, &$user, $category = NULL) {
  switch ($type) {
    case 'insert':
      db_query("INSERT INTO {og_notifications} (uid) VALUES (%d)", $user->uid);
      break;
    case 'update':
      if (isset($edit['og_notifications_autosubscribe'])) {
        og_notifications_user_autosubscribe_set($user->uid, $edit['og_notifications_autosubscribe']);
        unset($edit['og_notifications_autosubscribe']);
      }
      break;
    case 'delete':
      db_query("DELETE FROM {og_notifications} WHERE uid = %d", $user->uid);
      break;
  }
}

/**
 * Implementation of hook_form_alter().
 */
function og_notifications_form_alter(&$form, $form_state, $form_id) {
  switch ($form_id) {
    case 'notifications_content_settings_form':
      $form['group'] = array(
        '#type' => 'fieldset',
        '#title' => t('Group subscriptions'),
        '#collapsible' => TRUE,
        '#weight' => 0,
      );

      // General content settings
      $select = array();
      $nodetypes = node_get_types();
      $ogtypes = og_get_types('group_post');
      foreach ($ogtypes as $ntype) {
        $select[$ntype] = $nodetypes[$ntype]->name;
      }
      $form['group']['og_notifications_content_types'] = array(
        '#type' => 'checkboxes',
        '#title' => t('Allowed content types'),
        '#default_value' => variable_get('og_notifications_content_types', array()),
        '#options' => $select,
        '#description' => t('Select specific content types which should be <em>allowed</em> for subscriptions to <em>group + content type</em>.'),
        '#multiple' => TRUE,
      );
      break;
    case 'user_profile_form':

      // Insert autosubscribe option into the messaging section of the user edit
      // form.
      // user_profile_form is, oddly enough, also the form_id for forms in other
      // sub-tabs such as those added by the profile module.
      if (!arg(3)) {
        $account = $form['_account']['#value'];
        $form['messaging']['og_notifications_autosubscribe'] = array(
          '#type' => 'checkbox',
          '#title' => t('Automatically enable notifications for any groups that I join.'),
          '#description' => t('Group notifications can also be <a href="!manage-url">customized</a> in greater detail if required.', array(
            '!manage-url' => url('user/' . $account->uid . '/notifications/group'),
          )),
          '#default_value' => og_notifications_user_autosubscribe_get($account->uid),
        );
      }
      break;
    case 'og_admin_settings':
      unset($form['og_new_node_subject'], $form['og_new_node_body']);
      $form['og_settings']['notifications']['#description'] = t('Node event notifications can be configured via the <a href="!url">messaging templates</a> interface.', array(
        '!url' => url('admin/messaging/template'),
      ));

      // Default autosubscription setting.
      $form['og_settings']['notifications']['og_notifications_autosubscribe'] = array(
        '#type' => 'checkbox',
        '#title' => t('Autosubscribe users to any groups that they join.'),
        '#description' => t('Automatically enable notifications by default. Users can override this via their account page. Changing this setting will only affect new users and those who have not overridden the system default.'),
        '#default_value' => variable_get('og_notifications_autosubscribe', 1),
        '#weight' => -5,
      );
      break;
  }
}

/**
 * Implementation of hook_nodeapi().
 */
function og_notifications_nodeapi(&$node, $op, $arg = 0) {
  switch ($op) {
    case 'delete':

      // Remove all group subscriptions for this node.
      notifications_delete_subscriptions(array(
        'type' => 'group',
      ), array(
        'group' => $node->nid,
      ));
      notifications_delete_subscriptions(array(
        'type' => 'grouptype',
      ), array(
        'group' => $node->nid,
      ));
      break;
  }
}

/**
 * Implementation of hook_og().
 */
function og_notifications_og($op, $gid, $uid, $args) {
  switch ($op) {
    case 'user insert':
      $account = user_load(array(
        'uid' => $uid,
      ));
      og_notifications_user_autosubscribe($account, $gid);
      break;
    case 'user delete':
      $account = user_load(array(
        'uid' => $uid,
      ));
      og_notifications_user_unsubscribe($account, $gid);
      break;
    case 'user request':

    // This and other notifications related ops drop down to the same case.
    // These different ops have been provided for consistency and flexibility
    // during use by other modules.
    case 'user approve':
    case 'admin create':
    case 'admin new':
    case 'user broadcast':
      $destinations = is_array($uid) ? $uid : array(
        $uid,
      );
      foreach ($destinations as $uid) {
        notifications_lite_send($uid, $args['subject'], $args['body']);
      }
      break;
  }
}

/**
 * Implementation of hook_messaging().
 */
function og_notifications_messaging($op, $arg1 = NULL, $arg2 = NULL, $arg3 = NULL, $arg4 = NULL) {
  switch ($op) {
    case 'message groups':

      // Generic notifications event
      $info['og-notifications'] = array(
        'module' => 'og_notifications',
        'name' => t('OG notifications (default)'),
        'help' => t('Most fields will be provided during the event.'),
        'description' => t('Notifications for organic groups node events. Other group notification strings can be customized via the <a href="!url">OG config</a> page.', array(
          '!url' => url('admin/og/og'),
        )),
      );
      $info['og-notifications-insert'] = array(
        'module' => 'og_notifications',
        'name' => t('OG notifications for new content'),
        'help' => t('Most fields will be provided during the event.'),
        'description' => t('Notifications for organic groups node creation events.'),
      );
      $info['og-notifications-update'] = array(
        'module' => 'og_notifications',
        'name' => t('OG notifications for updated content'),
        'help' => t('Most fields will be provided during the event.'),
        'description' => t('Notifications for organic groups node update events.'),
      );
      $info['og-notifications-comment'] = array(
        'module' => 'og_notifications',
        'name' => t('OG notifications for comments'),
        'help' => t('Most fields will be provided during the event.'),
        'description' => t('Notifications for organic groups comment events.'),
      );
      return $info;
    case 'message keys':
      $type = $arg1;
      switch ($type) {
        case 'og-notifications':
        case 'og-notifications-insert':
        case 'og-notifications-update':
        case 'og-notifications-comment':
          return array(
            'subject' => t('Subject'),
            'header' => t('Body header'),
            'main' => t('Body'),
            'footer' => t('Body footer'),
          );
          break;
      }
      break;
    case 'messages':
      $type = $arg1;
      switch ($type) {
        case 'og-notifications':
        case 'og-notifications-update':
          return array(
            'subject' => t('[site-name] [ogname]: [title]'),
            'header' => t("Greetings, [user],"),
            'main' => array(
              t('A [type-name] has been updated in group [ogname]: [title]'),
              t('[node-teaser]'),
              t('Read more at [node-url].'),
            ),
            'footer' => array(
              t('This is an automatic message from [site-name]'),
              t('To manage your subscriptions, browse to [subscriptions-manage]'),
            ),
          );
        case 'og-notifications-insert':
          return array(
            'subject' => t('[site-name] [ogname]: [title]'),
            'header' => t("Greetings, [user],"),
            'main' => array(
              t('A [type-name] has been created in group [ogname]: [title]'),
              t('[node-teaser]'),
              t('Read more at [node-url].'),
            ),
            'footer' => array(
              t('This is an automatic message from [site-name]'),
              t('To manage your subscriptions, browse to [subscriptions-manage]'),
            ),
          );
        case 'og-notifications-comment':
          return array(
            'subject' => t('[site-name] [ogname]: [title]'),
            'header' => t("Greetings, [user],"),
            'main' => array(
              t('A new comment has been added by [comment-author-name] to this thread in group [ogname]: [comment-title]'),
              t('[comment-body]'),
              t('Read more at [comment-url] or reply via [comment-reply-url].'),
            ),
            'footer' => array(
              t('This is an automatic message from [site-name]'),
              t('To manage your subscriptions, browse to [subscriptions-manage]'),
            ),
          );
      }
      break;
    case 'tokens':
      $tokens = array();
      if (strpos($arg1, 'og-notifications') === 0) {
        $tokens = array(
          'global',
          'subscription',
          'user',
          'node',
          'comment',
        );
      }
      return $tokens;
  }
}

/**
 * A workaround to ensure that OG can provide custom message templates for
 * notifications.
 *
 * @param Object $message
 *   The message object.
 * @param Object $info
 *   Sending method information.
 */
function og_notifications_message_alter(&$message, $info) {
  if ($sid = _og_notification_check_message($message)) {
    $event = $message->notifications['events'][0];

    // Cater for different message groups (actions).
    $group = 'og-notifications-' . $event->action;
    $send_method = $message->method;
    $subscription = notifications_load_subscription($sid);
    $text = array(
      'subject' => messaging_message_part($group, 'subject', $send_method, $event),
      'header' => messaging_message_part($group, 'header', $send_method, $event),
      'main' => messaging_message_part($group, 'main', $send_method, $event),
      'footer' => messaging_message_part($group, 'footer', $send_method, $event),
    );
    $objects = array(
      'user' => $message->account,
      'node' => $event->objects['node'],
      'subscription' => $subscription,
    );
    if ($event->action == 'comment') {
      $objects['comment'] = $event->objects['comment'];
    }
    $objects = array_merge($objects, $event->objects);
    $text = messaging_text_replace($text, $objects);
    $message->subject = $text['subject'];
    unset($text['subject']);
    $message->body = $text;
  }
}

/**
 * Implementation of hook_notifications().
 */
function og_notifications_notifications($op, &$arg0, $arg1 = NULL, $arg2 = NULL) {
  switch ($op) {
    case 'names':
      $subs =& $arg0;
      if ($subs->event_type == 'node') {
        if (!empty($subs->fields['group']) && ($group = node_load($subs->fields['group']))) {
          $subs->names['group'] = t('Group: %name', array(
            '%name' => $group->title,
          ));
        }
      }
      break;
    case 'subscription types':
      $types['group'] = array(
        'event_type' => 'node',
        'title' => t('Groups'),
        'access' => 'subscribe to content in groups',
        'page' => 'og_notifications_user_page',
        'fields' => array(
          'group',
        ),
      );
      $types['grouptype'] = array(
        'event_type' => 'node',
        'title' => t('Content type in group'),
        'access' => 'subscribe to content in groups',
        'page' => 'og_notifications_user_page',
        'fields' => array(
          'group',
          'type',
        ),
      );
      return $types;
    case 'query':
      if ($arg0 == 'event' && $arg1 == 'node' && ($node = $arg2->node) || $arg0 == 'user' && $arg1 == 'node' && ($node = $arg2)) {
        $query = array();
        if (isset($node->og_groups)) {
          $query[] = array(
            'join' => "LEFT JOIN {og_ancestry} oga ON oga.nid = %d",
            'join args' => array(
              $node->nid,
            ),
            'fields sql' => "f.field = 'group' AND f.intval = oga.group_nid",
          );
        }
        if ($arg0 == 'user' && og_is_group_type($node->type)) {
          $query[]['fields']['group'] = $node->nid;
        }
        return $query;
      }
      break;
    case 'node options':
      return _og_notifications_node_options($arg0, $arg1);
    case 'event load':

      // Piggy-backing on notifications_content.
      break;
    case 'event types':

      // Piggy-backing on notifications_content.
      break;
    case 'access':
      $type = $arg0;
      $account = $arg1;
      $object = $arg2;
      if ($type == 'subscription' && !empty($object->fields['group'])) {
        if (($group = node_load($object->fields['group'])) && og_is_group_type($group->type) && notifications_content_node_allow($account, $group)) {
          return array(
            TRUE,
          );
        }
        else {
          return array(
            FALSE,
          );
        }
      }
      break;
  }
}

/**
 * Menu callback: Group and grouptype subscription management form. This should
 * ideally play nicer with notifications_user_form. However, due to issues with
 * support for multi-field subscriptions, it is currently going about things in
 * a roundabout manner.
 *
 * @param Object $account
 *   User object of the user whose page is to be displayed.
 * @return Array $form
 *   Form array.
 */
function og_notifications_user_page($form_state, $account = NULL) {
  global $user;
  $account = $account ? $account : $user;
  if (!empty($account->og_groups)) {
    $ngroups = _og_notifications_user_groups($account->uid);
    $ngrouptypes = _og_notifications_user_grouptypes($account->uid);

    // Tap into notifications_user_form to retrieve variables and defaults.
    $group_form = notifications_user_form(NULL, $account, 'group', $ngroups, $account->og_groups, array(
      'type' => 'group',
      'event_type' => 'node',
    ), array(
      'title' => t('Group'),
    ));

    // Grouptype uses multiple fields which are not addressed adequately by
    // notifications_user_form.
    $grouptype_form = notifications_user_form(NULL, $account, 'grouptype', $ngrouptypes, variable_get('og_notifications_content_types', array()), array(
      'type' => 'grouptype',
      'event_type' => 'node',
    ), array(
      'title' => t('Group Type'),
    ));

    // TODO: Trim unnecessary items.
    $form = array(
      'account' => $group_form['account'],
      'group_defaults' => $group_form['defaults'],
      'group_current' => $group_form['current'],
      'group_subscription_fields' => $group_form['subscription_fields'],
      'grouptype_defaults' => $grouptype_form['defaults'],
      'grouptype_current' => $grouptype_form['current'],
      'grouptype_subscription_fields' => $grouptype_form['subscription_fields'],
    );
    $content_types = array_filter(variable_get('og_notifications_content_types', array()));
    $content_names = node_get_types('names');
    foreach ($account->og_groups as $gid => $group) {
      $group_index = 'groups-' . $gid;
      $types = array();
      foreach ($content_types as $type => $title) {

        // Check if value exists; Only enable node type subscriptions if the
        // group is not already subscribed to (for all posts).
        $bool = isset($ngrouptypes[$gid]) && isset($ngrouptypes[$gid][$type]);
        $types[$type] = array(
          'title' => check_plain($content_names[$type]),
          'checkbox' => $bool,
          'send_interval' => $bool ? $ngrouptypes[$gid][$type]->send_interval : $grouptype_form['defaults']['#value']['send_interval'],
          'send_method' => $bool ? $ngrouptypes[$gid][$type]->send_method : $grouptype_form['defaults']['#value']['send_method'],
        );
      }
      $bool = isset($ngroups[$gid]);
      $all = array(
        'all' => array(
          'title' => t('All'),
          'checkbox' => $bool,
          'send_interval' => $bool ? $ngroups[$gid]->send_interval : $group_form['defaults']['#value']['send_interval'],
          'send_method' => $bool ? $ngroups[$gid]->send_method : $group_form['defaults']['#value']['send_method'],
        ),
      );
      $types = $all + $types;
      $form[$group_index] = array(
        '#type' => 'fieldset',
        '#title' => check_plain($group['title']),
        '#collapsible' => TRUE,
        '#collapsed' => !isset($ngroups[$gid]) && empty($ngrouptypes[$gid]),
      );

      // Reuse theme function.
      $form[$group_index]['subscriptions'] = array(
        '#tree' => TRUE,
        '#parents' => array(
          'groups',
          $gid,
        ),
        '#theme' => 'notifications_form_table',
        '#header' => array(
          theme('table_select_header_cell'),
          t('Type'),
          t('Send interval'),
          t('Send method'),
        ),
      );
      foreach ($types as $key => $value) {
        $form[$group_index]['subscriptions']['checkbox'][$key] = array(
          '#type' => 'checkbox',
          '#default_value' => $value['checkbox'],
        );
        $form[$group_index]['subscriptions']['title'][$key] = array(
          '#value' => t('%type posts in this group', array(
            '%type' => $value['title'],
          )),
        );
        $form[$group_index]['subscriptions']['send_interval'][$key] = array(
          '#type' => 'select',
          '#options' => _notifications_send_intervals(),
          '#default_value' => $value['send_interval'],
        );
        $form[$group_index]['subscriptions']['send_method'][$key] = array(
          '#type' => 'select',
          '#options' => _notifications_send_methods(),
          '#default_value' => $value['send_method'],
        );
      }
    }
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save'),
    );
  }
  else {
    $form = array();
    drupal_set_message(t('There are no active group subscriptions available.'));
  }
  return $form;
}

/**
 * Process og_notifications_user_page form submission.
 *
 * @todo Decide on whether to allow contenttype and "all" subscriptions for the
 * same group.
 */
function og_notifications_user_page_submit($form, &$form_state) {
  $groups = $grouptypes = array();
  $form_values = $form_state['values'];
  $current = $form_values['grouptype_current'];
  foreach ($form_values['groups'] as $gid => $values) {
    $groups['checkbox'][$gid] = $values['checkbox']['all'];
    $groups['send_interval'][$gid] = $values['send_interval']['all'];
    $groups['send_method'][$gid] = $values['send_method']['all'];
    unset($form_values['groups'][$gid]['checkbox']['all'], $form_values['groups'][$gid]['send_interval']['all'], $form_values['groups'][$gid]['send_method']['all']);

    // Save grouptype subscriptions directly as notifications_user_form_submit
    // does not handle multiple-field notifications very well.
    foreach ($form_values['groups'][$gid]['checkbox'] as $type => $check) {
      $subscription = NULL;
      if ($check == 1) {
        if (!isset($current[$gid]) || !isset($current[$gid][$type])) {
          $subscription = $form_values['grouptype_defaults'] + array(
            'uid' => $form_values['account']->uid,
          );
        }
        elseif ($current[$gid][$type]->send_interval != $values['send_interval'][$type] || $current[$gid][$type]->send_method != $values['send_method'][$type]) {
          $subscription = (array) $current[$gid][$type];
        }
        if ($subscription) {
          $subscription['send_interval'] = $values['send_interval'][$type];
          $subscription['send_method'] = $values['send_method'][$type];

          // String cast due to notifications requiring it as the value field is
          // a varchar.
          $subscription['fields'] = array(
            'group' => (string) $gid,
            'type' => $type,
          );
          notifications_save_subscription($subscription);
        }
      }
      elseif (isset($current[$gid]) && isset($current[$gid][$type])) {
        notifications_delete_subscription($current[$gid][$type]->sid);
      }
    }
  }

  // Save group changes.
  $group_submit['values'] = array(
    'account' => $form_values['account'],
    'current' => $form_values['group_current'],
    'defaults' => $form_values['group_defaults'],
    'subscription_fields' => $form_values['group_subscription_fields'],
    'subscriptions' => $groups,
  );
  notifications_user_form_submit('og_notifications_user_page', $group_submit);
}

/**
 * Menu callback: Since the default notifications UI lists group and grouptype
 * as separate entries, redirect the grouptype management link to the group
 * management page.
 *
 * @param Object $account
 *   User object of the user whose grouptypes are to be managed.
 */
function og_notifications_grouptype_user_page($account) {
  drupal_goto('user/' . $account->uid . '/notifications/group');
}

/**
 * Handle autosubscriptions for users when they join a group.
 *
 * @param Object $account
 *   The user account object.
 * @param Integer $gid
 *   The node ID of the group being subscribed to.
 */
function og_notifications_user_autosubscribe($account, $gid) {
  if (og_notifications_user_autosubscribe_get($account->uid)) {
    og_notifications_user_subscribe($account, $gid);
  }
}

/**
 * Retrieve autosubscription setting for a particular user. -1 in the
 * og_notifications table indicates that the site default is to be used.
 *
 * @param Integer $uid
 *   The uid of the user.
 * @return Integer
 *   1 or 0 as per the autosubscribe preference.
 */
function og_notifications_user_autosubscribe_get($uid) {
  $autosubscribe = db_result(db_query("SELECT autosubscribe FROM {og_notifications} WHERE uid = %d", $uid));
  return $autosubscribe == -1 ? variable_get('og_notifications_autosubscribe', 1) : $autosubscribe;
}

/**
 * Retrieve autosubscription setting for a particular user.
 *
 * @param Integer $uid
 *   The uid of the user.
 * @param Integer $autosubscribe
 *   Autosubscription option: 0 or 1.
 */
function og_notifications_user_autosubscribe_set($uid, $autosubscribe) {
  return db_query("UPDATE {og_notifications} SET autosubscribe = %d WHERE uid = %d", $autosubscribe, $uid);
}

/**
 * Subscribe a user to a group or to be more precise, to all subscribe-able
 * content types within the group. This method is also called during the upgrade
 * process in .install.
 *
 * @param Object $account
 *   The user account object.
 * @param Integer $gid
 *   The node ID of the group being subscribed to.
 */
function og_notifications_user_subscribe($account, $gid) {

  // Remove all existing user->group subscriptions.
  og_notifications_user_unsubscribe($account, $gid);
  $subscription_default = _notifications_subscription_defaults($account);
  $subscription_default['uid'] = $account->uid;
  $subscription_default['type'] = 'grouptype';
  $subscription_default['event_type'] = 'node';

  // Only subscribe the user to enabled types.
  $content_types = array_filter(variable_get('og_notifications_content_types', array()));

  // If the types array is empty, subscribe to all group types. This is mainly
  // only valid during the upgrade.
  if (empty($content_types)) {
    $content_types = og_get_types('group_post');
  }
  foreach ($content_types as $type) {

    // Reset $subscription as notifications_save_subscription casts the input
    // array into an object.
    $subscription = $subscription_default;

    // String cast due to notifications requiring it (as the value field is
    // a varchar).
    $subscription['fields'] = array(
      'group' => (string) $gid,
      'type' => $type,
    );
    notifications_save_subscription($subscription);
  }
}

/**
 * Unsubscribe a user from a group. This also unsubscribes the user from any
 * grouptype subscriptions within the group.
 *
 * @param Object $account
 *   The user account object.
 * @param Integer $gid
 *   The node ID of the group being subscribed to.
 */
function og_notifications_user_unsubscribe($account, $gid) {

  // @todo: Handle direct node subscriptions for private groups.
  // Niche cases include multi-group nodes.
  notifications_delete_subscriptions(array(
    'uid' => $account->uid,
    'type' => 'grouptype',
  ), array(
    'group' => $gid,
  ));
  notifications_delete_subscriptions(array(
    'uid' => $account->uid,
    'type' => 'group',
  ), array(
    'group' => $gid,
  ));
}

/**
 * Retrieve a list of organic groups that a user is subscribed (via
 * notifications) to.
 *
 * @param Integer $uid
 *   The user ID of the user whose groups are to be retrieved.
 * @return Array $ngroups
 *   An associative array of the resulting groups.
 */
function _og_notifications_user_groups($uid) {

  // No checks for group published or not? NB: Nodes belonging to unpublished
  // groups are still accessible with links to the parent group.
  $query = "SELECT no.*, nof.value AS nid, n.type AS node_type, n.title FROM {notifications} no\n    INNER JOIN {notifications_fields} nof ON no.sid = nof.sid LEFT JOIN {node} n ON nof.value = CAST(n.nid AS CHAR(255))\n    WHERE no.uid = %d AND (no.type = 'group') AND no.conditions = 1 AND nof.field = 'group'\n    ORDER BY node_type, n.title";
  $results = db_query($query, $uid);
  $ngroups = array();
  while ($sub = db_fetch_object($results)) {
    $ngroups[$sub->nid] = $sub;
  }
  return $ngroups;
}

/**
 * Retrieve a list of organic group content types that a user is subscribed (via
 * notifications) to.
 *
 * @param Integer $uid
 *   The user ID of the user whose groups are to be retrieved.
 * @return Array $ngrouptypes
 *   An associative array of the resulting content types sorted by groups.
 */
function _og_notifications_user_grouptypes($uid) {
  $query = "SELECT no.*, nof1.value AS group_nid, nof2.value AS node_type FROM {notifications} no\n    INNER JOIN {notifications_fields} nof1 ON no.sid = nof1.sid\n    INNER JOIN {notifications_fields} nof2 ON no.sid = nof2.sid\n    WHERE no.uid = %d AND (no.type = 'grouptype') AND no.conditions = 2 AND nof1.field = 'group' AND nof2.field = 'type'\n    ORDER BY group_nid, node_type";
  $results = db_query($query, $uid);
  $ngrouptypes = array();
  while ($sub = db_fetch_object($results)) {
    $ngrouptypes[$sub->group_nid][$sub->node_type] = $sub;
  }
  return $ngrouptypes;
}

/**
 * Options to display for node subscriptions.
 */
function _og_notifications_node_options($account, $node) {
  $options = array();

  // If node is a group type and the user is subscribed to this group.
  if (og_is_group_type($node->type) && isset($account->og_groups[$node->nid])) {
    $options[] = array(
      'name' => t('All posts in %group', array(
        '%group' => $node->title,
      )),
      'type' => 'group',
      'fields' => array(
        'group' => $node->nid,
      ),
    );
    foreach (array_filter(variable_get('og_notifications_content_types', array())) as $type) {
      $options[] = array(
        'name' => t('%type posts in %group', array(
          '%group' => $node->title,
          '%type' => node_get_types('name', $type),
        )),
        'type' => 'grouptype',
        'fields' => array(
          'group' => $node->nid,
          'type' => $type,
        ),
      );
    }
  }

  // If node is part of a group user may be subscribed to the node through one
  // of the groups.
  if (isset($node->og_groups)) {
    foreach ($node->og_groups as $index => $gid) {

      // Only members get to see subscription options.
      if (isset($account->og_groups[$gid])) {

        // Content type
        $options[] = array(
          'name' => t('Posts in group %name', array(
            '%name' => $node->og_groups_both[$gid],
          )),
          'type' => 'group',
          'fields' => array(
            'group' => $gid,
          ),
        );
        $options[] = array(
          'name' => t('%type posts in %group', array(
            '%group' => $node->og_groups_both[$gid],
            '%type' => node_get_types('name', $node->type),
          )),
          'type' => 'grouptype',
          'fields' => array(
            'group' => $gid,
            'type' => $node->type,
          ),
        );
      }
    }
  }
  return $options;
}

/**
 * Helper function for og_notifications_message_alter. This function checks to
 * see if the message object being passed is an OG notification.
 *
 * @param Object $message
 *   The message object
 * @return Boolean
 *   True if this is an OG notification message. False, otherwise ...
 */
function _og_notification_check_message($message) {
  $sid = 0;
  if (isset($message->notifications) && isset($message->notifications['subscriptions'])) {
    $params = current($message->notifications['subscriptions']);
    if (count($params) > 1) {

      // Check if "group" is one of the fields. This is a general presumption
      // that any subscription with at least two fields, one of them being a
      // group, is an OG subscription.
      $sid = db_result(db_query("SELECT sid FROM {notifications_fields} WHERE field = 'group' AND sid IN (" . db_placeholders($params) . ")", $params));
    }
  }
  return $sid > 0;
}

Functions

Namesort descending Description
og_notifications_form_alter Implementation of hook_form_alter().
og_notifications_grouptype_user_page Menu callback: Since the default notifications UI lists group and grouptype as separate entries, redirect the grouptype management link to the group management page.
og_notifications_help Implementation of hook_help().
og_notifications_menu Implementation of hook_menu().
og_notifications_message_alter A workaround to ensure that OG can provide custom message templates for notifications.
og_notifications_messaging Implementation of hook_messaging().
og_notifications_nodeapi Implementation of hook_nodeapi().
og_notifications_notifications Implementation of hook_notifications().
og_notifications_og Implementation of hook_og().
og_notifications_perm Implementation of hook_perm().
og_notifications_user Implementation of hook_user(). Handle uid entry in the og_notifications table.
og_notifications_user_autosubscribe Handle autosubscriptions for users when they join a group.
og_notifications_user_autosubscribe_get Retrieve autosubscription setting for a particular user. -1 in the og_notifications table indicates that the site default is to be used.
og_notifications_user_autosubscribe_set Retrieve autosubscription setting for a particular user.
og_notifications_user_page Menu callback: Group and grouptype subscription management form. This should ideally play nicer with notifications_user_form. However, due to issues with support for multi-field subscriptions, it is currently going about things in a roundabout manner.
og_notifications_user_page_submit Process og_notifications_user_page form submission.
og_notifications_user_subscribe Subscribe a user to a group or to be more precise, to all subscribe-able content types within the group. This method is also called during the upgrade process in .install.
og_notifications_user_unsubscribe Unsubscribe a user from a group. This also unsubscribes the user from any grouptype subscriptions within the group.
_og_notifications_node_options Options to display for node subscriptions.
_og_notifications_user_groups Retrieve a list of organic groups that a user is subscribed (via notifications) to.
_og_notifications_user_grouptypes Retrieve a list of organic group content types that a user is subscribed (via notifications) to.
_og_notification_check_message Helper function for og_notifications_message_alter. This function checks to see if the message object being passed is an OG notification.