You are here

function rate_get_results in Rate 7

Same name and namespace in other branches
  1. 6.2 rate.module \rate_get_results()

Get results for a voting widget.

Parameters

string $content_type "node" or "comment":

int $content_id Node id (nid) or comment id (cid):

int $widget_id Widget id:

Return value

array

1 call to rate_get_results()
rate_generate_widget in ./rate.module
Generate a widget.

File

./rate.module, line 479
Rate module

Code

function rate_get_results($content_type, $content_id, $widget_id) {
  global $user;
  $widgets = variable_get(RATE_VAR_WIDGETS, array());
  $widget = $widgets[$widget_id];
  $criteria = array(
    'entity_type' => $content_type,
    'entity_id' => $content_id,
    'tag' => $widget->tag,
    'value_type' => $widget->value_type,
  );

  // Check if we should use the source translation.
  if ($widget->use_source_translation) {
    $criteria['entity_id'] = _rate_get_source_translation($criteria['entity_type'], $criteria['entity_id']);
  }
  $results = votingapi_select_results($criteria);
  $output = array(
    'count' => 0,
  );
  if ($widget->value_type != 'option') {

    // Set a default. Does not apply to options.
    $output['rating'] = 0;
  }
  if ($widget->value_type == 'option') {
    $output['options'] = array();
    foreach ($widget->options as $option) {
      $output['options'][$option[0]] = 0;
    }
  }
  foreach ($results as $result) {
    if ($widget->value_type == 'percent' && $result['function'] == 'average') {
      $output['rating'] = $result['value'];
    }
    elseif ($widget->value_type == 'points' && $result['function'] == 'sum') {
      $output['rating'] = $result['value'];
    }
    elseif ($result['function'] == 'count') {
      $output['count'] = $result['value'];
    }
    elseif (preg_match('/^option\\-([\\-0-9]+)$/', $result['function'], $match)) {
      $output['options'][$match[1]] = $result['value'];
      $output['count'] += $result['value'];
    }
  }

  // Check if this is a thumbs up / down voting, if so, calculate thumbs up / down percentages
  if ($widget->value_type == 'points' && count($widget->options) == 2) {

    // Votes down have a -1 value, votes up +1, $output['rating'] are the summed votes
    $output['down'] = (int) ($output['count'] - $output['rating']) / 2;
    $output['up'] = $output['count'] - $output['down'];
    if ($output['count'] == 0) {

      // If no one voted its 50-50
      $output['up_percent'] = 50;
    }
    else {
      $output['up_percent'] = (int) ($output['up'] * 100 / $output['count']);
    }
    $output['down_percent'] = 100 - $output['up_percent'];
  }
  $criteria += array(
    'uid' => $user->uid,
    'value_type' => $widget->value_type,
  );
  if (!$user->uid) {
    $criteria += array(
      'vote_source' => ip_address(),
    );
  }
  if ($user_vote = votingapi_select_votes($criteria)) {

    // Check the anonymous window. We should not display this vote when its anonymous and casted too long ago.
    $anonymous_window = variable_get('votingapi_anonymous_window', 86400);

    // Use a minimum of 5 seconds. Needed to get the anonymous vote directly after the user has voted.
    if ($anonymous_window != -1) {
      $anonymous_window = max(5, $anonymous_window);
    }
    if ($user->uid || $user_vote[0]['timestamp'] > REQUEST_TIME - $anonymous_window || $anonymous_window == -1) {
      $output['user_vote'] = $user_vote[0]['value'];
      if ($widget->value_type == 'option') {
        foreach ($widget->options as $option) {
          if ($option[0] == $user_vote[0]['value']) {
            $output['user_vote'] = $option[1];
          }
        }
      }
    }
  }
  return $output;
}