You are here

notifications_account.pages.inc in Notifications 7

User pages for Notifications

File

notifications_account/notifications_account.pages.inc
View source
<?php

/**
 * @file
 * User pages for Notifications
 */

/**
 * Menu callback. Overview page for user subscriptions.
 *
 * We create the page as a form so it can be altered
 *
 */
function notifications_account_overview($account) {
  $form['account'] = array(
    '#type' => 'value',
    '#value' => $account,
  );
  $path = 'user/' . $account->uid;

  // Status, send method, interval
  $count = db_query("SELECT status, COUNT(*) AS num FROM {notifications_subscription} WHERE uid = :uid GROUP BY status", array(
    ':uid' => $account->uid,
  ));
  $status_list = Notifications_Subscription::status_list();
  while ($current = $count
    ->fetchObject()) {
    $status[$current->status] = t('You have %count @status subscriptions.', array(
      '%count' => $current->num,
      '@status' => $status_list[$current->status],
    ));
  }
  if (empty($status)) {
    $status['none'] = t('You don\'t have any subscriptions yet.');
  }
  $send_intervals = notifications_send_intervals($account);
  $send_methods = notifications_send_methods($account);
  if ($method = notifications_user_setting('send_method', $account)) {
    if (isset($send_methods[$method])) {
      $status['method'] = t('Your default sending method for new subscriptions is @send_method', array(
        '@send_method' => $send_methods[$method],
      ));
    }
  }
  $interval = notifications_user_setting('send_interval', $account);
  if (isset($send_intervals[$interval])) {
    $status['interval'] = t('Your default sending interval for new subscriptions is @send_interval', array(
      '@send_interval' => $send_intervals[$interval],
    ));
  }
  $form['status'] = array(
    '#type' => 'item',
    '#weight' => 10,
    '#title' => t('Current status'),
    '#markup' => theme('item_list', array(
      'items' => $status,
    )),
  );

  // Build shortcut tips
  if (notifications_access_user($account, 'manage')) {
    $tips['admin'] = l(t('Administer your subscriptions'), "{$path}/notifications/subscription");
  }
  $tips['edit'] = l(t('Edit your notifications settings'), "{$path}/edit");

  // Enable / disable all subscriptions
  if (notifications_access_user($account, 'maintain')) {
    if (!empty($status[Notifications_Subscription::STATUS_ACTIVE])) {
      $tips['disable'] = l(t('Temporarily disable all your subscriptions'), "{$path}/notifications/update/disable");
    }
    if (!empty($status[Notifications_Subscription::STATUS_INACTIVE]) || !empty($status[Notifications_Subscription::STATUS_BLOCKED])) {
      $tips['enable'] = l(t('Enable all your subscriptions'), "{$path}/notifications/update/enable");
    }
  }

  /*
  $link = notifications_get_link('unsubscribe', array('uid' => $account->uid, 'destination' => TRUE));
  $tips['cancel'] = l(t('Cancel all your subscriptions'), $link['href'], $link['options']);
  */

  //$output .= theme('item_list', $tips, t('You can'));
  $form['tips'] = array(
    '#type' => 'item',
    '#weight' => 20,
    '#title' => t('You can'),
    '#markup' => theme('item_list', array(
      'items' => $tips,
    )),
  );
  return $form;
}

/**
 * Menu callback: user subscriptions management
 */
function notifications_account_manage_subscriptions_form($form, &$form_state, $account) {
  module_load_include('manage.inc', 'notifications');
  if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
    $list = Notifications_Subscription_List::build_sids(array_filter($form_state['values']['subscriptions']));
    return notifications_subscription_list_form($form, $form_state, 'delete', $list);
  }
  $form = notifications_manage_subscriptions_filter_form();
  $form['filters']['#title'] = t('Filter');

  // Display collapsed only when no filters set
  $form['filters'] += array(
    '#collapsible' => TRUE,
    '#collapsed' => empty($_SESSION['subscriptions_overview_filter']),
  );
  $form['#submit'][] = 'notifications_manage_subscriptions_filter_form_submit';
  $form['#theme'] = 'notifications_manage_subscriptions_filter_form';
  $form['admin'] = notifications_manage_subscriptions_form(array(
    'uid' => $account->uid,
  ));
  return $form;
}

/**
 * List form for subscriptions of the same type for a user
 *
 * @todo Add enable /disable operations
 * @todo Add pager
 *
 * @param $type
 *   Subscription type
 * @param $account
 *   User account, owner of these subscriptions
 * @param $subscriptions
 *   Predefined array of subscriptions to display, so we don't search more nor allow new ones.
 * @param $fields
 *   Predefined field values for new subscriptions, as type => value array
 */
