You are here

subscriptions_taxonomy.module in Subscriptions 7

Same filename and directory in other branches
  1. 5.2 subscriptions_taxonomy.module
  2. 6 subscriptions_taxonomy.module

Subscriptions to taxonomy terms.

Subscriptions_taxonomy extends the subscription module to allow users to subscribe by taxonomy term. If a user subscribes to a term he will receive notifications each time a node is published to that taxonomy term. The user can also select to receive notifications when such a node is updated or commented.

File

subscriptions_taxonomy.module
View source
<?php

/**
 * @file
 * Subscriptions to taxonomy terms.
 *
 * Subscriptions_taxonomy extends the subscription module to allow users to
 * subscribe by taxonomy term. If a user subscribes to a term he will receive
 * notifications each time a node is published to that taxonomy term. The user
 * can also select to receive notifications when such a node is updated or
 * commented.
 */

/**
 * Implements hook_subscriptions().
 *
 * @param $op
 * @param null $arg0
 * @param null $arg1
 * @param null $arg2
 *
 * @return array|null
 *
 * @ingroup hooks
 */
function subscriptions_taxonomy_subscriptions($op, $arg0 = NULL, $arg1 = NULL, $arg2 = NULL) {
  static $stypes = array(
    'taxa' => array(
      'node',
      'tid',
    ),
  );
  $function = '_subscriptions_taxonomy_' . $op;
  if (function_exists($function)) {
    return $function($arg0, $arg1, $arg2);
  }
  switch ($op) {
    case 'queue':

      // $arg0 is $event array.
      if ($arg0['module'] == 'node') {
        $node = $arg0['node'];
        $params['node']['tid'] = array(
          'join' => array(
            'table' => 'taxonomy_index',
            'alias' => 'tn',
            'on' => db_driver() != 'pgsql' ? 's.value = tn.tid' : 's.value = CAST(tn.tid AS VARCHAR)',
          ),
          'where' => array(
            array(
              'tn.nid',
              $node->nid,
              '=',
            ),
          ),
          'groupby' => 'tn.nid',
        );
        if ($arg0['type'] == 'comment') {
          $params['node']['tid']['where'][] = array(
            's.send_comments',
            1,
            '=',
          );
        }
        elseif ($arg0['type'] == 'node' && $arg0['action'] == 'update') {
          $params['node']['tid']['where'][] = array(
            's.send_updates',
            1,
            '=',
          );
        }
        return $params;
      }
      break;
    case 'fields':

      // $arg0 is module.
      if ($arg0 == 'node' || $arg0 == 'comment') {
        $tr = 't';
        return array(
          'tid' => array(
            'data_function' => 'subscriptions_taxonomy_data',
            'subs_mod' => 'subscriptions_taxonomy',
            'subs_type' => $tr('category'),
            'mailkey' => 'node-type-',
          ),
        );
      }
      break;
    case 'stypes':
      return $stypes;
    case 'stype':
      return isset($stypes[$arg0]) ? array_merge($stypes[$arg0], array(
        $arg1,
        $arg2,
      )) : NULL;
  }
  return NULL;
}

/**
 * Implements _hook_node_options(), subhook of hook_subscriptions().
 *
 * This is called by subscriptions_ui_node_form() in subscriptions_ui.module.
 *
 * @param $account
 * @param $node
 *
 * @return array|null
 *
 * @ingroup form
 * @ingroup hooks
 *
 * @see subscriptions_ui_node_form()
 */
function _subscriptions_taxonomy_node_options($account, $node) {
  global $user;
  if (!user_access('subscribe to taxonomy terms')) {
    return NULL;
  }
  $options = array();
  $taxonomy_fields = field_read_fields(array(
    'type' => 'taxonomy_term_reference',
  ));

  /** @var $vids_to_omit array */
  $vids_to_omit = variable_get('subscriptions_omitted_taxa', array());
  foreach ($taxonomy_fields as $field_key => $field) {
    if (isset($node->{$field_key})) {
      if ($items = field_get_items('node', $node, $field_key)) {
        foreach ($items as $item) {
          $term = NULL;
          $hidden = array();
          $unavailable = '';
          if (!empty($item['taxonomy_term'])) {
            $term = $item['taxonomy_term'];
          }
          elseif (!empty($item['tid'])) {
            $term = taxonomy_term_load($item['tid']);
            if ($term->vid != variable_get('forum_nav_vocabulary', 0)) {

              // The field is hidden for this content type.
              if ($user->uid == 1) {
                $unavailable = ' ' . SUBSCRIPTIONS_UNAVAILABLE;
              }
              else {
                $hidden = array(
                  '#access' => FALSE,
                );
              }
            }
          }
          if ($term) {
            if (!in_array($term->vid, $vids_to_omit)) {
              $tid = $term->tid;
              $options['tid'][] = array(
                'name' => t('To content in %term', array(
                  '%term' => $term->name,
                )) . $unavailable,
                'params' => array(
                  'module' => 'node',
                  'field' => 'tid',
                  'value' => $tid,
                ),
                'link' => 'taxa/' . $tid,
              ) + $hidden;
              $options['tid'][] = array(
                'name' => t('To content in %term by %name', array(
                  '%term' => $term->name,
                  '%name' => format_username(user_load($node->uid)),
                )) . $unavailable,
                'params' => array(
                  'module' => 'node',
                  'field' => 'tid',
                  'value' => $tid,
                  'author_uid' => $node->uid,
                ),
                'link' => 'taxa/' . $tid . '/' . $node->uid,
              ) + $hidden;
              if ($field_key == 'taxonomy_forums') {

                // Move forum items to the top.
                array_unshift($options['tid'], array_pop($options['tid']));
                array_unshift($options['tid'], array_pop($options['tid']));
              }
              $options['tid']['weight'] = -1;
            }
          }
        }
      }
    }
  }
  return $options;
}

