You are here

function simplenews_roles_update_subscriptions in Simplenews Roles 7

Same name and namespace in other branches
  1. 5 simplenews_roles.module \simplenews_roles_update_subscriptions()
  2. 6.2 simplenews_roles.module \simplenews_roles_update_subscriptions()
  3. 6 simplenews_roles.module \simplenews_roles_update_subscriptions()

API function

A function that synchronizes users and newsletter categories according to user roles.

2 calls to simplenews_roles_update_subscriptions()
simplenews_roles_cron in ./simplenews_roles.module
Implements hook_cron().
simplenews_roles_newsletter_submit in ./simplenews_roles.module
Forms API callback; additional submit handler for newsletter form.

File

./simplenews_roles.module, line 140
Synchronize user subscriptions based on user roles membership.

Code

function simplenews_roles_update_subscriptions($tid, $rids = array()) {
  $sync_done = TRUE;
  if (is_array($rids) && !empty($rids)) {
    if (!in_array(DRUPAL_AUTHENTICATED_RID, $rids)) {
      $db_or = db_or();
      foreach ($rids as $rid) {
        $db_or
          ->condition('ur.rid', $rid);
      }

      // Unsubscribe query
      $auto_remove = variable_get('simplenews_roles_auto_remove', array());
      if (!isset($auto_remove[$tid]) || $auto_remove[$tid]) {

        // Define how many items to unsubscribe per each cron.
        $unsubscribe_limit = variable_get('simplenews_roles_unsubscribe_limit', 1000);
        $subquery = db_select('users', 'u');
        $subquery
          ->fields('u', array(
          'uid',
        ));
        $subquery
          ->leftJoin('users_roles', 'ur', 'ur.uid = u.uid');
        $subquery
          ->condition($db_or);
        $query = db_select('simplenews_subscriber', 'subscriber');
        $query
          ->fields('subscriber', array(
          'mail',
        ));
        $query
          ->leftJoin('simplenews_subscription', 'subscription', 'subscriber.snid = subscription.snid');
        $query
          ->condition('subscription.tid', $tid);
        $query
          ->condition('subscription.status', SIMPLENEWS_SUBSCRIPTION_ACTIVE);
        $query
          ->condition('subscriber.uid', $subquery, 'NOT IN');
        $query
          ->range(0, $unsubscribe_limit);
        $unsubscribe = $query
          ->execute();
        $i = 1;
        foreach ($unsubscribe as $account) {
          simplenews_unsubscribe_user($account->mail, $tid, FALSE, 'simplenews_roles');
          $i++;
        }
        if ($i > $unsubscribe_limit) {
          $sync_done = FALSE;
        }
      }
    }

    // Define how many items to subscribe per each cron.
    $subscribe_limit = variable_get('simplenews_roles_subscribe_limit', 1000);

    // Build subscribe query
    $subquery = db_select('simplenews_subscriber', 'subscriber');
    $subquery
      ->fields('subscriber', array(
      'uid',
    ));
    $subquery
      ->leftJoin('simplenews_subscription', 'subscription', 'subscriber.snid = subscription.snid');
    $subquery
      ->condition('subscription.tid', $tid);
    $subquery
      ->condition('subscription.status', SIMPLENEWS_SUBSCRIPTION_ACTIVE);
    $query = db_select('users', 'u');
    $query
      ->fields('u', array(
      'mail',
    ));
    $query
      ->leftJoin('users_roles', 'ur', 'ur.uid = u.uid');
    if (isset($db_or)) {
      $query
        ->condition($db_or);
    }
    $query
      ->condition('u.uid', 0, '>');
    $query
      ->condition('u.uid', $subquery, 'NOT IN');
    $query
      ->range(0, $subscribe_limit);
    $subscribe = $query
      ->execute();

    // Users to subscribe
    $i = 1;
    foreach ($subscribe as $account) {
      simplenews_subscribe_user($account->mail, $tid, FALSE, 'simplenews_roles');
      $i++;
    }
    if ($i > $subscribe_limit) {
      $sync_done = FALSE;
    }
  }
  return $sync_done;
}