function notifications_account_subscription_list_form($form, &$form_state, $type, $account) {
  if (isset($form_state['values']['op']) && $form_state['values']['op'] == t('Delete')) {
    if ($selected = array_filter($form_state['values']['subscriptions']['select'])) {
      $list = Notifications_Subscription_List::build_sids(array_keys($selected));
      return notifications_subscription_list_form($form, $form_state, 'delete', $list);
    }
  }
  $account = messaging_user_object($account);
  $substype = notifications_subscription($type);
  $form['account'] = array(
    '#type' => 'value',
    '#value' => $account,
  );
  $form['subscription_type'] = array(
    '#type' => 'value',
    '#value' => $type,
  );

  // Build a template subscriptions. These subscriptions should have a unique subscription variable field
  $form['info'] = array(
    '#type' => 'item',
    '#title' => t('@type subscriptions', array(
      '@type' => $substype
        ->get_title(),
    )),
    '#description' => check_plain($substype
      ->get_description()),
  );
  $subscriptions = new Notifications_Subscription_Table();
  $subscriptions
    ->set_header()
    ->set_conditions(array(
    'uid' => $account->uid,
    'type' => $type,
  ))
    ->query_load();
  $form['subscriptions'] = $subscriptions
    ->table_select();
  if (count($subscriptions)) {
    $form['operations'] = array(
      '#type' => 'fieldset',
    );
  }
  return $form;
}
function notifications_account_subscription_list_operations() {
  $form['operations']['update'] = array(
    '#type' => 'submit',
    '#value' => t('Update'),
  );
  $form['operations']['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
  );

  //$form['operations']['enable'] = array('#type' => 'submit', '#value' => t('Enable'));

  //$form['operations']['disable'] = array('#type' => 'submit', '#value' => t('Disable'));
}

/**
 * Submit list of subscriptions
 */
function notifications_account_subscription_list_form_validate($form, &$form_state) {
  $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : NULL;
  switch ($op) {
    case t('Add'):
      $save_fields = array();
      foreach ($form_state['values']['editable_fields'] as $field) {
        $type = $field->field;
        $key = 'field_' . $type;
        $value = isset($form_state['values']['subscriptions'][$key]['new']) ? $form_state['values']['subscriptions'][$key]['new'] : NULL;
        if ($real_value = notifications_field_real_value($type, $value)) {
          $save_fields[] = array(
            'type' => $type,
            'value' => $real_value,
          );
        }
        else {
          form_set_error("subscriptions][{$key}][new", t('You must set a valid value for this field.'));
        }
      }
      $form_state['values']['parsed_fields'] = $save_fields;
      break;
    case t('Delete'):
    case t('Enable'):
    case t('Disable'):

      // For this cases check only that we have selected some subscriptions
      $selected = array_filter($form_state['values']['subscriptions']['select']);
      if (isset($selected['new'])) {
        unset($selected['new']);
        unset($form_state['values']['subscriptions']['select']['new']);
      }
      if (!$selected) {

        //count($selected) < 1) {
        form_set_error('', t('You must select some subscriptions for that operation.'));
      }
      break;
  }
}

/**
 * Submit list of subscriptions
 */
function notifications_account_subscription_list_form_submit($form, &$form_state) {
  $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : NULL;
  $updated = 0;
  switch ($op) {
    case t('Add'):
      $subscription = Notifications_Subscription::build_object($form_state['values']['template']);
      $subscription
        ->add_fields($form_state['values']['parsed_fields']);
      notifications_account_subscription_list_form_values($form_state['values']['subscriptions'], $subscription, 'new');
      notifications_submit_subscription($subscription);
      break;
    case t('Update'):
      $updated = 0;
      foreach ($form_state['values']['current_subscriptions'] as $key => $subscription) {
        if (notifications_account_subscription_list_form_values($form_state['values']['subscriptions'], $subscription)) {
          $subscription
            ->save();
          $updated++;
        }
      }
      break;
    case t('Delete'):
      $form_state['rebuild'] = TRUE;
      break;
  }
  if ($updated) {
    drupal_set_message(format_plural($updated, 'One subscription has been updated.', '@count subscriptions have been updated.'));
  }
}

/**
 * Extract values from subscription list form
 */
function notifications_account_subscription_list_form_values($form_values, $subscription, $key = NULL) {
  $key = isset($key) ? $key : $subscription->sid;
  $values = array();
  foreach (array(
    'send_method',
    'send_interval',
    'status',
  ) as $field) {
    if (isset($form_values[$field][$key]) && (!isset($subscription->{$field}) || $subscription->{$field} != $form_values[$field][$key])) {

      // We just set the values that have changed and return them if any
      $subscription->{$field} = $values[$field] = $form_values[$field][$key];
    }
  }
  return $values;
}