/**
 * Implements _hook_types(), subhook of hook_subscriptions().
 *
 * This is called by subscriptions_types() in subscriptions.module.
 *
 * @return array
 *   Returns information about types for Subscriptions module interface.
 *
 * @ingroup form
 * @ingroup hooks
 *
 * @see subscriptions_types()
 */
function _subscriptions_taxonomy_types() {
  $types['taxa'] = array(
    'title' => 'Categories',
    'page' => 'subscriptions_taxonomy_page_taxa',
    'fields' => array(
      'node',
      'tid',
    ),
    'weight' => -20,
    'access' => 'subscribe to taxonomy terms',
    'permission' => array(
      'title' => t('Subscribe to taxonomy terms'),
      'description' => t('Subscribe to the available taxonomy terms.'),
    ),
  );
  return $types;
}

/**
 * Implements hook_form_alter().
 *
 * Adds the Taxonomy Settings part to SUBSCRIPTIONS_CONFIG_PATH.
 *
 * @param array $form
 * @param array $form_state
 *
 * @ingroup hooks
 * @ingroup form
 */
function subscriptions_taxonomy_form_subscriptions_settings_form_alter(array &$form, array &$form_state) {
  _subscriptions_module_load_include('subscriptions_taxonomy', 'admin.inc');
  _subscriptions_taxonomy_form_subscriptions_settings_form_alter($form, $form_state);
}

/**
 * Returns a list of taxonomy subscriptions.
 *
 * @param array $form
 * @param int $uid
 *   ID of a user if >0 or of a role if <0.
 *
 * @return array
 *
 * @ingroup form
 */
function subscriptions_taxonomy_page_taxa(array $form, $uid) {

  // traverse the taxonomy tree
  $vocabularies = function_exists('taxonomy_help') ? taxonomy_get_vocabularies() : array();

  // omit undesired vocabularies from listing
  $omits = variable_get('subscriptions_omitted_taxa', array());
  foreach ($omits as $omit) {
    unset($vocabularies[$omit]);
  }
  if ($vocabularies) {
    _subscriptions_module_load_include('subscriptions_taxonomy', 'admin.inc');
    return _subscriptions_taxonomy_taxa_form($form, $uid, $vocabularies);
  }
  else {
    return array(
      array(
        '#markup' => t('There are no available category groups.'),
      ),
    );
  }
}

/**
 * Provides the data for resolving tokens.
 *
 * @param array $data
 * @param $node
 * @param array $subs
 */
function subscriptions_taxonomy_data(array &$data, $node, array $queue_item) {
  $data['subs']['category'] = taxonomy_term_load($queue_item['value']);
  subscriptions_content_data($data, $node, $queue_item);
}

/**
 * Implements hook_disable().
 *
 * Remove our queue items.
 *
 * @ingroup hooks
 */
function subscriptions_taxonomy_disable() {
  db_delete('subscriptions_queue')
    ->condition('module', 'node')
    ->condition('field', 'tid')
    ->execute();
}

/**
 * Implements hook_taxonomy_term_delete().
 *
 * Removes the corresponding records from the Subscriptions tables.
 */
function subscriptions_taxonomy_taxonomy_term_delete($term) {
  foreach (array(
    'subscriptions',
    'subscriptions_queue',
  ) as $table) {
    db_delete($table)
      ->condition('module', 'node')
      ->condition('field', 'tid')
      ->condition('value', $term->tid)
      ->execute();
  }
}

Functions

Namesort descending Description
subscriptions_taxonomy_data Provides the data for resolving tokens.
subscriptions_taxonomy_disable Implements hook_disable().
subscriptions_taxonomy_form_subscriptions_settings_form_alter Implements hook_form_alter().
subscriptions_taxonomy_page_taxa Returns a list of taxonomy subscriptions.
subscriptions_taxonomy_subscriptions Implements hook_subscriptions().
subscriptions_taxonomy_taxonomy_term_delete Implements hook_taxonomy_term_delete().
_subscriptions_taxonomy_node_options Implements _hook_node_options(), subhook of hook_subscriptions().
_subscriptions_taxonomy_types Implements _hook_types(), subhook of hook_subscriptions().