/**
 * Bulk update all user subscriptions, confirmation form
 *
 * @param $account
 *   User account
 * @param $operation
 *   Operation to perform: enable, disable
 */
function notifications_account_update_subscriptions($form_state, $account, $operation) {
  $form['account'] = array(
    '#type' => 'value',
    '#value' => $account,
  );
  $form['operation'] = array(
    '#type' => 'value',
    '#value' => $operation,
  );
  $destination = 'user/' . $account->uid . '/notifications';
  $form['#redirect'] = $destination;
  if ($operation == 'enable') {
    return confirm_form($form, t('Are you sure you want to enable all your subscriptions?'), $destination, t('You will get notifications again for all of them.'), t('Enable'), t('Cancel'));
  }
  elseif ($operation == 'disable') {
    return confirm_form($form, t('Are you sure you want to disable all your subscriptions?'), $destination, t('You will stop getting notifications until you enable them again.'), t('Disable'), t('Cancel'));
  }
  else {
    drupal_access_denied();
  }
}

/**
 * Mass update user subscriptions
 */
function notifications_account_update_subscriptions_submit($form, $form_state) {
  $account = $form_state['values']['account'];
  switch ($form_state['values']['operation']) {
    case 'enable':

      // Enable also blocked subscriptions just in case there are some
      db_query('UPDATE {notifications_subscription} SET status = %d WHERE uid = %d', Notifications_Subscription::STATUS_ACTIVE, $account->uid);
      drupal_set_message(t('All your subscriptions have been enabled.'));
      break;
    case 'disable':
      db_query('UPDATE {notifications_subscription} SET status = %d WHERE status = %d AND uid = %d', Notifications_Subscription::STATUS_INACTIVE, Notifications_Subscription::STATUS_ACTIVE, $account->uid);
      notifications_queue()
        ->queue_clean(array(
        'uid' => $account->uid,
      ));
      drupal_set_message(t('All your subscriptions have been disabled.'));
      break;
  }
}

/**
 * Form for unsubscription confirmation
 *
 * It works for both single subscription or account (all subscriptions)
 */
function notifications_account_form_unsubscribe_confirm($form_state, $subscription, $account = NULL) {

  // Pass on subscription values
  $form['subscription'] = array(
    '#type' => 'value',
    '#value' => $subscription,
  );
  $form['account'] = array(
    '#type' => 'value',
    '#value' => $account,
  );
  if ($subscription) {
    $message = t('Are you sure you want to delete this subscription?');

    // The subscription description will be added here
    $form['info'] = $subscription
      ->form_info();
  }
  else {
    $message = t('Are you sure you want to remove all your subscriptions on this site?');
  }
  return confirm_form($form, $message, isset($_GET['destination']) ? $_GET['destination'] : '', t('This action cannot be undone.'), t('Unsubscribe'), t('Cancel'));
}

/**
 * Process unsubscribe form submission
 */
function notifications_account_form_unsubscribe_confirm_submit($form, &$form_state) {
  $subscription = $form_state['values']['subscription'];
  $account = $form_state['values']['account'];
  switch ($form_state['values']['op']) {
    case t('Unsubscribe'):
      if ($subscription) {
        Notifications_Subscription::delete_subscription($subscription->sid);
        drupal_set_message(t('Your subscription has been removed.'));
      }
      elseif ($account) {
        Notifications_Subscription::delete_multiple(array(
          'uid' => $account->uid,
        ));
        drupal_set_message(t('All your subscriptions have been removed.'));
      }
      $form_state['redirect'] = '';
      break;
    case t('Cancel'):

      // Do nothing, not worth showing a message, just get back
      $form_state['redirect'] = '';
      break;
  }
}

Functions

Namesort descending Description
notifications_account_form_unsubscribe_confirm Form for unsubscription confirmation
notifications_account_form_unsubscribe_confirm_submit Process unsubscribe form submission
notifications_account_manage_subscriptions_form Menu callback: user subscriptions management
notifications_account_overview Menu callback. Overview page for user subscriptions.
notifications_account_subscription_list_form List form for subscriptions of the same type for a user
notifications_account_subscription_list_form_submit Submit list of subscriptions
notifications_account_subscription_list_form_validate Submit list of subscriptions
notifications_account_subscription_list_form_values Extract values from subscription list form
notifications_account_subscription_list_operations
notifications_account_update_subscriptions Bulk update all user subscriptions, confirmation form
notifications_account_update_subscriptions_submit Mass update user subscriptions